设置NSStreamNetworkServiceTypeBackground“做什么”?

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

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

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

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

常量

NSStreamNetworkServiceTypeVoIP
指定流正在提供VoIP服务。

NSStreamNetworkServiceTypeVideo
指定流正在提供video服务。

NSStreamNetworkServiceTypeBackground
指定流提供后台服务。

NSStreamNetworkServiceTypeVoice
指定流提供语音服务。

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

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

如果您使用CFStream进行联网,则可以执行以下操作:

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

之后,您可以使用已经在ObjC NSInputStreamNSOutputStream找到的常量。 ( NSInputStreamNSOutputStream都扩展了NSStream 。)

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]