无法在 iOS 设备上发送 UDP 广播 - NWConnection

Posted

技术标签:

【中文标题】无法在 iOS 设备上发送 UDP 广播 - NWConnection【英文标题】:Unable to send UDP Broadcast on iOS Device - NWConnection 【发布时间】:2020-03-25 13:24:08 【问题描述】:

我有一个小型测试 Swift 应用程序 (SwiftUI ios/OSX),我正在尝试从中发送一个基本的 UDP 数据包。

在模拟器中运行并作为 OSX 应用程序时,它运行良好,但在物理 iOS 设备上运行时,NWConnection 会挂在 .prepaing 处,并且永远不会进一步。

我设置了 com.apple.security.network.server 和 com.apple.network.client 权利。

这是整个 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")
                
            
        
    

【问题讨论】:

【参考方案1】:

我猜您的 ios 设备正在搜索主机“239.1.2.4”但没有找到,因为它是您的计算机以外的其他 wifi 网络,可能在 LAN 中。

【讨论】:

以上是关于无法在 iOS 设备上发送 UDP 广播 - NWConnection的主要内容,如果未能解决你的问题,请参考以下文章

使用UDP广播检测网络上的多个设备-C#

android:udp广播

iOS- 移动端Socket UDP协议广播机制的实现

在 C# 中接收 UDP 广播消息

在 Windows 7 上发送 UDP 广播

Linux 上 C 中的 UDP 发送方和 Windows 上 Qt 中的接收方不起作用? [关闭]