iOS 长连接

iOS使用socketIO实现长连接 阅读详情
如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求。但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候基本上会被苹果Reject. 但是如果你的应用是企业内部发布的或者你只想了解其中的原理,那该文也许对您会有所帮助。 
一、在iOS中如何应用VOIP  VOIP程序需要稳定的网络去连接和它相关的服务,这样它才能接到来电和其他相关的数据。系统允许VOIP程序被挂断并提供组件去监听它们的sockets,而不是在任意时候都处于唤醒状态。设置VOIP应用程序步骤如下: 
A、 添加UIBackgroundModes中的VOIP键值   加载中...

大多数VOIP应用需要设置后台audio 应用去传递音频,因此你应该设置audio 和voip两个键值。
如果只是想通过VOIP来达到socket在休眠状态下维持长连接那只需要象上图一样设置VOIP即可。 
B、 为VOIP设置一个应用程序socket  为了使应用程序在后台时保持稳定的连接,你必须tag你的主 通讯socket专门应用于VOIP,tagging这个socket来告诉系统,它必须在你的应用程序中断时接管这个socket。这个切换本身对于你 的应用程序时透明的,当新的数据到达socket的时候,系统会唤醒应用程序,并将socket的控制权返回给应用程序,这样应用程序就可以处理新来的数据。 
你只需要tag用于voip服务的socket,这个 socket用来接收来电或者其他相关的数据来保持你的VOIP服务的连接。根据收到的信息,这个socket要决定下一步的动作。比如一个来电,你会想 弹出一个本地的通知来告知用户;对于其他不是那么关键的数据,你可能会想悄悄的处理这些数据并让系统将应用程序重新中断。 
在IOS中,sockets是用流或者更高级的结构,设置一个VOIP的socket,你只需要在通常的设置中添加一个特殊的key来标明这个接口是用于连接VOIP服务的,下表列出了流的接口和设置: 
设置流接口用于voip接口 
1、NSInputStream 和NSOutputStream 对于 Cocoa streams, 使用 setProperty:forKey: 方法添加 
NSStreamNetworkServiceType 属性给 stream. 改属性的值设为 NSStreamNetworkServiceTypeVoIP. 
2、NSURLRequest 对于 URL loading system, 使用 setNetworkServiceType: method of your NSMutableURLRequest object to set the network service 
type of the request. The service type should be set to NSURLNetworkServiceTypeVoIP. 
3、CFReadStreamRef和CFWriteStreamRef For Core Foundation streams, use the CFReadStreamSetProperty or CFWriteStreamSetProperty function to add the kCFStreamNetwork- ServiceType property to the stream. The value for this property should be set to kCFStreamNetworkServiceTypeVoIP. (注意:当设置socket的时候,你需要在你的主信号通道中设置合适的service type key。当设置声道时,不需要设置这个key) 
由于,VOIP应用程序需要一直运行以确保收到来电,所以如果程 序通过一个非零的exit code退出,系统将自动重启这个应用程序(这种退出方式可以发生在内存压力大时终止程序运行)。尽管如此,中断应用程序会release所有的 sockets,包括那个用于连接voip 服务的socket。因此,当程序运行时,它需要一直从头创建socket。

C、 在移出后台之前,调用setKeepAliveTimeout:handler:方法去建立一个定期执行的handler,你的应用程序可以运行这个handler来保持服务的连接  为了防止断连,voip程序需要定期被唤醒去检查它的服务。为了容易实现这个行为,IOS通过使用(UIApplication setKeepAliveTimeout:handler:)方法建立一个特殊的句柄。你可以在 applicationDidEnterBackground方法中建立该句柄。一旦建立,系统至少会在超时之前调用该句柄一次,来唤醒你的应用程序。 
这个keep-alive handler在后台执行,必须尽快的返回参数,它有最多30秒的时间来执行所需的任务,如果这段时间内句柄没有返回,那么系统将终止应用程序。 
当你建立了handler之后,确定应用程序所需的最大超时。系统保证会在最大超时之前调用handler,但是这个时间是不确定的,所以你的handler必须在你申明的超时之前做好执行程序的准备。 
二、通过GCDAsyncSocket来实现休眠状态下的长连接:  
1、在创建socket并且成功连接上远程服务器的delegate中执行下述代码
?
1
2
3
4
5
- ( void )socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)connectedPort{
     [socket performBlock:^{
         [socket enableBackgroundingOnSocket];
     }];
}



