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

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

本文转载至 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;
            
}
        
});
    
});
}

转载于:https://www.cnblogs.com/Camier-myNiuer/p/4176649.html

你可能感兴趣的文章
303. Range Sum Query - Immutable
查看>>
迪杰斯特拉算法---单源点最短路径
查看>>
【python】TCP/IP编程
查看>>
JVM 类型的生命周期学习
查看>>
图片加载失败显示默认图片占位符
查看>>
2018 ZJCPC
查看>>
【★】浅谈计算机与随机数
查看>>
[转载]宇宙文明等级的划分标准
查看>>
Jmeter的log输出控制
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
ActiveMQ配置使用 for CentOS6
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
linux下配置固定ip
查看>>
MsSql 游标 修改字段两个表关联 表向另个表插入记录
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
JavaScript怎么实现继承?
查看>>
Java中正则表达式的使用
查看>>
算法之搜索篇
查看>>
新的开始
查看>>