Mos*_*ieb 9 sockets voip background ios
我有一个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];
Run Code Online (Sandbox Code Playgroud)
我还设置了以下内容:
这应用程序处于前台时效果很好,甚至在后台运行良好几分钟,但几分钟后 - 应用程序不会收到任何新的TCP消息.它不适用于wifi或3G,两者的结果相同.
我也尝试将属性设置为读取流(尽管读取和写入指向同一个套接字).每当我收到TCP上的数据或发送数据时,我也会开始一个简短的后台任务.顺便说一句 - 一切都发生在主线程上.
我已经检查过应用程序崩溃了 - 它没有.
在设备上进行调试时可以观察到相同的行为 - 一段时间后 - 没有收到任何信息(没有崩溃,警告,任何事情).
我究竟做错了什么?
看起来你的代码应该可以工作。但我能想到的技术问题可能有两个:
如果您从 LAN 连接尝试此操作,当应用程序在后台时,LAN 路由器可以关闭被动 TCP 连接,因为在这种情况下,SIP 堆栈(猜测您使用 SIP 协议)无法像以前那样每 15 到 30 秒发送一次保持活动的数据在前景中。
不太可能,假设您知道自己在做什么,但由于注册保持活动在后台只能每 10 分钟触发一次,因此请确保 SIP 服务器允许这么长的过期时间,并且您在注册消息中正确定义它。
归档时间: |
|
查看次数: |
3929 次 |
最近记录: |