转:http://blog.csdn.net/kylinbl/article/details/8965074(KylinBL的专栏html
)ios
最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台之后,就接收不到消息了;服务器
怎么样才能使应用被切到后台时,应用中的网络链接仍然接收数据并维持存活(像QQ iphone 同样),下面一步一步来分析。网络
针对iOS应用的状态,存在如下三种状况:app
1)若iOS应用为活动状态,刚与服务器保持一个长链接,客户端与服务器经过此链接收发消息。
2)若iOS应用为退出状态,长链接被断开,服务器向客户端发消息则经过APNS推送消息实现。
3)若iOS应用刚刚切至后台,尚未关闭,发现长链接并无断开,服务器经过长链接向客户端发送消息仍是能发出去,可是iOS应用只有从新切至前台时才能收到消息。iphone
针对第三种状况,有下面的疑问:socket
iOS应用刚切至后台时,链接还保持着,此时客户端在后台是否能够收服务器来的消息,而后用本地通知来通知用户?若是能够的话应该怎么作?仍是说一旦切至后台,就必须经过APNS来通知用户?ide
结合苹果官方文档App Programming Guide里有关Background Execution and Multitasking的章节和satckoverflow对xmpp支持后台socket问题的解答,得出如下解决方法:测试
1.由于苹果只支持少数几咱类型的应用的代码能够在后台运行(例如:audio、location、voip等),因此须要在应用的(appname)-info.plist文件里,增长一个"Required background modes"的key,值设置为voip,来指定类型。ui
2.ios xmppframwork里已经有这方面的支持,只要初始化xmppstream时作下面设置便可:
下面作一下测试,看看效果如何。
先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代码:
真机测试,登陆后切换到后台状态,而后在电脑上用spark发一条消息到iphone上,状态栏翻出通知消息,基本成功实现了。
-------------------------------------------------------------------------------------------------------------------------------------------------
补充说明:
网上查资料时,发现一个问题,若是你的应用没有实现voip,若是按上面这种方法作,有被苹果reject的危险;那么替代方法就是当应用进入后台或是已经退出后,服务器端会根据用户状态的变化,发送消息给用户,同时使用苹果apns来推送新的消息通知给用户;但咱们知道,苹果的apns在即时性和可靠性方面都是不作保证的,也就是说新消息的通知传到苹果那边,苹果不保证能成功帮你推送,也不保证即时推送,因此只能找一下看有没有第三方的免费推送服务提供商。
Google了一下,找到个叫极光推送的免费推送,正在研究中,有收获在更新...
ps: 离线信息,须要一个长链接的,若是断开链接,怎样也 没法接收到信息,
http://stackoverflow.com/questions/5257580/iphone-xmpp-app-run-background