如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像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人,我试了可都不止一天,还以为是其他哪不对……
分享到:
相关推荐
iOS系统为不同类型的后台任务提供了几种不同的执行模式,其中包括“音频、AirPlay和视频串流”、“VoIP”以及“后台fetching”等。对于TCP socket通信,我们可以利用"VoIP"或"Background fetch"模式。VoIP模式适用于...
1. **VOIP(Voice over IP)**:通过维持一个Socket连接,系统会在接收到数据时唤醒应用,但唤醒时间有限,一般不超过10秒。这适用于需要实时通信的应用。 2. **定位服务**:如果应用需要持续获取用户的位置信息,...
5. **多线程与异步**:iOS应用通常需要在后台线程执行Socket操作,以免阻塞主线程。可以使用GCD(Grand Central Dispatch)或NSOperationQueue来实现异步Socket通信。 6. **错误处理**:Socket编程中,错误处理是必...
VOIPSocket可以在后台运行。当程序进入后台时,事实上整个程序被暂停运行,但VOIPsocket因为受系统控制而不在此列。我的观察是,每次有新的数据来临时,程序会被唤醒并执行大约几秒钟,然后再次进入休眠。
- 如果在后台运行,需要在` UIBackgroundModes`中添加`voip`或`fetch`以保持Socket连接。 - 错误处理很重要,确保正确处理网络错误和数据解析错误。 7. **实践与学习资源** - 通过实际操作这个“ios socket demo...
本示例中,我们关注的是使用腾讯的库进行Socket通信的代码实践,特别适用于iOS后台开发。虽然提供的信息不包含上下游管理的代码,但我们可以深入探讨Socket通信的基本原理、腾讯库的使用以及在iOS环境下的应用。 ...
- iOS应用在后台运行时网络活动有限制,确保使用合适的后台模式(如`UIBackgroundModes`中的`voip`或`fetch`)。 - 考虑到网络延迟和丢包,合理设置超时和重试策略。 - 在生产环境中,要处理异常情况,确保数据...
在iOS平台上,这需要利用到苹果提供的多模态通信框架,如MultipeerConnectivity、PushKit以及VoIP等,确保数据的高效传输和低延迟。 其次,界面设计是模仿微信的关键部分。iOS应用的设计通常遵循Apple的Human ...
目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。主要包括以下几个部分:COMM:基础库,包括socket、线程、消息队列、协程等基础工具;XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、...