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 网络编程 + 后台保持连接

原文链接:http://blog.csdn.net/zj510/article/details/8935683 昨天在os x上写了个网络通信的小程序http://blog.csdn.net...

java socket 连接数据传输判断是否结束

Java当中的Socket类,其实是使用TCP协议进行传输的.TCP是可靠的一种传输协议.  如果想用TCP协议,并且,服务端和客户端,在没有信息进行传输的时候,也不断开连接,一般情况下,客户端...
  • yaohonv
  • yaohonv
  • 2011年09月04日 00:37
  • 8584

前端、后台和连接前端后台的网络数据传输

前端: 主要是围绕浏览器的工作展开,包括浏览器处理用户的交互、发送网络请求、收到网络响应之后的处理与渲染等等。 第一块“处理用户的交互”,浏览器本身与用户的交互基本不涉及网络知识,但W...

数据传输c/s socket演示(部分未完成)

  • 2011年09月29日 15:08
  • 6.02MB
  • 下载

通用 Socket 数据传输构架

  • 2016年06月23日 17:26
  • 21.59MB
  • 下载

spring httpInvoker中前后台byte[]数据传输

目的:在后台使用GZIP的格式压缩内存中的数据,传输到前台在进行解压缩 机制:java的GZIPInputStream 过程: 1:修改接口,返回一个byte数组    /...
  • wyt4455
  • wyt4455
  • 2013年03月30日 09:23
  • 596

java测试httprequest(为手游开发后台数据传输做准备)

1.测试类 package net; import java.io.BufferedReader; import java.io.IOException; import java.io.Input...

前后台的网络数据传输

摘要: 主要是围绕浏览器的工作展开,包括浏览器处理用户的交互、发送网络请求、收到网络响应之后的处理与渲染等等 前端: 主要是围绕浏览器的工作展开,包括浏览器处理用户的交互、发送网络请求...

【DWR】学习笔记(一):基本配置&&前后台的数据传输与处理

利用DWR实现ajax,本文给出了dwr基本配置/测试/前后台传输处理数据的一个简单范例,并给出了每一步的详细过程与实现代码,适合新手学习使用;跟着博文一步步来,一定可以实现;有问题可以留言,我会尽快...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS后台如何保持socket长连接和数据传输
举报原因:
原因补充:

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