其实按
IOS官方文档一步一步做就可以实现上述功能;
这里主要说一下我按文档遇到的问题,以及将原来的C/C++程序(主要是网络层)简单的修改一下就可以支持IOS后台运行的方法.
Info.plist添加 以支持 后台运行
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
</array>
*注:这里最少600秒否则失败
3.在 applicationWillEnterFore ground
中取消存活回调
[[UIApplication sharedApplication]clearKeepAliveTimeout];
4. 创建 网络连接,这一步 可以按官方文档提供的三种方法全创建,并设置属性(如NSStreamNetworkServiceTy
peVoIP.....)
但这里说一下移植原有 c/c++网络层的代码的会有两个问题:
a>IOS并没有提到直接把一个存在的socket设置后台接收属性
b>一般原有c/c++网络层的
程序 很多会使用一个
线程阻塞接收数据,而 ios里的流(NSStream)如果阻塞read 过75秒后就超时,还不能更改这个值,而用IOS推荐的方式(Run-Loop)使用NSstream又会改变程序结构(收到事件方式);
CFReadStreamRefreadStrea
m;
其实 上面的代码只做一件事,就是告诉IOS 在当前应用不在前台的时候接管这个socket,
其他的(原c/c++代码)都不动,该用socket recv就recv 该send就send,不用管
miStream和mStream
,只是别忘了关闭连接的时候释放它们;
*注这里会遇到个大问题,必须是真机socket才会在后台运行时接收数据(用官方文档的方式实也一样),这个害S人,我试了可都不止一天,还以为是其他哪不对…