2

我正在为 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
}];

第一个似乎工作得很好(请注意,电池寿命和应用程序商店的批准与我无关),但只有当应用程序从 xcode 运行时。当我将应用程序放在设备上并在没有调试器的情况下运行它时,应用程序会保持活动状态大约 3 分钟,然后它就会死掉。

第二个似乎是它应该的样子,但我的问题是它至少有十分钟的时间。我的服务器在十分钟不活动后关闭连接,并且 setKeepAliveTimeout 似乎有点不准确,所以有时它会关闭半秒左右(我曾经经历过 2 秒)。这意味着每十分钟就有一次我与服务器的会话关闭。
我使用 Communigate Pro 服务器平台使用的称为 XIMSS 的协议。大多数 voip 应用程序似乎都使用 SIP,它可以从服务器发送保持活动数据包,但这不是我的选择。那么如何确保我的应用程序总是及时唤醒以发送保持活动状态?有没有小于十分钟的间隔?

4

0 回答 0