我有一个关于如何在 iOS 14 上设置 UDP 侦听器的问题。我有一个 UDP 侦听器,该侦听器过去一直有效,但更新到 iOS 14 后,它偶尔有效/根本无效。
它位于 NSObject 中,并在端口 15000(无特定 IP 地址)上侦听本地网络上的 UDP 广播。它使用 CocoaAsyncSocket 库。当我打电话时setUpSocket()
本地网络权限未触发,但应用程序能够偶尔拾取 UDP 数据包。
var socket: GCDAsyncUdpSocket?
var broadcastPort: UInt16 = 15000
var broadcastAddress: String = ""
var connectAddress = ""
var connectPort = 0
func setUpSocket() {
findUDP()
let socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)
socket.setIPv4Enabled(true)
socket.setIPv6Enabled(false)
do {
try socket.bind(toPort: broadcastPort) /*15000*/
try socket.enableBroadcast(false)
try socket.beginReceiving()
} catch let error as NSError {
print("Issue with setting up listener \(error)")
}
}
/*Called when UDP packets are received.*/
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress: Data, withFilterContext filterContext: Any?) {
do {
let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as! [String : Any]
if (connected == false) {
if (jsonDictionary["Addresses"] != nil) {
if (jsonDictionary["Addresses"] is NSArray) {
let addresses = jsonDictionary["Addresses"] as! NSArray
for i in addresses {
let ipAddress:String = i as! String
if (ipAddress.range(of: "^([0-9]{1,3}\\.){3}[0-9]{1,3}(\\/([0-9]|[1-2][0-9]|3[0-2]))?$", options: .regularExpression) != nil) {
connectAddress = ipAddress
}
}
connectPort = jsonDictionary["Port"] as! Int
}
/*Sets up a TCP connection on the IP and Port provided in the UDP broadcast.*/
setupNetworkCommunication(ip: connectAddress, port: connectPort)
closeSocket()
}
}
} catch let error {
return print(error)
}
}
我如何更新它以符合 iOS 14?如果我需要更新以使用 Bonjour 服务,如何在不指定地址的情况下监听端口(并且无需查找特定的 Bonjour 服务广播,因为我正在查找的广播不使用 Bonjour)。
是否可以快速打开和关闭 Bonjour NWBrowser 以触发网络权限,然后按原样使用我的代码?这似乎有效,但充其量也显得很老套。
提前致谢。
以下是我们必须执行的步骤才能使用CocoaAsyncSocket
在我们的应用程序中使用 UDP:
-
向 Apple 请求多播授权(请求者必须是账户持有人团队的):com.apple.developer.networking.multicast https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_networking_multicast
-
在目标的Info.plist
,为以下键设置一个字符串:
隐私 - 本地网络使用说明
-
获得 Apple 的授权后,为以下键添加 true(1) 布尔值:*.entitlements
您的应用程序的文件(最后一步是我们无法接收 UDP 广播数据包的原因):
com.apple.developer.networking.multicast
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)