iOS上的VoIP套接字 - 未收到任何通知

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)

我还设置了以下内容:

  1. 信息plist中的VoIP和音频
  2. 使用[UIApplication sharedApplication] setKeepAliveTimeout保持活动计时器
  3. 在信息plist中UIRequiresPersistentWiFi = YES(非常确定它不是必需的,但......)

这应用程序处于前台时效果很好,甚至在后台运行良好几分钟,但几分钟后 - 应用程序不会收到任何新的TCP消息.它不适用于wifi或3G,两者的结果相同.

我也尝试将属性设置为读取流(尽管读取和写入指向同一个套接字).每当我收到TCP上的数据或发送数据时,我也会开始一个简短的后台任务.顺便说一句 - 一切都发生在主线程上.
我已经检查过应用程序崩溃了 - 它没有.
在设备上进行调试时可以观察到相同的行为 - 一段时间后 - 没有收到任何信息(没有崩溃,警告,任何事情).

我究竟做错了什么?

Ily*_* K. 3

看起来你的代码应该可以工作。但我能想到的技术问题可能有两个:

  1. 如果您从 LAN 连接尝试此操作,当应用程序在后台时,LAN 路由器可以关闭被动 TCP 连接,因为在这种情况下,SIP 堆栈(猜测您使用 SIP 协议)无法像以前那样每 15 到 30 秒发送一次保持活动的数据在前景中。

  2. 不太可能,假设您知道自己在做什么,但由于注册保持活动在后台只能每 10 分钟触发一次,因此请确保 SIP 服务器允许这么长的过期时间,并且您在注册消息中正确定义它。