我有一个 VoIP 应用程序,它使用 TCP 服务在来电时唤醒它。
TCP 套接字是使用以下代码片段创建的:
CFReadStreamRef read = NULL;
CFWriteStreamRef write = NULL;
...
CFStreamCreatePairWithSocketToHost(NULL,(__bridge CFStringRef)shost, port, &read, &write);
self.read = (__bridge NSInputStream*)read;
self.write = (__bridge NSOutputStream*)write;
if (![self.read setProperty:NSStreamNetworkServiceTypeVoIP
forKey:NSStreamNetworkServiceType]){
[Log log:@"Could not set VoIP mode to read stream"];
}
if (![self.write setProperty:NSStreamNetworkServiceTypeVoIP
forKey:NSStreamNetworkServiceType]){
[Log log:@"Could not set VoIP mode to write stream"];
}
self.read.delegate = self;
self.write.delegate = self;
CFRelease(read);
CFRelease(write);
[self.read scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[self.write scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[self.read open];
[self.write open];
我还设置了以下内容:
- 信息列表中的 VoIP 和音频
- 使用 [UIApplication sharedApplication] setKeepAliveTimeout 保持活动计时器
- 信息 plist 中的 UIRequiresPersistentWiFi = YES (很确定这不是必需的,但是......)
当应用程序位于前台时,这种方式效果很好,甚至在后台运行几分钟也很好,但几分钟后 - 应用程序不会收到任何新的 TCP 消息。
它不适用于 wifi 或 3G,两者的结果相同。
我还尝试将属性仅设置为读取流(尽管读取和写入指向同一套接字)。
每当我在 TCP 上接收数据或发送数据时,我也会启动一个简短的后台任务。
顺便说一句 - 一切都发生在主线程上。
我检查过应用程序是否崩溃 - 没有。
在设备上调试时可以观察到相同的行为 - 一段时间后 - 什么也没有收到(没有崩溃,警告,任何东西)。
我究竟做错了什么?
看起来你的代码应该可以工作。但我能想到的技术问题可能有两个:
如果您从 LAN 连接尝试此操作,当应用程序在后台时,LAN 路由器可以关闭被动 TCP 连接,因为在这种情况下,SIP 堆栈(猜测您使用 SIP 协议)无法像以前那样每 15 到 30 秒发送一次保持活动的数据在前景中。
不太可能,假设您知道自己在做什么,但由于注册保持活动在后台只能每 10 分钟触发一次,因此请确保 SIP 服务器允许这么长的过期时间,并且您在注册消息中正确定义它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)