我正在为iPad开发一个voip应用程序。我知道有类似的问题,但到目前为止,所提供的解决方案都没有奏效。我已经知道我必须在info.plist文件中设置voip标志(我使用xcode)。我还将“应用程序不在后台运行”设置为“否”(谁组成了这个名字?!?)。我还使用以下两行将套接字配置为voip:
CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
我阅读了SO和其他论坛上的文档和无数帖子,似乎有一些方法可以让应用程序永远在后台运行。我尝试过以下方法:
启动长时间运行的后台任务,并在其触发时重新启动任务。有人在这里解释了SO,但我找不到帖子了,所以这里是伪代码:
expirationHandler = ^{
if (inBackground) {
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];
}
};
inBackground = true;
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// inform others to stop tasks, if you like
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];
inBackground = true;
while (inBackground) {
//send a keep alive to my server
sleep(5);
}
});
我尝试的第二件事就是像这样使用setKeepAliveTimeout:
[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{
//send a keep alive to my server
}];
第一个看起来效果很好(注意电池寿命和app-store批准对我来说并不重要),但只有当应用程序从xcode运行时才会这样。当我将应用程序放在设备上并在没有调试器的情况下运行它时,应用程序会保持活动状态大约3分钟然后它就会死掉。
第二个似乎是应该如何,但我的问题是它至少有十分钟的时间。我的服务器在十分钟不活动后关闭连接,并且setKeepAliveTimeout似乎有点不准确,所以有时它会关闭半秒左右(我有一次经历过2秒)。这意味着每十分钟一次,我的服务器会话可能会关闭 我使用了一个名为XIMSS的协议,由Communigate Pro服务器平台使用。大多数voip应用程序似乎都使用SIP,它可以从服务器发送保持活动的数据包,但这对我来说不是一个选择。那么我怎样才能确保我的应用程序总是及时唤醒以保持活着?是否有任何间隔小于十分钟的东西?