IOS 后台执行代码(voip socket)
来源:互联网 发布:氟锑酸 知乎 编辑:程序博客网 时间:2024/06/16 12:46
如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像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 ,只是别忘了关闭连接的时候释放它们;
其实按 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://linwwwei.iteye.com/blog/1433189
0 0
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket) .
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- IOS 后台执行代码(voip socket)
- ios 后台执行代码
- voip socket 后台长连接
- 【转】ios voip应用退到后台的参考文章一篇 -------IOS开发之----详解在IOS后台执行
- iOS后台保持连接,使用VOIP Socket方式,上传App Store会被拒绝么?
- ios 通过VOIP 实现后台操作
- iOS Voip 后台运行的原理
- iOS Voip 后台运行的原理
- iOS Voip 后台运行的原理
- cocoa pods 安装,使用教程
- 遗传算法详解(GA)(个人觉得很形象,很适合初学者)
- 不走弯路之Android开发高薪就业指导
- Android 动态添加Fragment
- RTMP 封包详解
- IOS 后台执行代码(voip socket)
- 欧洲议会将举办区块链和虚拟货币速成班
- Android实战技巧:深入解析AsyncTask
- 嵌入式企鹅圈导读-顶级原创团队、专栏介绍和历史文章汇总
- SVN 和 Git 在日常使用中的明显差异
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序
- Launcher与开机广播,究竟谁先起
- Oracle查询一批数据,某字段的内容有重复数据,怎样取相同的记录中时间最近的一条
- 232. Implement Queue using Stacks