У меня есть небольшое тестовое приложение Swift (SwiftUI iOS / OSX), из которого я пытаюсь отправить базовый c UDP-пакет.
У меня оно работает нормально при работе в симуляторе и в качестве Приложение OSX, но при запуске его на физическом iOS устройстве NWConnection зависает на .prepaing и никогда не идет дальше.
У меня есть com.apple.security.network.server и com.apple.network. клиентские права установлены.
Вот весь файл SceneDelegate swift, надеюсь, кто-нибудь увидит, что я тут не так сделал?
Спасибо!
import SwiftUI
import Foundation
import Network
var connection: NWConnection?
var hostUDP: NWEndpoint.Host = "239.1.2.4"
var portUDP: NWEndpoint.Port = 40001
struct ContentView: View {
@State var confirm = false
var body: some View {
VStack {
Button(action: {
self.confirm = true
}) {
Text("Alarm")
}.actionSheet(isPresented: $confirm){
ActionSheet(
title: Text("Sound the Alarm"),
message: Text("Are you Sure?"),
buttons: [
.cancel(Text("Cancel")),
.destructive(Text("Yes"), action: {
print("Sound the Alarm")
self.connectToUDP(hostUDP, portUDP)
})
]
)
}
}
}
func connectToUDP(_ hostUDP: NWEndpoint.Host, _ portUDP: NWEndpoint.Port) {
// Transmited message:
let messageToUDP = "ALARM"
connection = NWConnection(host: hostUDP, port: portUDP, using: .udp)
connection?.stateUpdateHandler = { (newState) in
print("This is stateUpdateHandler:")
switch (newState) {
case .ready:
print("State: Ready\n")
self.sendUDP(messageToUDP)
self.receiveUDP()
case .setup:
print("State: Setup\n")
case .cancelled:
print("State: Cancelled\n")
case .preparing:
print("State: Preparing\n")
default:
print("ERROR! State not defined!\n")
}
}
connection?.start(queue: .global())
}
func sendUDP(_ content: String) {
let contentToSendUDP = content.data(using: String.Encoding.utf8)
connection?.send(content: contentToSendUDP, completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in
if (NWError == nil) {
print("Data was sent to UDP")
} else {
print("ERROR! Error when data (Type: Data) sending. NWError: \n \(NWError!)")
}
})))
}
func receiveUDP() {
connection?.receiveMessage { (data, context, isComplete, error) in
if (isComplete) {
print("Receive is complete")
if (data != nil) {
let backToString = String(decoding: data!, as: UTF8.self)
print("Received message: \(backToString)")
} else {
print("Data == nil")
}
}
}
}
}