iphone XMPP应用程序运行背景

iphone XMPP应用程序运行背景,iphone,objective-c,cocoa-touch,ios,xmpp,Iphone,Objective C,Cocoa Touch,Ios,Xmpp,我使用XMPP框架创建了一个聊天应用程序。当我退出该应用程序(进入后台模式)时,我想接收聊天信息。还需要显示图标徽章…我如何才能做到这一点?可以在后台无限制运行的程序数量有限,这些是VOIP程序,那些播放音乐的程序,还有那些跟踪用户位置的。如果你没有合法地进行这些操作,那么你只能在后台进行10分钟的操作。请注意,苹果将拒绝那些试图通过播放“空”音等愚蠢手段来保持应用程序运行的应用程序 您可以在此处找到有关后台运行任务的信息: 我猜您的另一个选择是让聊天程序通过联系服务器来运行,并在用户脱机时让

我使用XMPP框架创建了一个聊天应用程序。当我退出该应用程序(进入后台模式)时,我想接收聊天信息。还需要显示图标徽章…我如何才能做到这一点?

可以在后台无限制运行的程序数量有限,这些是VOIP程序,那些播放音乐的程序,还有那些跟踪用户位置的。如果你没有合法地进行这些操作,那么你只能在后台进行10分钟的操作。请注意,苹果将拒绝那些试图通过播放“空”音等愚蠢手段来保持应用程序运行的应用程序

您可以在此处找到有关后台运行任务的信息:

我猜您的另一个选择是让聊天程序通过联系服务器来运行,并在用户脱机时让服务器队列响应,然后在下次登录时发送响应。我自己不是一个网络程序员,我不知道这有多可行,但我认为如果你只提供文本聊天,这是唯一一种无限期实现这一目标的方法。更好的选择是使用上面的指南启用应用程序VOIP

从iOS 5.0发布之日起,还可以将应用程序注册为报摊应用程序,以便在后台下载信息,以及一系列其他仅限于报摊的时髦功能


-Ash

您确实可以在iOS4的后台运行基于XMPP框架的应用程序,方法是将其称为VoIP应用程序。(然而,苹果将拒绝将其从应用商店中删除,除非它也真正进行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
如果您是后台处理程序,则希望为消息创建本地通知(您可以通过
uiapplicationidenterbackgroundnotification
uiapplicationwillenterforeggroundnotification
跟踪后台状态)。本地通知处理程序可以设置应用程序标记号等(就像推送通知一样)

编辑

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

在最新的XMPP框架中,您不需要修改框架文件

只要这样做: 1.将此添加到您的connect方法中

#if !TARGET_IPHONE_SIMULATOR
{
    self.xmppStream.enableBackgroundingOnSocket = YES;
}
#endif
二,。将voip密钥添加到您的信息列表文件:


首先感谢您的重播..我不想将此应用推送到appstore。使用IPA文件分发..我阅读了您提供的链接并在info.plist中添加了VOIP..需要更多的代码更改..因为它在后台仍然不起作用..我想您已经浏览了我指给您的文档;您需要做的不仅仅是简单地将VOIP添加到info.plist中,以使其正常工作。进一步查看“实现VOIP应用程序”下的页面,我的应用程序设置为基于位置的应用程序,但在后台3小时后,它会断开与XMPP服务器的连接。除了将info.plist设置为位置之外,在xmppframework中是否还有其他设置使其永远不会断开连接?我无法确定这一点,但您可能需要确定您的应用程序断开连接的原因。可能是服务器超时吗?可能是内存问题导致设备终止应用程序的运行时吗?谢谢Jeff,这对我来说很好。非常感谢:-)控件不会使用“socketWillConnect:(AsyncSocket*)socket”方法。请帮助控制应转到socketWillConnect:只要您在XMPPStream对象上调用了addDelegate:。请注意,socketWillConenct:call现在需要的是GCDAsyncSocket*参数,而不是AsyncSocket*(从XMPPFramework 3开始)@JeffHay您知道如何在不使用VOIP标志的情况下实现相同的功能吗?如果我在这里使用VOIP,那么这个应用会被苹果拒绝吗?或者,它将由苹果公司批准,并按照您所说的,提及以下几行。CFReadStreamSetProperty([socket getCFReadStream],kCFStreamNetworkServiceType,kCFStreamNetworkServiceTypeVoIP);CFWriteStreamSetProperty([socket getCFWriteStream],kCFStreamNetworkServiceType,kCFStreamNetworkServiceTypeVoIP);