1

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

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

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

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

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

我用了

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

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

4

1 回答 1

1

我将我认为重要的部分加粗。

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

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

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

您也可以参考:如何在后台维护 VOIP 套接字连接?

于 2015-08-04T18:19:26.593 回答