我正在尝试使用iPhone OS 4.x提供的新机制实现VoIP应用程序的后台模式
仍然没有成功......当某些数据通过TCP套接字从服务器到达时,应用程序在后台模式下保持静默。
根据文档,必须完成以下两件事:
voip
档案Required background modes
添加Info.plst
值
kCFStreamNetworkServiceType
对象的属性CFReadStreamRef
设置为kCFStreamNetworkServiceTypeVoIP
值我正在使用外部创建的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流量开始到达时,我期待收到一个事件。
答案 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才能让你的套接字保持活动状态,甚至应用于后台模式。