28 lines
1.3 KiB
Swift
28 lines
1.3 KiB
Swift
import Foundation
|
||
import Network
|
||
|
||
// 触发本地网络权限弹窗(#5)。iOS 14+ 默认拒绝 App 访问本地网络;未授权时 WKWebView 内的
|
||
// WebRTC 收集不到 host 候选 → 同内网也退回 srflx / relay(慢、非直连)。WKWebView 自身不会
|
||
// 触发该权限请求,须由宿主 App 主动发起一次本地网络访问。这里启动一个对
|
||
// _commilitia-drop._tcp 的
|
||
// NWBrowser 浏览即触发系统弹窗;用户允许后,后续 RTCPeerConnection 才能收集本地 host / mDNS
|
||
// 候选实现直连。仅需触发一次;保持 browser 存活以维持授权态。project.yml 已声明
|
||
// NSLocalNetworkUsageDescription + NSBonjourServices(_commilitia-drop._tcp)。
|
||
enum LocalNetworkPermission
|
||
{
|
||
private static var browser: NWBrowser?
|
||
|
||
// 启动浏览以触发权限请求。幂等:已在浏览则不重复启。浏览结果本身不关心——「发起访问」这一
|
||
// 动作即触发系统授权弹窗。
|
||
static func trigger()
|
||
{
|
||
guard browser == nil else { return }
|
||
let params = NWParameters()
|
||
params.includePeerToPeer = true
|
||
let b = NWBrowser(for: .bonjour(type: "_commilitia-drop._tcp", domain: nil), using: params)
|
||
b.browseResultsChangedHandler = { _, _ in }
|
||
browser = b
|
||
b.start(queue: .main)
|
||
}
|
||
}
|