You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS UDP:发送指令后无法通过Network库持续监听设备响应

iOS Network库持续接收数据问题排查

环境

  • 带摄像头的设备一台
  • iPhone一部

操作流程

  1. iPhone连接设备WiFi网络,通过NWPathMonitor获取网关(即设备IP)
  2. 向设备IP及指定端口(如192.168.5.1:12345)发送start指令:建立NWConnection后调用connection.send(content:completion:)发送数据
  3. 设备开始持续向该连接端口发送数据,但使用Apple Network库的connection.receiveMessage(completion:)仅能获取一次响应;尝试用NWListener监听,但因需先发送指令再监听的场景限制无法实现,即使在手机侧连接端口创建Listener并开启allowLocalEndpointReuse也无效
  4. 操作完成后需通过该socket发送stop指令

测试情况

使用Mac工具PacketSender发送start后,可正常接收所有响应直至发送stop

问题结论与解决方法

这不是Network库的限制,是操作疏漏。核心问题在于receiveMessage(completion:)的调用逻辑:该方法是单次触发单次返回的,若要持续接收数据,必须在每次接收完成的回调中再次调用receiveMessage,形成循环监听逻辑。

正确的持续接收实现示例:

func startContinuousReceiving() {
    connection.receiveMessage { content, context, isComplete, error in
        // 处理错误
        if let error = error {
            print("接收错误:\(error.localizedDescription)")
            return
        }
        
        // 处理接收到的数据
        if let data = content {
            let receivedString = String(data: data, encoding: .utf8)
            print("收到数据:\(receivedString ?? "")")
        }
        
        // 未断开连接则继续接收
        if !isComplete {
            self.startContinuousReceiving()
        }
    }
}

无需使用NWListener,因为你与设备已建立TCP连接(PacketSender默认使用TCP),设备是在同一个连接上持续推送数据,只要保持连接活跃并循环调用接收方法即可实现持续接收。

内容的提问来源于stack exchange,提问作者nikans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:12:44