转:http://blog.csdn.net/kylinbl/article/details/8965074(KylinBL的专栏

最近在使用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时做下面设置即可:

[cpp] view plaincopyprint?
  1. //允许后台模式(注意ios模拟器上是不支持后台socket的)
  2. xmppStream.enableBackgroundingOnSocket = YES;

下面做一下测试,看看效果如何。

先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代码:

[cpp] view plaincopyprint?
  1. //程序运行在前台,消息正常显示
  2. if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)
  3. {
  4. }else{//如果程序在后台运行,收到消息以通知类型来显示
  5. UILocalNotification *localNotification = [[UILocalNotification alloc] init];
  6. localNotification.alertAction = @"Ok";
  7. localNotification.alertBody = [NSString stringWithFormat:@"From: %@\n\n%@",@"test",@"This is a test message"];//通知主体
  8. localNotification.soundName = @"crunch.wav";//通知声音
  9. localNotification.applicationIconBadgeNumber = 1;//标记数
  10. [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];//发送通知
  11. }

真机测试,登录后切换到后台状态,然后在电脑上用spark发一条消息到iphone上,状态栏翻出通知消息,基本成功实现了。

-------------------------------------------------------------------------------------------------------------------------------------------------

补充说明:

网上查资料时,发现一个问题,如果你的应用没有实现voip,如果按上面这种方法做,有被苹果reject的危险;那么替代方法就是当应用进入后台或是已经退出后,服务器端会根据用户状态的变化,发送消息给用户,同时使用苹果apns来推送新的消息通知给用户;但我们知道,苹果的apns在即时性和可靠性方面都是不做保证的,也就是说新消息的通知传到苹果那边,苹果不保证能成功帮你推送,也不保证即时推送,所以只能找一下看有没有第三方的免费推送服务提供商。

Google了一下,找到个叫极光推送的免费推送,正在研究中,有收获在更新...

ps: 离线信息,需要一个长连接的,如果断开连接,怎样也 无法接收到信息,

http://stackoverflow.com/questions/5257580/iphone-xmpp-app-run-background

转载于:https://www.cnblogs.com/guligei/p/3517420.html

处理xmpp 离线信息,相关推荐

  1. ASP.net 2.0下应用程序离线信息

    ASP.net 2.0 有一个新特性,就是支持应用程序离线信息. 什么是离线信息呢?以前我们在更新应用程序,导至asp.net应用程序重启,应用程序的用户通常会显示不友好的错误信息,或者IE一直显示加 ...

  2. Google talk又进一步!支持发送离线信息!

    Google talk终于正式支持了发送离线信息! 从支持文件传送到支持语音功能,到现在支持发送离线信息,这都是Gtalk的进步! 当然呢,如果与QQ相比,这些的确是来得慢了点.. 实现发送离线功能的 ...

  3. 通达OA 一次升级引发的即时通讯工具不能接收离线信息的血案

    今天上午,有工作新的进展需要跟领导沟通,就在OA上用精灵发了一条信息,因为领导显示离线状态,这就是一条离线信息,离线信息也没问题登陆后也可以看到. 过了1个多小时之后,领导打电话过来问我刚才说的工作的 ...

  4. XMPP个人信息展示

    在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...

  5. 图表显示日志离线信息

    关注公众号:分享电脑学习 回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 云盘目录说明: tools目录是安装包 res 目录是每一个课件对应的代码和资源等 doc ...

  6. Android使用XMPP框架实现即时聊天(IM)功能(Openfire + Smack)

    目录 概述 前期准备 客户端使用Smack 权限配置.压缩包导入等 客户端连接到服务器 用户注册/登录功能 离线消息接收 接收/发送消息 后记 概述 即时聊天功能是许多APP的刚需.QQ.微信等用的都 ...

  7. XMPP中文 XEP-0060: 发布-订阅(二)

    例子 130. 实体请求一个即时节点 <iq type='set'from='hamlet@denmark.lit/elsinore'to='pubsub.shakespeare.lit'id= ...

  8. ios xmpp 发送语音图片解决方案

    http://www.cnblogs.com/yulang314/p/3705611.html ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项 ...

  9. 【※用QQ撤回离线文件测试好友是否隐身※偏方】系统收藏

    [※用QQ撤回离线文件测试好友是否隐身※偏方]系统收藏 如果QQ好友不在线但我们又需要向对方发送文件,一般都会选用"离线发送文件"功能,QQ会将文件上传到服务器中并为对方保留七天, ...

最新文章

  1. 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?
  2. java反射api研究_深入研究Java 8中的可选类API
  3. JavaScript DOM介绍
  4. tomcat日志详情
  5. HTTP协议之HTTP的结构
  6. Django练习——TodoList
  7. c++语言 xml数据绑定技术简介
  8. centos 7 下使用dvorak键盘布局
  9. Why not inherit from ListT?
  10. JavaScript 基础一
  11. 装机软件备忘、分类介绍 评点
  12. html下划线输入框自动延伸,纯CSS实现从中间延展的下划线
  13. 前端解决图片404的问题
  14. 总体和个体,样本和样本值
  15. java number比较大小_JAVA Number与Math类
  16. MySql创建联合索引
  17. cpu设计和实现(流水线上的第一条指令)
  18. go语言打包生成更小的体积
  19. Android学习之Ubuntu12.04
  20. 数字图像的一阶微分和二阶微分

热门文章

  1. pgsql 两个时间字段相减_如何在Excel做专业的时间序列分析
  2. 13.PHP_ThinkPHP
  3. 【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
  4. 【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)
  5. 【Visual Studio 2019】创建 MFC 桌面程序 ( 安装 MFC 开发组件 | 创建 MFC 应用 | MFC 应用窗口编辑 | 为按钮添加点击事件 | 修改按钮文字 | 打开应用 )
  6. 【DBMS 数据库管理系统】多维数据模型 ( 星型模式 | 雪片模型 | 事实群模型 | 度量 | 分布型 | 代数型 | 整体型 )
  7. 【设计模式】外观模式 ( 概念 | 适用场景 | 优缺点 | 代码示例 )
  8. clipboard_monitor_in_win7
  9. AI零基础入门之人工智能开启新时代—下篇
  10. Servlet组件之一——Filter过滤器