3

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

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

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

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

常数

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

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

NSStreamNetworkServiceTypeBackground
指定流正在提供后台服务。

NSStreamNetworkServiceTypeVoice
指定流提供语音服务。

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

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

4

2 回答 2

0

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

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

之后,您可以使用已在 ObjCNSInputStreamNSOutputStream. (NSInputStream并且NSOutputStream两者都扩展NSStream。)

于 2013-06-27T14:03:39.657 回答
0

clientSocket c 套接字并且必须已经连接,然后使用对象 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] 
于 2015-06-10T01:48:21.377 回答