博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS后台如何保持socket长连接和数据传输
阅读量:5875 次
发布时间:2019-06-19

本文共 1472 字,大约阅读时间需要 4 分钟。

本文转载至 http://blog.csdn.net/zhangkongzhongyun/article/details/38678137 
工程中使用tcp长连接来和服务端进行数据传输,在
平台上,由于苹果的后台机制,会有以下问题:

当程序退到后台的时候,所有线程被挂起,会回收所有的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;
            
}
        
});
    
});
}
你可能感兴趣的文章
springmvc中controller内方法跳转forward?redirect?
查看>>
C#委托,事件理解入门 (译稿)转载
查看>>
容器的end()方法
查看>>
[转] Agile Software Development 敏捷软件开发
查看>>
HDU 1007 Quoit Design (最小点对,模板题)
查看>>
Windows Phone 7 自定义事件
查看>>
Objective-c 网址中带中文解决方法
查看>>
向函数传递数组的问题
查看>>
上班族的坐姿
查看>>
ubuntu 12.04 下面安装vmware workstation 8.0.4
查看>>
[原创]FineUI秘密花园(二十三) — 树控件概述
查看>>
【Java学习笔记】如何写一个简单的Web Service
查看>>
如何解决This system is not registered with RHN.
查看>>
Cocos2d-x学习笔记(两)Cocos2d-x总体框架
查看>>
拆解探索MagSafe电源接口结构和指示灯变颜色原理
查看>>
Android中EditText,Button等控件的设置
查看>>
lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点
查看>>
POJ 1915-Knight Moves (单向BFS && 双向BFS 比)
查看>>
java中在linux下利用jstack检测死锁
查看>>
linux编译安装LAMP
查看>>