iOS: 如何在应用程序处于后台时保持 TCP 套接字和 NSNetService 工作

iOS: How to keep TCP socket and the NSNetService working when the App is in the background

我正在使用 GCDAsyncSocket、GCDAsyncUdpSocket 和 NSNetService 做一个 P2P VoIP 应用程序,以在网络上使用该应用程序查找其他设备。 我有一个 TCP 套接字来传输用户数据和协商 UDP 连接。

我需要在应用程序处于后台时保持 NSNetService 服务发布 Bonjour,并保持打开套接字以接收来自其他设备的请求。

按下iPhone的HOME键,套接字没有断开但没有响应,只有在重新打开应用程序时才会向应用程序发送数据。通过遮挡屏幕,关闭套接字。

应用程序关闭时要发布的 NSNetService。

我激活了后台 VoIP 应用程序、音频等选项

我用过

 [ asyncSocket performBlock : ^ {
        [ asyncSocket enableBackgroundingOnSocket ];
    }];

有人知道如何在 iPhone 被锁定时保持 Socket 和 NSNetService 工作吗?

我把我认为重要的地方加粗了。

来自苹果:https://developer.apple.com/library/ios/technotes/tn2277/_index.html#//apple_ref/doc/uid/DTS40010841-CH1-SUBSECTION15

VoIP 套接字 VoIP(IP 语音)应用程序需要持续 运行,以便它可以监控 VoIP 控制连接;但是,为了最大限度地减少对系统的内存影响,应用程序在处于非活动状态时会被挂起。 要实现此功能,应用程序必须将其控制连接的数据套接字注册为 VoIP 套接字。以这种方式注册的套接字有两个特点:

当应用挂起时,系统会代表应用监视套接字。如果有任何数据到达套接字,系统将恢复应用程序的执行(尽管是在后台),然后它可以从套接字读取数据并采取适当的操作(例如,通知用户有来电)。 永远不会回收套接字的资源。因此,可以安全地暂停该应用程序,而不必担心其套接字失聪。 有关如何创建 VoIP 应用程序的详细信息,请参阅 iOS 应用程序编程指南。

你也可以参考这个:How to Maintain VOIP socket connection in background?