iOS 后台保持长连接

工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题:

当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输:

解决方法:

通过设置以下属性可以保持socket连接和数据的继续传输

1.需要在Info.plist文件中添加UIBackgroundModes中的VOIP键值;

2.设置流属性

CFReadStreamRef和CFWriteStreamRef通过如下方法设置kCFStreamNetworkServiceType属性为kCFStreamNetworkServiceTypeVoIP;

CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

NSInputStream 和NSOutputStream通过如下方法设置NSStreamNetworkServiceType属性为NSStreamNetworkServiceTypeVoIP;

[self.stream setProperty: NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

3.这里有一个问题,就是客户端是通过心跳来和服务端保持连接,心跳是由定时器触发的,当我退到后台以后,定时器方法被挂起,那么通过如下设置来在后台运行定时器

 1 - (void)applicationDidEnterBackground:(UIApplication *)application{
 2
 3     UIApplication*   app = [UIApplication sharedApplication];
 4     __block    UIBackgroundTaskIdentifier bgTask;
 5     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
 6         dispatch_async(dispatch_get_main_queue(), ^{
 7             if (bgTask != UIBackgroundTaskInvalid)
 8             {
 9                 bgTask = UIBackgroundTaskInvalid;
10             }
11         });
12     }];
13     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
14         dispatch_async(dispatch_get_main_queue(), ^{
15             if (bgTask != UIBackgroundTaskInvalid)
16             {
17                 bgTask = UIBackgroundTaskInvalid;
18             }
19         });
20     });
21 }
时间: 2024-08-29 11:43:38

iOS 后台保持长连接的相关文章

iOS后台如何保持socket长连接和数据传输

工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输: 解决方法: 通过设置以下属性可以保持socket连接和数据的继续传输 1.需要在Info.plist文件中添加UIBackgroundModes中的VOIP键值: 2.设置流属性 CFReadStreamRef和CFWriteStreamRef通过如下方法设置kCFSt

[转] iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

? 转自:http://blog.csdn.net/missautumn/article/details/17102067 如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候基本上会被苹果Reject. 但是如果你的应用是企业内部发布的或者你只想了解其中的原理,那该文也许对您会有所帮助. 一.在iOS中如何应用VOIP VOIP程序需要稳定的网络去

iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候基本上会被苹果Reject. 但是如果你的应用是企业内部发布的或者你只想了解其中的原理,那该文也许对您会有所帮助. 一.在iOS中如何应用VOIP 大多数VOIP应用需要设置后台audio 应用去传递音频,因此你应该设置audio 和voip两个键值.如果只是想通过VOIP来达到socket在休眠状

android和IOS长连接区别

http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 首先我们必须知道,所有的推送功能必须有一个客户端和服务器的长连接,因为推送是由服务器主动向客户端发送消息,如果客户端和服务器之间不存在一个长连接那么服务器是无法来主动连接客户端的.因而推送功能都是基于长连接的基础是上的. IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然

iOS 后台运行实现 --备用

文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice c

iOS后台运行

我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间.还有三种类型的可以运行在后以,1.音乐2.location3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice curren

iOS后台运行机制简解

1.iOS其实是伪后台 为什么说iOS是伪后台?首先需要了解一下iOS中的后台进程到底是怎么回事.iOS中所谓的“后台驻留”并不是指执行中的程序,而是指最近使用过的程序.当我们是一个进程进入到后台的时候,可以想象成是Command+Tab键盘. 一般来说,当把一个app退到后台的时候都会有5s的时间执行缓冲,有些程序可以要求达到10分钟(这个是需要开发人员来决定的),因此在按下Home键之后,本来的程序就会退到后台中去,最多10分钟之后还是会被终止的,这当然和苹果的后台管理机制有关.   2.i

iOS 后台运行实现

iOS 后台运行的规则 应用的运行状态分为以下五种:Not running:应用还没有启动,或者应用正在运行但是途中被系统停止.Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码).一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态.唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电.有未读短信等)事件的时候.Active:当前应用正在前台运行,并且接收事件.这是应用正在前台运行时所处的正常状态Su

ios后台播放声音的三种实现方式

经常说安卓怎么苦逼,现在终于轮到IOS苦逼了. 安卓的应用在前台和后台一样像播放音乐就播放音乐,没人鸟你. IOS像后台播放声音就很苦逼了,因为IOS的应用切换到后台,应用会被挂起,非特别的应用不能在播放声音.经过不泄的努力终于找到3种解决方案. 1.把你的应用后台播放程序,新的XCODE勾选就可以,老版本的XCODE只有在*.plist文件中加属性值了.这个苹果审核很严,非后台播放程序,你设置了不会让你通过的. 使用后台播放声音测试: 当你的应用在正播放音乐时进入后台后,继续播放音乐. 当你的