iPhone XMPP应用程序后台运行

8

我使用XMPP框架创建了一款聊天应用程序,当我退出应用(进入后台模式)时,我希望能够接收到聊天消息,并显示图标徽章。请问如何实现这个功能?

3个回答

12

您确实可以通过将XMPP框架的应用程序称为VoIP应用程序,在iOS4中在后台运行它。(但是如果这个应用程序不真正执行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

如果您在后台运行,针对消息处理程序,您需要创建一个本地通知(您可以通过UIApplicationDidEnterBackgroundNotificationUIApplicationWillEnterForegroundNotification跟踪后台状态)。本地通知处理程序可以设置应用程序徽章数等(就像推送通知一样)。

编辑

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];
    }];
}

谢谢Jeff,这对我很有效...非常感谢:-) - Raj
控制没有进入“socketWillConnect:(AsyncSocket *)socket”方法。请帮忙。 - iphonedev23
只要您在XMPPStream对象上调用了addDelegate:,控制权就应该转到socketWillConnect:。请注意,自XMPPFramework 3以来,socketWillConenct:调用现在需要一个GCDAsyncSocket参数而不是AsyncSocket - Jeff Hay
@JeffHay,你有没有想法如何在不使用 VOIP 标志的情况下实现相同的功能呢?这对我解决问题非常有帮助。 - Jayeshkumar Sojitra
如果我在这里使用VOIP,那么该应用程序会被苹果拒绝吗? 或者根据您所说的以下行,它将被苹果批准。 CFReadStreamSetProperty([socket getCFReadStream],kCFStreamNetworkServiceType,kCFStreamNetworkServiceTypeVoIP); CFWriteStreamSetProperty([socket getCFWriteStream],kCFStreamNetworkServiceType,kCFStreamNetworkServiceTypeVoIP); - Chirag Lukhi

7

有一些程序可以在后台无限制地运行,这些包括VOIP程序、播放音乐的应用以及跟踪用户位置的应用。如果您没有合法地使用这些程序,则只能在后台运行10分钟。请注意,苹果将拒绝试图通过播放“空”声音来保持应用程序活动的应用。

您可以在此处找到关于在后台运行任务的信息: http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

我想您的另一种选择是通过联系服务器使聊天程序运行,并在用户离线时将响应排队,然后在下次登录时传递它们。作为一个非网络程序员,我不知道这是否可行,但我认为这是您唯一可以无限期地进行文本聊天的方式。更好的选择是使用上面的指南使您的应用程序具备VOIP功能。

编辑从iOS 5.0开始,还可以将应用程序注册为新闻亭应用程序,让其在后台下载信息,以及其他一堆仅适用于新闻亭的功能。

-Ash


首先感谢您的回复。我不想将此应用程序推送到App Store,而是使用IPA文件进行分发。我阅读了您提供的链接并在info.plist中添加了VOIP。需要在代码中进行更改吗?因为它仍然无法在后台工作。 - Raj
我觉得你只是匆匆浏览了我给你指的那份文件;要让它正常工作,你需要做的不仅仅是在info.plist中添加VOIP。请继续往下看,在“实现VOIP应用程序”部分有更详细的说明。 - Ash
我的应用程序被设置为基于位置的应用程序,但在后台运行3个小时后,它会从我的XMPP服务器断开连接。除了将info.plist设置为位置外,还有什么其他设置可以在xmppframework中设置,以便它永远不会断开连接? - subharb
我无法确定答案,但您可能需要确保应用程序断开连接的原因。这可能是服务器超时吗?是否存在内存问题导致设备终止应用程序的运行时? - Ash

5
在最新的XMPP框架中,您无需修改框架文件。只需按照以下步骤操作: 1. 将以下内容添加到您的连接方法中。
#if !TARGET_IPHONE_SIMULATOR
{
    self.xmppStream.enableBackgroundingOnSocket = YES;
}
#endif

2. 在您的info.plist文件中添加voip密钥:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接