ios WiFi数据包延迟在真实的的iPhone,但不是模拟器

jchrr9hc  于 2023-01-27  发布在  iOS
关注(0)|答案(1)|浏览(107)

我正在开发一个应用程序,它可以连接到同一个本地WiFi网络上的一个设备。这个设备进行测量,并将数据传输到iPhone。iPhone真实的绘制数据。
我遇到的问题是iPhone每半秒左右延迟数据包200毫秒,这导致了UI明显的口吃,我想消除这种现象。
我通过在接收数据包时在代码中放置路标开始调试这个问题。
查看探查器,您可以很容易地看到数据中的差距。

放大间隔后的空间,可以看到接收到突发的数据包。

我已经检查过了,它没有丢弃任何数据包。它只是延迟了我的应用程序。
奇怪的是,这不是模拟器或Android版本应用程序的问题,所以我知道这不是设备或WiFi网络的问题。
下面是在模拟器上运行的相同代码,显示了更均匀的数据包分布。

有人经历过类似的事情吗?这只是iPhone硬件的某种电池节省限制吗?是否有任何方法可以确保数据更及时地传递到我的应用程序?
我试着用SwiftNIO重写连接,结果还是一样,我也试着把连接的serviceClass参数修改成所有可能的值,没有任何变化。
以下是相关的连接代码。

private func udpReceive() {
        if udpConnection?.state == .ready {
            udpConnection?.receive(minimumIncompleteLength: 1, maximumLength: Int(Hangboard.shared.BufferSize), completion: { content, contentContext, isComplete, error in
                os_signpost(
                    .begin,
                    log: log,
                    name: "udpReceive",
                    signpostID: signpostID
                )
                Task {
                    if let content = content {
                        let _ = await asyncResult(for: Hangboard.shared.udpDataReceivedNative(data: content.toKotlinByteArray(), offset: 0, length: Int32(content.count)))
                    }
                    os_signpost(
                        .end,
                        log: log,
                        name: "udpReceive",
                        signpostID: signpostID
                    )
                    self.udpReceive()
                }
            })
        } else {
            disconnect(hadError: true)
        }
    }
   
    private func startUdpListener(port: NWEndpoint.Port) {
        let params = NWParameters.udp
        params.allowFastOpen = true
        params.serviceClass = .responsiveData
        
        let listener = try? NWListener(using: params, on: port)
        self.udpListener = listener
        listener?.newConnectionLimit = 1
        listener?.newConnectionHandler = { connection in
            connection.parameters.serviceClass = .responsiveData
            self.startUdpConnection(connection: connection)
        }
        listener?.start(queue: .global(qos: .userInteractive))
    }
    
    private func startUdpConnection(connection: NWConnection) {
        self.udpConnection = connection
        connection.stateUpdateHandler = { state in
            switch state {
            case .ready:
                self.udpReceive()
            case .failed(let error):
                print("Connection error! \(error.localizedDescription)")
                self.disconnect(hadError: true)
            default:
                break
            }
        }
        connection.start(queue: .global(qos: .userInteractive))
    }
jm2pwxwz

jm2pwxwz1#

原来这样做的原因是因为我还在后台运行一个Bonjour搜索。
在连接时禁用搜索并在断开连接时重新启动它消除了延迟问题。
苹果的技术支持提到,当includePeerToPeer在连接上启用时,这可能是一个问题。

相关问题