2、在ApplicationDidEnterBackground方法中调用setKeepAliveTimeOut以保持长连接
?
1
2
3
4
5
BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout: 600 handler:^{ [self backgroundHandler]; }];
  if (backgroundAccepted)
  {
       NSLog(@ "VOIP backgrounding accepted" );
  }



参考:  1、XMPP中长连接问答 http://stackoverflow.com/questions/5257580/iphone-xmpp-app-run-background

2、GCDAsyncSocket实现后台长连接的VOIP问答 http://stackoverflow.com/questions/8748874/gcdasyncsocket-background-voip

3、后台运行(内容比较杂,但还是很有参考价值) http://blog.youkuaiyun.com/ssihc0/article/details/7240495

4、有一篇国内的关于VOIP以及后台程序的博文(内容还是比较杂--还是英文的,估计只能由博主自己看懂,仅做参考) http://blog.youkuaiyun.com/gnicky/article/details/7452418

5、iOS socket 编程 基础 http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server

6、一篇StackOverflow.com中的问答,其中对iOS中对VOIP的解释比较详细  If you want to let your VOIP application run in background , except those base settings in plist file, you need a TCP socket who's property is set to VOIP, than the iOS system will take care this socket for you, when your application enter background , every thing was 'sleep' except that tcp socket. and if VOIP server send some data thought that TCP socket, your application will be awake up for 10 secs. during this time, you can post a local notification.  
Only Tcp socket can be set as VOIP Socket. But from i know , mostly VOIP application are based on UDP socket. if you do not want to separate the control socket from the data socket. you should create another tcp socket which is focus on 'awake' your application , and from my personal experience , it's very hard to keep this 'awake' signal and the real sip control signal synchronize, the application always miss the sip invite request.  
So,the best way is separating the sip control single from the UDP data socket , make it as a tcp socket , this is the best solution , but never use tcp socket to transfer voice data.  
Another dirty way: keep the application awake all the time. As i said , each TCP single the application received thought that 'VOIP' tcp socket , will keep application awake for 10 seconds, so at the end of this duration(after 9 secs) , you can send a response to the server to ask for another signal , when the next signal arrived, the application will be awake again,after 9 secs , send response again. keep doing this, your application will awake forever.  http://stackoverflow.com/questions/6601536/ios-voip-socket-will-not-run-in-background

7.CocoaAsyncSocket https://github.com/robbiehanson/CocoaAsyncSocket
iOS 唤醒被Kill的APP保证蓝牙的长连接 iOS基础蓝牙连接和数据通信请在优快云搜索其他博文,这里不再赘述。 iOS保证后台蓝牙长连接的方法,经亲测过归纳为以下几项: 1.后台静音音频的循环播放 后台循环播放一个静音的音频文件来保证APP的持续存活,不失为一个曲线方法。缺点是需要后台音频播放的说明及权限,在APP审核过程中会有被拒绝的风险。APP后台持续活动,不论是一直扫描还是连接Peripheral都可以做到蓝牙重连。 ... 阅读详情

相关推荐

iOS 长链接

iOS长链接,通过URL直接建立长链接,心跳机制,断网重连

iOS中长连接的那些事

一、长连接在iOS开发中的作用一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection、NSURLSession或者是AFNetworking,Http1.0链接最显著的特点就是客户端每一次需要主动向服务端发送请求,都需要经历建立链接、发送请求、返回数据、关闭链接这几个阶段,是一种单向请求且无状态的协议。而有的时候,我们需要服务端主动往客户端进行推送服务的时候,这...

YCM1101743158的博客 844

IOS 长链接与短链接之间的转换

IOS 长链接与短链接之间的转换 首先需要将字符串使用md5加密,添加NSString的md5的类别方法如下 .h文件 #import <CommonCrypto> @interface NSString (md5) -(NSString *) md5HexDigest; @end .m文件 #import NSString+md5.h @implementation NSString (md5) - (NSString *) md5HexDigest { const char *original_str = [self UTF8String]

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

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

missautumn的专栏 1万+

具身机器人内部PCB板分类与系统架构详解

