IOS设备的后台运行资料收集
2013-03-05 20:04
429 查看
如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样);其实按 IOS官方文档一步一步做就可以实现上述功能;这里主要说一下我按文档遇到的问题,以及将原来的C/C++程序(主要是网络层)简单的修改一下就可以支持 IOS后台运行的方法.
1.在 xxxx Info.plist 添加 以支持 后台运行<key>UIBackgroundModes</key><array><string>voip</string></array>2.在 applicationDidEnterBackground 中设置存活回调(系统保证在600内会调用一次 //todo send keep live [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ //todo send keep live }];*注:这里最少600秒否则失败3. 在 applicationWillEnterForeground 中取消存活回调[[UIApplication sharedApplication] clearKeepAliveTimeout];
4. 创建 网络连接 ,这一步 可以按官方文档提供的三种方法全创建,并设置属性(如NSStreamNetworkServiceTypeVoIP.....)但这里 说一下移植原有 c/c++网络层的代码的会有两个问题:a>IOS并没有提到直接把一个存在的socket设置后台接收属性b>一般原有c/c++网络层的程序 很多会使用一个线程阻塞接收数据,而 ios里的流(NSStream) 如果阻塞read 过75秒后就超时,还不能更改这个值,而用IOS推荐的方式(Run-Loop)使用NSstream 又会改变程序结构(收到事件方式);
下面是解决方案,关键在用CFStreamCreatePairWithSocket 在已有的socket 上创建输入输出流CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocket(NULL, m_socket, &readStream, &writeStream); miStream = (NSInputStream *)readStream; moStream = (NSOutputStream *)writeStream; if(miStream == nil) return gloox::ConnStreamError; [miStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; [moStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; // [miStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // [moStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [miStream open];//这两句不写可能都能正常工作,我没试 [moStream open];//这两句不写可能都能正常工作,我没试
其实 上面的代码只做一件事,就是告诉IOS 在当前应用不在前台的时候 接管这个socket,其他的(原c/c++代码)都不动,该用socket recv就recv 该send就send,不用管miStream和mStream ,只是别忘了关闭连接的时候释放它们;*注这里会遇到个大问题,必须是真机 socket才会在后台运行时接收数据(用官方文档的方式实也一样),这个害S人,我试了可都不止一天,还以为是其他哪不对……
参考http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
转自:http://blog.sina.com.cn/s/blog_000028810100wa8x.html
1.在 xxxx Info.plist 添加 以支持 后台运行<key>UIBackgroundModes</key><array><string>voip</string></array>2.在 applicationDidEnterBackground 中设置存活回调(系统保证在600内会调用一次 //todo send keep live [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ //todo send keep live }];*注:这里最少600秒否则失败3. 在 applicationWillEnterForeground 中取消存活回调[[UIApplication sharedApplication] clearKeepAliveTimeout];
4. 创建 网络连接 ,这一步 可以按官方文档提供的三种方法全创建,并设置属性(如NSStreamNetworkServiceTypeVoIP.....)但这里 说一下移植原有 c/c++网络层的代码的会有两个问题:a>IOS并没有提到直接把一个存在的socket设置后台接收属性b>一般原有c/c++网络层的程序 很多会使用一个线程阻塞接收数据,而 ios里的流(NSStream) 如果阻塞read 过75秒后就超时,还不能更改这个值,而用IOS推荐的方式(Run-Loop)使用NSstream 又会改变程序结构(收到事件方式);
下面是解决方案,关键在用CFStreamCreatePairWithSocket 在已有的socket 上创建输入输出流CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocket(NULL, m_socket, &readStream, &writeStream); miStream = (NSInputStream *)readStream; moStream = (NSOutputStream *)writeStream; if(miStream == nil) return gloox::ConnStreamError; [miStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; [moStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; // [miStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // [moStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [miStream open];//这两句不写可能都能正常工作,我没试 [moStream open];//这两句不写可能都能正常工作,我没试
其实 上面的代码只做一件事,就是告诉IOS 在当前应用不在前台的时候 接管这个socket,其他的(原c/c++代码)都不动,该用socket recv就recv 该send就send,不用管miStream和mStream ,只是别忘了关闭连接的时候释放它们;*注这里会遇到个大问题,必须是真机 socket才会在后台运行时接收数据(用官方文档的方式实也一样),这个害S人,我试了可都不止一天,还以为是其他哪不对……
参考http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
转自:http://blog.sina.com.cn/s/blog_000028810100wa8x.html
相关文章推荐
- iOS app 后台运行利用本地推送处理蓝牙设备通讯指令
- 常用代码:收集设备信息+有无SD卡+软键盘+Home,后台运行+状态栏高度+标题栏(ActionBar)高+SIM卡+网路
- 定期iOS的后台位置更新-- 相关资料收集,待有时间进行整理
- Hacking EV3系列之一:自编iOS app控制EV3之资料收集与分析
- iOS开发笔记--iOS 无限后台运行
- iOS应用后台运行GPS定位功能的实现
- iOS资料大全收集
- iOS后台运行程序(一)——location
- IOS、Andriod、WP8 三大系统后台运行及消息推送机制
- iOS实现长时间后台运行
- ios后台运行程序
- ios后台长时间运行
- 让iOS程序长久在后台运行
- IOS后台运行机制详解(二)
- iOS 4程序直接退出不在后台运行的方法
- iOS后台运行机制-实践总结
- 苹果IOS,与windows Phone7,系统,内存,CPU处理,及后台程序运行,详解微软墓碑机制的系统
- iOS开发之直播App流程介绍,直播资料收集汇总,视频推流,视频拉流,SMTP、RTMP、HLS、 PLPlayerKit
- IOS开发模块总结(二)后台运行程序(1) 后台运行程序详解(二)