我有一个内部应用程序(不适用于iPhone商店发行,因此无需获得Apple批准),该应用程序在运行时需要保持少数几个TCP和UDP套接字绑定(bind)。

在测试时,我注意到绑定(bind)套接字有一些奇怪的行为-每当设备进入休眠状态时,套接字都会关闭。例如,当您按下手机顶部的电源按钮时,就会发生这种情况,而确实是,我不希望它这样做。更不用说这似乎完全违反了BSD套接字API契约(Contract)。

套接字代码都是用C编写的,因此不使用Objective-C的nsstream库。

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



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

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

最佳答案

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

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

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

10-08 16:57