【问题标题】:What does setting NSStreamNetworkServiceTypeBackground "do under the hood"?设置 NSStreamNetworkServiceTypeBackground “在幕后做什么”?
【发布时间】:2012-04-19 01:14:13
【问题描述】:

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

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

套接字代码都是用 C 编写的,所以没有使用 Objective-C nsstream 库。

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

常量

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

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

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

NSStreamNetworkServiceTypeVoice
指定流提供语音服务。

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

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

【问题讨论】:

  • 但请注意,NAT 设备可能随时获取“非活动”TCP 会话,并且远程对等方可能会发送 TCP 保活 ping 以及协议内保活 ping。
  • @sarnold 谢谢,我明白了。这是一个绑定套接字,我不希望传入的通信跨越 nat 边界。
  • 我隐约记得你可以在 C 套接字和 NSStream 对象之间建立免费桥接。不过我得查一下。
  • 糟糕,我刚刚看到这个帖子已经有一年多了。至少我的回答可以帮助社区

标签: ios c sockets ios5


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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] 
    

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2019-05-21
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多