`
linwwwei
  • 浏览: 223563 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IOS 后台执行代码(voip socket)

 
阅读更多
如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像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人,我试了可都不止一天,还以为是其他哪不对……
分享到:
评论
3 楼 15197442045 2014-06-16  
求demo,谢谢
2 楼 15197442045 2014-06-16  
我用了你这种方式,还是不能后台运行~~~~~
1 楼 wlpych 2013-01-28  
这个m_socket,从哪获得啊,什么方法?用的pjsip。求答复啊 . 多谢
:idea:         

相关推荐

    iOS后台运行的几种方式例子

    5. **持续执行(延长的后台执行)**:尽管iOS不鼓励无限后台运行,但开发者可以通过巧妙设计,如使用定位服务或音频播放来模拟无限后台。然而,Apple对这种行为有严格的审查,过度使用可能会导致应用被拒或被用户...

    iOS后台运行

    2. **后台执行模式(Background Execution)**:在某些特定情况下,如音频播放、定位服务或VoIP通话,iOS允许应用在后台持续运行。这些应用可以在后台保持活动状态,执行代码并更新内容。 3. **后台任务...

    delphi ios后台运行BackgroundFetchDemo

    `Background Fetch`是iOS提供的一种有限度的后台执行机制,它允许系统在认为设备连接到电源且网络可用时,唤醒应用执行一小段代码。这使得开发者可以定期更新应用的数据,但需要注意的是,系统会根据设备状态和用户...

    IOS-Socket通信实例代码

    本实例代码“IOS-Socket通信实例代码”提供了在iOS平台上使用Socket进行通信的具体实现,适用于创建例如智能家居控制等应用场景。 Socket通信的核心原理是基于TCP/IP协议栈,它在应用层与传输层之间提供了一个接口...

    OC-后台执行任务Processing

    在iOS开发中,后台执行任务是一项重要的技术,它允许应用程序在用户离开应用或者设备进入待机状态时继续处理一些必要的工作。"OC-后台执行任务Processing"这个主题主要涵盖的是Objective-C(OC)语言中如何在iOS环境...

    ios socket通信代码

    本文将深入探讨如何在iOS平台上使用Socket进行通信,主要基于提供的开源框架和代码示例。 一、Socket基础知识 Socket,也被称为套接字,是网络编程中的一个重要概念,它是两台计算机之间的通信端点。在TCP/IP协议栈...

    ios-socket在后台持续通信.zip

    首先,我们需要了解iOS的后台执行模式。iOS系统为不同类型的后台任务提供了几种不同的执行模式,其中包括“音频、AirPlay和视频串流”、“VoIP”以及“后台fetching”等。对于TCP socket通信,我们可以利用"VoIP"或...

    IOS 系统的后台持续定位

    6. **测试与调试**: 在实际设备上进行测试,确保应用在后台时仍能正常工作,同时注意观察电池消耗情况,优化代码以减少不必要的电池损耗。 总之,iOS后台持续定位是一项复杂的功能,需要开发者充分理解苹果的机制并...

    Java Server和android iOS Client Socket通讯代码示例

    使用Java 语言开发Socket Server,实现和android和iOS Socket client通讯的工程代码,数据可以使用TCP或UDP协议,通过文本,XML,Json,Base64及二进制传送,支持中文。

    ios后台运行

    在iOS平台上,应用程序的后台运行是一项关键特性,它允许用户在切换到其他应用或设备进入休眠状态时,某些特定任务仍然可以继续执行。标题"ios后台运行"和描述"ios后台长时间运行,退出后播放一个音频文件"揭示了...

    iOS后台定位实现代码

    本文将深入探讨如何在iOS应用中实现后台定位,并提供相关的代码实现。 首先,我们需要了解iOS对后台运行的限制。出于电池寿命和用户体验的考虑,iOS系统对后台应用的资源使用有严格的控制。然而,特定的功能如音乐...

    iOSAPP分析无用代码

    通过运行Analyzer,我们可以找出那些从未被执行的代码块。 2. **Clang-Tidy**:这是一款现代化的源代码检查工具,它提供了大量的检查规则,用于查找不符合编码规范、可能导致问题或者可以优化的代码。例如,我们...

    iOS 后台下载文件

    此外,还需要在`Info.plist`文件中添加`UIBackgroundModes`键,并设置其值为数组,包含`fetch`和`downloadContent`,以允许应用在后台执行这些操作。 总的来说,iOS 7引入的`NSURLSession`框架大大简化了后台下载...

    ios 后台一直运行 demo audio 服务

    通过以上所述,我们可以看到,实现"ios 后台一直运行 demo audio 服务"需要对iOS的后台执行机制、AVFoundation框架以及音频会话管理有深入的理解。这不仅涉及到技术实现,还包含了用户体验和苹果的政策规定,是一个...

    iOS完整程序代码

    13. **App生命周期和后台模式**:了解应用的启动、运行、暂停、恢复和终止过程,以及如何在后台执行任务。 14. **国际化和本地化**:如果代码包含多语言支持,你将学习到如何为应用添加不同的语言版本。 通过"森哥...

    ios混淆代码工具及垃圾代码生成器工具

    本文将详细解析标题"ios混淆代码工具及垃圾代码生成器工具"所涉及的知识点,并探讨如何在iOS项目中实施混淆策略以及添加垃圾代码来增强应用的安全性。 **一、iOS混淆** 1. **类名和方法名混淆**:混淆的核心是改变...

    ios 程序在后台运行的demo

    iOS后台模式主要有三种状态:挂起(Suspended)、后台执行(Background Execution)和声音/位置更新(Audio, AirPlay, and Voice over IP)。一般情况下,应用进入后台后会被立即挂起,但特定类型的App(如音乐...

    IOS后台例子

    iOS提供了有限的后台执行窗口,比如fetch、upload/download、有限的计时器任务等。使用 Background Modes Capabilities 在Xcode中启用相应权限,并在代码中使用合适的API来执行后台任务。 在实际开发中,必须谨慎...

    iOS如何保持程序在后台长时间运行

    1. **VOIP(Voice over IP)**:通过维持一个Socket连接,系统会在接收到数据时唤醒应用,但唤醒时间有限,一般不超过10秒。这适用于需要实时通信的应用。 2. **定位服务**:如果应用需要持续获取用户的位置信息,...

    Xamarin使用C#开发IOS程序-socket与突破3分钟后台运行限制

    B、ios由于是伪后台,当程序退回到后台,系统留给程序的可运行时间就只有3分钟。 过了3分钟,就会把这个程序的所有线程挂起(当然内部预留了长任务运行这一后招)。 经过多次试验后,可以借助着3分钟的长任务运行,...

Global site tag (gtag.js) - Google Analytics