iPhone OS 4.x - 后台TCP套接字没有响应

时间:2010-08-09 22:21:57

标签: iphone objective-c multitasking

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

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

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

  1. voip档案
  2. 中为Required background modes添加Info.plst
  3. kCFStreamNetworkServiceType对象的属性CFReadStreamRef设置为kCFStreamNetworkServiceTypeVoIP
  4. 我正在使用外部创建的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流量开始到达时,我期待收到一个事件。

3 个答案:

答案 0 :(得分:4)

我必须重申吉拉德提到的圣人建议。后台TCP套接字在模拟器上执行 NOT 。我花了很长时间试图找到这个问题的底部,由模拟器的方便性吸引。

另外,也许它只是我,我没有从文档中找到哪个值是关键值,哪个值是属性。为了记录,这就是我设置它的方式,它起作用:

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

if(!res){
   // Error handling here
}

答案 1 :(得分:2)

您需要确保将UIBackgroundModes作为数组,并在plist文件中使用voip选项:

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

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

答案 2 :(得分:0)

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

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

在VOIP模式下成功连接TCP后,只有iOS才能让你的套接字保持活动状态,甚至应用于后台模式。