Невозможно отправить UDP-трансляцию на устройство iOS - NWConnection - PullRequest
0 голосов
/ 25 марта 2020

У меня есть небольшое тестовое приложение 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")
                }
            }
        }
    }
}
...