设置NSStreamNetworkServiceTypeBackground“做什么”?

时间:2012-04-19 01:14:13

标签: ios c sockets ios5

我有一个内部应用程序(不适用于iPhone商店分发,因此不受Apple批准),它需要在运行时保留少量TCP和UDP套接字。

测试时我注意到我的绑定套接字出现了一些奇怪的行为 - 只要设备进入休眠状态,它就会关闭。例如,当您按下手机顶部的电源按钮时,会发生这种情况,而我确实不希望它这样做。更不用说它似乎严重违反了BSD套接字API合同。

套接字代码全部用C语言编写,因此不使用Objective-C nsstream库。

我注意到有各种方法可以为VOIP,音乐流媒体和其他内容保留套接字。 nsstream文档本身列出了一个NSStreamNetworkServiceTypeBackground属性,这似乎可以帮助我的应用程序在手机进入睡眠状态时保持其套接字打开。 apple docs的底部列出了以下属性:

  

常量
  

NSStreamNetworkServiceTypeVoIP   
指定流提供VoIP服务。   

NSStreamNetworkServiceTypeVideo   
指定流   正在提供视频服务。   

NSStreamNetworkServiceTypeBackground   
指定   流提供后台服务。   

NSStreamNetworkServiceTypeVoice   
指定流提供语音服务。

但是由于我的应用程序的网络代码没有使用Objective-C API,我需要知道:上面的常量是如何实现的?也许有一个未记录的套接字选项,我可以使用它来实现相同的结果?基本上我只需要告诉内核在设备休眠时不要弄乱我的套接字。

编辑:作为逆向工程内核调用的替代方法,也许有办法将我的套接字文件描述符传递给可以应用这些选项的Objective-C代码?

2 个答案:

答案 0 :(得分:0)

如果您使用CFStream进行联网,您可以这样做:

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;

之后,您可以使用已在ObjC NSInputStreamNSOutputStream中找到的常量。 (NSInputStreamNSOutputStream都延伸NSStream。)

答案 1 :(得分:0)

clientSocket c socket并且必须已经连接,然后使用对象c:

@property (nonatomic, strong) NSInputStream *inputStream ;
@property (nonatomic, strong) NSOutputStream *outputStream ;

CFReadStreamRef readStreamRef = nil ;
CFWriteStreamRef writeStreamRef = nil ;
CFStreamCreatePairWithSocket(NULL, clientSocket, &readStreamRef, &writeStreamRef) ; // the socket must have already been connected.
_inputStream = (__bridge_transfer NSInputStream *)readStreamRef ;
_outputStream = (__bridge_transfer NSOutputStream *)writeStreamRef ;
[_inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[_outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[_inputStream open] ;
[_outputStream open]