ios xmpp开发应用后台模式接收聊天信息
2013-05-23 15:32
288 查看
最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了;
怎么样才能使应用被切到后台时,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样),下面一步一步来分析。
针对iOS应用的状态,存在以下三种情况:
1)若iOS应用为活动状态,刚与服务器保持一个长连接,客户端与服务器通过此连接收发消息。
2)若iOS应用为退出状态,长连接被断开,服务器向客户端发消息则通过APNS推送消息实现。
3)若iOS应用刚刚切至后台,还没有关闭,发现长连接并没有断开,服务器通过长连接向客户端发送消息还是能发出去,但是iOS应用只有重新切至前台时才能收到消息。
针对第三种情况,有下面的疑问:
iOS应用刚切至后台时,连接还保持着,此时客户端在后台是否可以收服务器来的消息,然后用本地通知来通知用户?如果可以的话应该怎么做?还是说一旦切至后台,就必须通过APNS来通知用户?
结合苹果官方文档App Programming Guide里有关Background
Execution and Multitasking的章节和satckoverflow对xmpp支持后台socket问题的解答,得出以下解决方法:
1.因为苹果只支持少数几咱类型的应用的代码可以在后台运行(例如:audio、location、voip等),所以需要在应用的(appname)-info.plist文件里,增加一个"Required
background modes"的key,值设置为voip,来指定类型。
2.ios xmppframwork里已经有这方面的支持,只要初始化xmppstream时做下面设置即可:
下面做一下测试,看看效果如何。
先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代码:
真机测试,登录后切换到后台状态,然后在电脑上用spark发一条消息到iphone上,状态栏翻出通知消息,基本成功实现了。
-------------------------------------------------------------------------------------------------------------------------------------------------
补充说明:
网上查资料时,发现一个问题,如果你的应用没有实现voip,如果按上面这种方法做,有被苹果reject的危险;那么替代方法就是当应用进入后台或是已经退出后,服务器端会根据用户状态的变化,发送消息给用户,同时使用苹果apns来推送新的消息通知给用户;但我们知道,苹果的apns在即时性和可靠性方面都是不做保证的,也就是说新消息的通知传到苹果那边,苹果不保证能成功帮你推送,也不保证即时推送,所以只能找一下看有没有第三方的免费推送服务提供商。
Google了一下,找到个叫极光推送的免费推送,正在研究中,有收获在更新...
怎么样才能使应用被切到后台时,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样),下面一步一步来分析。
针对iOS应用的状态,存在以下三种情况:
1)若iOS应用为活动状态,刚与服务器保持一个长连接,客户端与服务器通过此连接收发消息。
2)若iOS应用为退出状态,长连接被断开,服务器向客户端发消息则通过APNS推送消息实现。
3)若iOS应用刚刚切至后台,还没有关闭,发现长连接并没有断开,服务器通过长连接向客户端发送消息还是能发出去,但是iOS应用只有重新切至前台时才能收到消息。
针对第三种情况,有下面的疑问:
iOS应用刚切至后台时,连接还保持着,此时客户端在后台是否可以收服务器来的消息,然后用本地通知来通知用户?如果可以的话应该怎么做?还是说一旦切至后台,就必须通过APNS来通知用户?
结合苹果官方文档App Programming Guide里有关Background
Execution and Multitasking的章节和satckoverflow对xmpp支持后台socket问题的解答,得出以下解决方法:
1.因为苹果只支持少数几咱类型的应用的代码可以在后台运行(例如:audio、location、voip等),所以需要在应用的(appname)-info.plist文件里,增加一个"Required
background modes"的key,值设置为voip,来指定类型。
2.ios xmppframwork里已经有这方面的支持,只要初始化xmppstream时做下面设置即可:
//允许后台模式(注意ios模拟器上是不支持后台socket的) xmppStream.enableBackgroundingOnSocket = YES;
下面做一下测试,看看效果如何。
先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代码:
//程序运行在前台,消息正常显示 if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive) { }else{//如果程序在后台运行,收到消息以通知类型来显示 UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertAction = @"Ok"; localNotification.alertBody = [NSString stringWithFormat:@"From: %@\n\n%@",@"test",@"This is a test message"];//通知主体 localNotification.soundName = @"crunch.wav";//通知声音 localNotification.applicationIconBadgeNumber = 1;//标记数 [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];//发送通知 }
真机测试,登录后切换到后台状态,然后在电脑上用spark发一条消息到iphone上,状态栏翻出通知消息,基本成功实现了。
-------------------------------------------------------------------------------------------------------------------------------------------------
补充说明:
网上查资料时,发现一个问题,如果你的应用没有实现voip,如果按上面这种方法做,有被苹果reject的危险;那么替代方法就是当应用进入后台或是已经退出后,服务器端会根据用户状态的变化,发送消息给用户,同时使用苹果apns来推送新的消息通知给用户;但我们知道,苹果的apns在即时性和可靠性方面都是不做保证的,也就是说新消息的通知传到苹果那边,苹果不保证能成功帮你推送,也不保证即时推送,所以只能找一下看有没有第三方的免费推送服务提供商。
Google了一下,找到个叫极光推送的免费推送,正在研究中,有收获在更新...
相关文章推荐
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接收聊天信息处理方案
- ios xmpp开发应用后台模式接收聊天信息
- ios xmpp开发应用后台模式接…
- xmpp后台模式接收聊天信息
- xmpp后台模式接收聊天信息
- iOS应用设计模式开发中对简单工厂和工厂方法模式的运用
- Android基于XMPP Smack openfire 开发的聊天室(二) 【聊天信息、成员】
- 仿微信/QQ 开发基于XMPP的iPhone/iOS聊天客户端(三)CoreData
- 解析iOS应用开发中对设计模式中的抽象工厂模式的实现
- XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)
- iOS开发- 蓝牙后台接收数据(BLE4.0)
- 仿微信/QQ 开发基于XMPP的iPhone/iOS聊天客户端(一)好友资料
- 实例讲解如何在iOS应用开发中使用设计模式中的代理模式