У меня есть вопрос о том, как настроить прослушиватель UDP на iOS 14. У меня есть прослушиватель UDP, который работал в прошлом, но после обновления до iOS 14 он работает спорадически / не работает вообще.
Он находится в NSObject и прослушивает широковещательную передачу UDP по локальной сети на порту 15000 (без определенного IP-адреса). Он использует библиотеку 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 для активации сетевых разрешений, а затем использовать мой код как есть? Кажется, это работает, но в лучшем случае кажется хакерским.
Заранее спасибо.