美文网首页iOS即时通讯
IOS 后台执行代码(voip socket)

IOS 后台执行代码(voip socket)

作者: Levan_li | 来源:发表于2015-11-16 17:36 被阅读1659次

如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样);

其实按 IOS官方文档一步一步做就可以实现上述功能;

这里主要说一下我按文档遇到的问题,以及将原来的C/C++程序(主要是网络层)简单的修改一下就可以支持 IOS后台运行的方法.

1.在 xxxx Info.plist 添加 以支持 后台运行

UIBackgroundModes

voip

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才会在后台运行时接收数据

相关文章

  • IOS 后台执行代码(voip socket)

    如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样); 其实按 IOS官方文...

  • iOS PushKit的使用

      由于iOS 10禁止了VoIP类应用常驻后台的权限,导致Xcode 8 打包出来的VoIP类应用后台长连接失效...

  • 收藏博客

    iOS: iOS VOIP后台处理 python: tornado 翻译 tornado 框架 数据库: 数据库基...

  • iOS 8 pushkit使用总结

    最近项目要做关于voip业务,我们都知道苹果后台是一个假后台,当程序退出到后台时,socket是会断开连接,程序是...

  • iOS:PushKit的使用

    由于最近项目要做关于voip业务,所以在此做个记录:我们都知道当应用程序退出到后台时,socket是会断开连接,程...

  • iOS VoIP实践

    简介 PushKit是苹果在iOS8之后推出的新框架,iOS10之后,苹果更是禁止VOIP应用在后台使用socke...

  • iOS-app进入后台申请10分钟活跃时间

    IOS允许长时间在后台运行的情况有7种: audio VoIP GPS 下载新闻 和其它附属硬件进行通讯时 使用蓝...

  • iOS 后台运行VoIP 类APP

    转载文章来自: http://www.cnblogs.com/jhzhu/p/3416305.html苹果官方原文...

  • iOS socket保持后台连接 ios9.0 xcode8.0

    iOS socket保持后台连接 ios9.0 xcode8.0可以保持后台,但申请上架是肯定会被拒的 本教程是基...

  • 后台刷新了解一下

    当编写在后台执行的 iOS 代码时: 确定要使用哪个后台刷新 API。对于需要很多秒才能完成的网络请求,NSURL...

网友评论

  • macfai:你好,楼主,同楼上问,谢谢
  • JornyQi:后台模式使用voip,socket具体实现求指教?

本文标题:IOS 后台执行代码(voip socket)

本文链接:https://www.haomeiwen.com/subject/iskkhttx.html