如何在没有外部信令的情况下在后台运行iOS voip应用程序?

时间:2013-10-02 12:00:27

标签: ios objective-c voip

我正在为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,它可以从服务器发送保持活动的数据包,但这对我来说不是一个选择。那么我怎样才能确保我的应用程序总是及时唤醒以保持活着?是否有任何间隔小于十分钟的东西?

0 个答案:

没有答案