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

转载 2015年07月07日 18:54:24

工程中使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)applicationDidEnterBackground:(UIApplication *)application{
 
    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
}

- (void)applicationDidEnterBackground:(UIApplication *)application{
 
    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
}



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

工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭...
  • junjun150013652
  • junjun150013652
  • 2014年08月16日 20:54
  • 5497

IOS 网络编程 + 后台保持连接

原文链接:http://blog.csdn.net/zj510/article/details/8935683 昨天在os x上写了个网络通信的小程序http://blog.csdn.net...
  • yang3wei
  • yang3wei
  • 2015年01月19日 14:58
  • 1128

iOS voip 后台保持长连接

最近项目出了点问题不得不重新认真地研究了这一块,顺便记录一下以方便以后查阅。 - (void) releaseStream { if (mReadStream) { ...
  • sanyue_dp
  • sanyue_dp
  • 2015年03月04日 08:48
  • 1393

iOS使用GCDSocketManager实现长连接

貌似进入2016年就没再更新简书,把写作忘了。罪过。 OK,进入正题,开始今天的技术讲解。 太概念的知识网上有很多,我只做概括和快速并正确的使用。 Socket,即使用套接字连接,实...
  • a787188834
  • a787188834
  • 2017年03月05日 17:43
  • 587

WebSocket原理及如何实现长连接

websocket相当于HTTP的一个补充协议,通过http request建立连接,不需要再发送request,之后保持一端与另外一端的TCP连接。 在实际应用中,一个socket与另外一端的连接...
  • qq_35447305
  • qq_35447305
  • 2016年10月29日 19:36
  • 1662

socket长连接的维持

长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的。 如果,长时间未发送维持连接包,服务端程序将断开连接。 客户端: 通过持有Client对象,可以随时(使用sendObj...
  • u011693260
  • u011693260
  • 2016年02月02日 10:47
  • 1457

Android应用与Java Web服务器保持Socket长连接

前言如果服务器需要知道应用当前的连接状态,包括手机网络状态的切换(Wifi和数据的转换),断开网络或者切换VPN网络等,那么这些情况,socket连接该如何处理? 下面简单说一下我的想法和遇到的坑!...
  • aiynmimi
  • aiynmimi
  • 2016年10月10日 11:05
  • 3156

iOS长连接Socket使用--AsyncSocket

SOCKET:TCP/IP网络的API。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出...
  • lgx_admin
  • lgx_admin
  • 2016年07月21日 17:13
  • 2018

Socket如何保证长连接

方法1:应用层自己实现的心跳包  由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中...
  • liaomengge
  • liaomengge
  • 2016年02月28日 17:25
  • 7170

最近做socket保持长连接的一些心得

来自:http://s.yanghao.org/program/viewdetail.php?i=2945 自己写的客户端马上要发布了,忽然发现了一大堆问题,主要集中在与服务器的TCP连接经常莫名断...
  • ArvinStudy
  • ArvinStudy
  • 2013年03月01日 12:18
  • 7055
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS后台如何保持socket长连接和数据传输
举报原因:
原因补充:

(最多只允许输入30个字)