您确实可以通过将基于 XMPP 框架的应用程序称为 VoIP 应用程序来在 iOS4 中的后台运行该应用程序。 (However, 苹果将拒绝其从 App Store 上架,除非它也真正推出 VoIP).
您需要在应用程序的 (appname)-info.plist 文件中设置 VoIP 标志,然后在
(void)xmppStream:(XMPPStream *)sender socketWillConnect:(AsyncSocket *)socket
您需要设置套接字流标志以包括kCFStreamNetworkServiceTypeVoIP
:
CFReadStreamSetProperty([socket getCFReadStream], kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
CFWriteStreamSetProperty([socket getCFWriteStream], kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
然后,当新的 XMPP 消息到达时,您的应用程序将被短暂唤醒。在你正常的情况下
(void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
处理程序,如果您处于后台状态,您可能希望为该消息创建本地通知(您可以通过以下方式跟踪后台状态)UIApplicationDidEnterBackgroundNotification
and UIApplicationWillEnterForegroundNotification
)。本地通知处理程序可以设置应用程序徽章编号等(就像推送通知一样)。
EDIT
较新版本的 XMPP 框架(特别是 GCDAsyncSocket)现在支持调用以简化此操作,因此您可以:
- (void)xmppStream:(XMPPStream *)sender socketWillConnect:(GCDAsyncSocket *)socket
{
// Tell the socket to stay around if the app goes to the background (only works on apps with the VoIP background flag set)
[socket performBlock:^{
[socket enableBackgroundingOnSocket];
}];
}