当iphone应用程序进行网络编程时,切到后台后,socket连接会断掉,ios的设计就是这样。
但是好在apple公司也没有那么绝,还是有一些东西可以在后台运行的(backgroundmodes),
比如:音乐 GPS Voip Locationupdates等
我们以voip为例:
这里我们可以将NSStream指定voip的属性,从而可以避免程序切到后台的时候socket连接中断。
可以分为两步:
1.在info.plist文件中,增加voip选项,如
2. 设置NSStream的属性,如
在IOS中,sockets是用流或者更高级的结构,设置一个VOIP的socket,你只需要在通常的设置中添加一个特殊的key来标明这个接口是用于连接VOIP服务的,下表列出了流的接口和设置:
设置流接口用于voip接口
NSInputStream 和NSOutputStream 对于 Cocoa streams, 使用 setProperty:forKey: 方法添加
NSStreamNetworkServiceType 属性给 stream. 改属性的值设为 NSStreamNetworkServiceTypeVoIP.
[readStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];
这样,当程序切到后台的时候,这个socket连接还会被保持。
另外,iphone都是通过wifi或者gprs上网的,那么当socket连接空闲一段时间后,这个连接有可能被路由器关闭,为了保持连接,我们需要不停发送'心跳包'(保持连接状态)。
由于iphone上的程序切到后台后,程序会被挂起,那么也就无法定时发送心跳包,所以这个问题只能由服务端来解决。普通的办法就是服务器每隔一定时间给每个客户端发送一个心跳包,以维持这个连接。每当客户端接收到心跳包的时候,客户端会被IOS唤醒,获得一小段CPU时间,然后再次进入挂起状态。