我正在尝试使用 iPhone OS 4.x 提供的新机制来实现 VoIP 应用程序的后台模式
仍然没有成功...当一些数据通过 TCP 套接字从服务器到达时,应用程序在后台模式下保持静默。
根据文档,必须完成以下两件事:
- 在
Info.plst
文件中为所需后台模式
添加voip
值 - 将
CFReadStreamRef
对象的属性kCFStreamNetworkServiceType
设置为kCFStreamNetworkServiceTypeVoIP
值
我正在使用外部创建的 BSD 套接字通过 CFStreamCreatePairWithSocket
函数实例化 CFReadStreamRef
。套接字句柄是正确的 - 通过一些测试进行检查。因此,我获得了一个正确的 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
委托(delegate)成功接收到 Stream Opened
事件。但任何其他事件根本没有出现 - 我希望在一些 TCP 流量开始到达时收到一个事件。
最佳答案
我必须重申吉拉德提到的明智建议。后台 TCP 套接字不能在模拟器上工作。我花了相当长的时间试图弄清这个问题的根源,并被模拟器的便利所吸引。
此外,也许只有我一个人,我没有从文档中清楚地发现哪个值是键,哪个值是属性。作为记录,这就是我的设置方式和工作原理:
res = [oStream setProperty:NSStreamNetworkServiceTypeVoIP
forKey:NSStreamNetworkServiceType];
if(!res){
// Error handling here
}
关于iPhone OS 4.x - 后台 TCP 套接字没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3444639/