如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求。但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候基本上会被苹果Reject. 但是如果你的应用是企业内部发布的或者你只想了解其中的原理,那该文也许对您会有所帮助。
一、在iOS中如何应用VOIP
大多数VOIP应用需要设置后台audio 应用去传递音频,因此你应该设置audio 和voip两个键值。如果只是想通过VOIP来达到socket在休眠状态下维持长连接那只需要象上图一样设置VOIP即可。
接口
1、NSInputStream 和NSOutputStream 
NSStreamNetworkServiceType  
stream.
  
改属性的值设为  
NSStreamNetworkServiceTypeVoIP.  
2、NSURLRequest 
method of your NSMutableURLRequest object to set the network service  
type of the request. The service type should be set to  
NSURLNetworkServiceTypeVoIP. 
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. 
由于,VOIP应用程序需要一直运行以确保收到来电,所以如果程 序通过一个非零的exit code退出,系统将自动重启这个应用程序(这种退出方式可以发生在内存压力大时终止程序运行)。尽管如此,中断应用程序会release所有的
sockets,包括那个用于连接voip 服务的socket。因此,当程序运行时,它需要一直从头创建socket。
当你建立了handler之后,确定应用程序所需的最大超时。系统保证会在最大超时之前调用handler,但是这个时间是不确定的,所以你的handler必须在你申明的超时之前做好执行程序的准备。
二、通过GCDAsyncSocket来实现休眠状态下的长连接:
1、在创建socket并且成功连接上远程服务器的delegate中执行下述代码
  1. - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)connectedPort{
  2. [socket performBlock:^{
  3. [socket enableBackgroundingOnSocket];
  4. }];
  5. }
2、在ApplicationDidEnterBackground方法中调用setKeepAliveTimeOut以保持长连接
  1. BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
  2. if (backgroundAccepted)
  3. {
  4. NSLog(@"VOIP backgrounding accepted");
  5. }
参考:
1、XMPP中长连接问答
2、GCDAsyncSocket实现后台长连接的VOIP问答
3、后台运行(内容比较杂,但还是很有参考价值)
4、有一篇国内的关于VOIP以及后台程序的博文(内容还是比较杂--还是英文的,估计只能由博主自己看懂,仅做参考)
http://blog.csdn.net/gnicky/article/details/7452418
5、iOS socket编程基础
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.
7.CocoaAsyncSocket

https://github.com/robbiehanson/CocoaAsyncSocket

iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接的更多相关文章

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

      转自:http://blog.csdn.net/missautumn/article/details/17102067 如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可 ...

  2. ios系统中各种设置项的url链接

    ios系统中各种设置项的url链接 在代码中调用如下代码:NSURL*url=[NSURL URLWithString:@"prefs:root=WIFI"];[[UIApplic ...

  3. ios开发中全局变量设置和调用方法

    ios开发中,全局变量设置和调用方法如下:在AppDelegate.h文件中设置全局变量:@interface ***AppDelegate{NSString *myName;}@property ( ...

  4. [ios2]ios系统中各种设置项的url链接

    在代码中调用如下代码:(ps: ios 5.0 以后不可用)NSURL*url=[NSURL URLWithString:@"prefs:root=WIFI"];[[UIAppli ...

  5. IOS 应用中从竖屏模式强制转换为横屏模式

    在 iPhone 应用里,有时我们想强行把显示模式从纵屏改为横屏(反之亦然),CocoaChina 会员 “alienblue” 为我们提供了两种思路 第一种:通过人为的办法改变view.transf ...

  6. [iOS] iOS系统中各种设置项的url链接

    在代码中调用如下代码:NSURL*url=[NSURL URLWithString:@"prefs:root=WIFI"];[[UIApplication sharedApplic ...

  7. 在IOS应用中从竖屏模式强制转换为横屏模式

    http://www.cnblogs.com/mrhgw/archive/2012/07/18/2597218.html 在 iPhone 应用里,有时我们想强行把显示模式从纵屏改为横屏(反之亦然), ...

  8. IOS中快速集成短信SDK验证开发(SMSSDK),IOS开发中如何设置手机验证码

    [转载请注明出处] sdk是别人的,我只是下载来集成一下. smssdk下载网站:http://www.mob.com/(也有其他很多网站有类似SDK,譬如https://www.juhe.cn/等等 ...

  9. 如何在 iOS 8 中使用 Swift 实现本地通知(下)

    在上集中,我们已经构建了一个简单的待办列表应用(to-do list app),这个应用可以在待办项过期时通过本地通知提醒用户.现在,我们要在之前的基础上添加以下功能:应用图标角标上显示过期待办项的数 ...

随机推荐

  1. 如何设置一个严格30分钟过期的Session

    今天在我的微博(Laruence)上发出一个问题: 我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察 ...

  2. linux下如何优雅的挂载一个外界设备(比如优盘)

    最近从事linux,实验室一个破服务器,能连上网,但是输入这样的命令:        yum -y install gcc yum -y install gcc-c++ ,居然说是没有这样的镜像,也罢 ...

  3. 整理的一些模版LCS(连续和非连续)

    对于连续的最大串,我们称之为子串....非连续的称之为公共序列.. 代码: 非连续连续 int LCS(char a[],char b[],char sav[]){ int lena=strlen(a ...

  4. java.util 类 TreeSet<E>

    java.lang.Object≥ java.util.AbstractCollection<E> ≥ java.util.AbstractSet<E> ≥ java.util ...

  5. 在列表页,按照指定的category取所属的post列表

    在某些指定的页面,例如news,blog等页面,需要列出指定某种类型的文章列表,这种情况下,可以先添加两个category,分别命名news,blog,然后再分别添加几个post,指定每个post所属 ...

  6. Mysql 修改列的顺序

    alter table 表名 modify 字段名 字段类型 after 字段举例alter table user_info modify user_name varchar(10) after us ...

  7. visual2012 快捷键

    代码格式化:Ctrl+K+D 注释:VS2010是(Ctrl+E,C),VS2012是(Ctrl+K, Ctrl+C) 反注释:VS2010是(Ctrl+E,U),VS2012是(Ctrl+K, Ct ...

  8. SendMessage函数的常用消息及其应用大全

    来源:http://www.360doc.com/content/09/0814/10/19147_4907488.shtml,非常全面的解释. 文本框控件通常用于输入和编辑文字.它属于标准 Wind ...

  9. Windows API 文件处理

    CloseHandle 关闭一个内核对象.其中包括文件.文件映射.进程.线程.安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirect ...

  10. 带你揭开ATM的神秘面纱

    相信大家都用过ATM取过money吧,但是有多少人真正是了解ATM的呢?相信除了ATM从业者外了解的人寥寥无几吧,鄙人作为一个从事ATM软件开发的伪专业人士就站在我的角度为大家揭开ATM的神秘面纱吧. ...