2

我正在尝试使用 iPhone OS 4.x 提供的新机制为 VoIP 应用程序实现后台模式

仍然没有成功...当一些数据通过 TCP 套接字从服务器到达时,应用程序在后台模式下保持沉默。

根据文档,必须做以下两件事:

  1. 在文件中添加voipRequired background modesInfo.plst
  2. 将对象的属性设置kCFStreamNetworkServiceType为值CFReadStreamRefkCFStreamNetworkServiceTypeVoIP

我正在使用外部创建的 BSD 套接字来实例化CFReadStreamRef函数CFStreamCreatePairWithSocket。套接字句柄是正确的 - 通过一些测试检查。所以我得到了一个正确的CFReadStreamRef对象,稍后我将对其进行配置和打开。

这是代码块:

CFSocketNativeHandle socket = (CFSocketNativeHandle)socketHandle; 
CFStreamCreatePairWithSocket(kCFAllocatorDefault, socket, &sipSocketReadStream, nil);
CFReadStreamSetProperty(sipSocketReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
NSInputStream *inputStream = (NSInputStream*)sipSocketReadStream;   
[inputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
CFReadStreamOpen(sipSocketReadStream);

请注意 - 我的代表NSInputStream接收成功Stream Opened事件。但是任何其他事件都没有发生——我期待在一些 TCP 流量开始到达时收到一个事件。

4

3 回答 3

4

我必须重申吉拉德提到的明智建议。后台 TCP 套接字在模拟器上不起作用我花了很长时间试图弄清这个问题的根源,被模拟器的便利所吸引。

此外,也许只有我一个人,我没有从文档中明确哪个值是键,哪个值是属性。作为记录,这是我设置它的方式,它的工作原理:

res = [oStream setProperty:NSStreamNetworkServiceTypeVoIP 
                    forKey:NSStreamNetworkServiceType];

if(!res){
   // Error handling here
}
于 2010-10-01T06:45:12.677 回答
2

您需要确保您有UIBackgroundModes一个数组,并voip在您的 plist 文件中使用该选项:

<key>UIBackgroundModes</key>
<array>
    <string>voip</string>
</array>

此外,voip后台任务在模拟器下无法运行,因此请确保使用真实设备进行测试。如果您确实设置UIBackgroundModes正确并将流类型设置为kCFStreamNetworkServiceTypeVoIP,那么我唯一的结论是您可能正在使用模拟器进行测试。

于 2010-09-16T00:02:09.727 回答
0

我想你错过了[inputStream open]。一旦打开流,我希望你能调用你的委托方法。

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

在 VOIP 模式下成功建立 TCP 连接后,只有 iOS 才能让您的套接字保持活动状态,即使应用程序在后台模式下也是如此。

于 2013-01-09T06:36:53.427 回答