IOS 后台执行代码(voip socket)

转载自:http://blog.sina.com.cn/s/blog_000028810100wa8x.html

如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样);
其实按 IOS官方文档一步一步做就可以实现上述功能;
这里主要说一下我按文档遇到的问题,以及将原来的C/C++程序(主要是网络层)简单的修改一下就可以支持IOS后台运行的方法.

1.在  xxxx  Info.plist添加 以支持 后台运行
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
</array>
2.在  applicationDidEnterBackg round中设置存活回调(系统保证在600内会调用一次   //todosend keep live
 [[UIApplicationsharedApplication] setKeepAliveTimeout:600 handler:^{ //todo sendkeep 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上创建输入输出流
CFReadStreamRefreadStream;
       CFWriteStreamRefwriteStream;
      CFStreamCreatePairWithSocket(NULL, m_socket, &readStream,&writeStream);
       miStream = (NSInputStream*)readStream;
       moStream = (NSOutputStream*)writeStream;      
      
       if(miStream ==nil)
          returngloox::ConnStreamError;
       [miStreamsetProperty:NSStreamNetworkServiceTypeVoIPforKey:NSStreamNetworkServiceType];
       [moStreamsetProperty:NSStreamNetworkServiceTypeVoIPforKey:NSStreamNetworkServiceType];
      
      // [miStreamscheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
     //  [moStreamscheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
       [miStreamopen]; //这两句不写可能都能正常工作,我没试
       [moStreamopen]; //这两句不写可能都能 正常工作,我没试

其实 上面的代码只做一件事,就是告诉IOS 在当前应用不在前台的时候接管这个socket,
其他的(原c/c++代码)都不动,该用socket recv就recv 该send就send,不用管
miStream和 mStream  ,只是别忘了关闭连接的时候释放它们;
*注这里会遇到个大问题,必须是真机socket才会在后台运行时接收数据(用官方文档的方式实也一样),这个害S人,我试了可都不止一天,还以为是其他哪不对……


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值