本文系统梳理了机器人内部PCB板的功能架构,将其划分为5大模块:1)核心主板(含主控计算机板、实时控制板等);2)感知类PCB(视觉、听觉、触觉等);3)运动控制类PCB(伺服驱动、编码器等);4)电源与安全类PCB(电源管理、BMS等);5)通信类PCB(EtherCAT背板等)。通过人体器官类比(如大脑对应主控板、小脑对应实时控制板),详解了各模块的芯片选型、位置分布及协同关系,并给出信号/能量/指令的三流闭环示意图和典型系统参数(48V供电、1ms通信周期)。整体呈现了机器人"神经系统&qu

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 318

超详细 Git创建仓库及上传项目至Github操作(Windows系统)

文章目录前言一、Git下载及安装二、创建代码仓库1.配置身份2.创建本地仓库3.提交本地代码三、使用Git上传代码至Github1.创建ssh keys2.在Github中新建仓库3.关联本地仓库与Github仓库4.推送代码至Github仓库总结 前言 本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去。内容参考《第一行代码》以及一些博客。 本文适合新手阅读哦~ 一、Git下载及安装 打开网站 git下载 下载安装包(直接

lijianyi0219的博客 2万+

iOS中使用GCDAsyncSocket建立长连接

在App与服务器需要高频通信,或者服务器主动推送消息到App的情况下,就需要通过长连接来实现。比如聊天和股票软件。 下面介绍iOS中如何通过GCDAsyncSocket来实现长连接。 GCDAsyncSocket介绍 GCDAsyncSocket是一个开源库CocoaAsyncSocket的一部分,用于建立可靠的TCP连接。如果想建立UDP连接,可以用GCDAsyncUDPS

vaintwyt 3397

HMC5883L磁力计驱动开发:I²C通信、校准与FreeRTOS集成

磁力计是惯性导航与电子罗盘系统的核心传感器,其输出原始磁场数据需经精确采集、单位换算与误差补偿才能用于姿态解算。基于各向异性磁阻(AMR)原理的三轴磁力计,如HMC5883L,依赖稳定I²C通信获取12位有符号磁场采样值,并通过增益配置、硬软铁校准及温度补偿提升物理量精度。在嵌入式实时系统中,驱动层须保障数据的时间一致性与抗干扰鲁棒性,避免总线挂死、字节错位或量程误配等典型问题。本文围绕HMC5883L这一广泛使用的停产但仍在产线服役的磁传感器,详解寄存器配置、定点单位转换、八方位校准算法及FreeRTOS

weixin_42594427的博客 145

iOS中网络编程长连接

1、长连接在iOS开发中的应用 常见的短连接应用场景: 一般的App的网络请求都是基于 Http1.0 进行的,使用的是 NSURLConnection、NSURLSession 或者是 AFNetworking,Http1.0 链接最显著的特点就是客户端每一次需要主动向服务端发送请求,都需要经历建立链接、发送请求、返回数据、关闭链接这几个阶段,是一种单向请求且无状态的协议。 长连...

GSNICE 4879

U-Boot 适配新型号 SPI Nor Flash 实战解析

本文详细解析了U-Boot适配新型号SPI Nor Flash的全过程,从JEDEC ID识别错误入手,深入源码分析Flash信息数据库,结合实际手册参数添加新设备支持。重点介绍了设备树同步和验证调试的关键步骤,并总结了常见问题与解决方案,为嵌入式开发者提供实用参考。

weixin_29170327的博客 196

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用RFAConv感受野注意力卷积改进YOLO26检测头,RFAHead感受野注意力检测头,助力小目标检测高效涨点

YOLO26作为轻量化目标检测模型的新一代标杆,凭借高效的Backbone与Neck结构,在实时检测场景中表现突出,但原生检测头仍存在核心痛点——感受野固定、小目标特征感知薄弱、多尺度目标适配不足,导致在小目标密集、复杂背景遮挡等场景中漏检率偏高、定位精度不足。

qq_36130719的博客 167

iOS后台运行模式(background execution mode)

后台运行模式

realyezi的博客 9169

字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间

本文介绍DepthAnything3(DA3)模型,一种能够从任意视觉输入中预测几何结构的创新解决方案。DA3采用Transformer骨干网络,通过统一的深度光线表示简化学习过程,支持单目/多视角深度估计、姿态估计和3D高斯预测等多项任务。模型系列包含基础版、度量级和单目专用版本,其中嵌套版本DA3NESTED-GIANT-LARGE表现最佳。代码库提供交互界面、CLI工具和多格式导出功能,支持模块化扩展。实验表明DA3在各项任务上超越现有模型,所有训练数据均来自公开学术数据集。

2506_90492529的博客 2548

iOS 后台保持长连接

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

administrator99999的博客 277

032、准谐振反激变换器(QR-Flyback)原理

文章摘要: 本文以65W PD快充炸管案例切入,解析准谐振反激变换器(QR-Flyback)原理。通过主动利用漏感与MOS结电容的谐振,在Vds波谷开通实现近似ZVS,显著降低开关损耗与电压应力。对比传统反激,QR模式轻载效率提升8%,Vds尖峰减少23%。关键设计要点包括:变压器漏感需<3%、谷底检测电路需抗干扰、启动阶段需防过冲。推荐NCP1340等专用控制芯片,并强调VCC电容优选低ESR陶瓷材质。QR适用于30W-150W场景,其核心优势在于轻载效率优化,但需平衡漏感控制与可靠性。作者结合实测数据与

Jack010169的博客 112

使用libVLC进行视频截图的C/C++实现

通过这些代码,你可以在C/C++应用程序中实现视频截图功能,并将视频帧保存为图像文件。请注意,本文只提供了基本的示例代码,你可以根据自己的需求进行扩展和修改。libVLC是一个强大的开源多媒体框架,可以用于在C/C++应用程序中处理和播放音频和视频文件。我们将展示如何初始化libVLC,打开视频文件,捕获视频帧并保存为图像文件。在开始编写代码之前,你需要包含libVLC的头文件,并链接相应的库文件。在链接阶段,你需要添加libVLC库的链接选项。在使用libVLC之前,你需要初始化libVLC的实例。

学习使你进步。 470

百度iOS端长连接组件建设及应用实践

本文旨在探讨长连接技术在移动端的实践,针对百度iOS端在建设长连接过程中的技术选型和整体架构逻辑将做重点展开。同时结合IM即时通讯案例的介绍和分析,展示长连接是如何在移动应用领域为类似业务场景提供解决方案的。

lihui49的博客 1049

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android和IOS长连接区别

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

diaoju3333的博客 123

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

iOS - Socket-长连接(心跳包)的实现

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

Q_Q33757152的博客 7626

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

终极指南:如何使用CocoaAsyncSocket实现iOS即时通讯长连接

CocoaAsyncSocket是一款强大的异步网络通信库,专为Mac和iOS平台设计,能够轻松实现高效稳定的长连接功能,是即时通讯应用开发的理想选择。本文将详细介绍如何利用CocoaAsyncSocket构建可靠的iOS即时通讯长连接,帮助开发者快速掌握这一实用技术。 ## 一、CocoaAsyncSocket简介 CocoaAsyncSocket提供了GCD和RunLoop两种实现方式,其

gitblog_00561的博客 1099

iOS长连接Socket使用--AsyncSocket

SOCKET:TCP/IP网络的API。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。 一般有不定时的向服务器传送数据的需求时,使用长连接, iOS开发中长连接的

lgx_admin的博客 3709

ios实现长连接的一种伪装方案

ios实现长连接的一种伪装方案app在前台的时候,使用tcp,自定义协议。 在后台的时候,断开连接,使用apn提示用户,唤醒app到前台后,重新连接,拉取离线消息。 转载于:https://www.cnblogs.com/Sunnyheart/p/5333024.html...

weixin_30588675的博客 78

iOS使用GCDSocketManager实现长连接

貌似进入2016年就没再更新简书,把写作忘了。罪过。 OK,进入正题,开始今天的技术讲解。 太概念的知识网上有很多,我只做概括和快速并正确的使用。 Socket,即使用套接字连接,实际上是对TCP/UDP的再次封装。 在一般项目中,使用Socket的情况很少,一般都会使用http实现客户端与服务器端的通信。并且是单向的。 但http只能通过客户端向服务器端主动发送网络

a787188834的专栏 1965

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

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

zhangkongzhongyun的专栏 2万+
上一篇: Java IO 详解
下一篇: iOS7 UI改变总结
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值