我有一个内部应用程序(不适用于 iPhone 商店分发,因此不受 Apple 批准),它需要在运行时保持少量 TCP 和 UDP 套接字绑定。
在测试时,我注意到我的绑定套接字有一些奇怪的行为 - 只要设备进入睡眠状态,它就会关闭。例如,当您按下手机顶部的电源按钮时,就会发生这种情况,而我really不希望它这样做。更不用说这似乎严重违反了 BSD 套接字 API 合同。
套接字代码全部用 C 编写,因此没有使用 Objective-Cnsstream http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSStream_Class/Reference/Reference.html图书馆。
我注意到有多种方法可以保持套接字对 VOIP、音乐流和其他事物开放。 nsstream 文档本身列出了一个NSStreamNetworkServiceTypeBackground
属性,这似乎可以帮助我的应用程序在手机进入睡眠状态时保持其套接字打开。苹果文档的底部列出了以下属性:
常数
NSStreamNetworkServiceTypeVoIP
指定该流正在提供 VoIP 服务。
NSStreamNetworkServiceTypeVideo
指定流
正在提供视频服务。
NSStreamNetworkServiceTypeBackground
指定
Stream正在提供后台服务。
NSStreamNetworkServiceTypeVoice
指定该流正在提供语音服务。
但由于我的应用程序的网络代码没有使用 Objective-C API,我需要知道:上述常量是如何实现的?也许有一个未记录的套接字选项,我可以使用它来实现相同的结果?基本上我只需要告诉内核在设备睡眠时不要弄乱我的套接字。
edit:作为逆向工程内核调用的替代方案,也许有一种方法可以将我的套接字文件描述符传递给可以应用这些选项的 Objective-C 代码?
如果您使用 CFStream 进行网络连接,您可以执行以下操作:
NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;
之后你可以使用你已经在 ObjC 中找到的常量NSInputStream
and NSOutputStream
. (NSInputStream
and NSOutputStream
两者都延伸NSStream
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)