ios voip socket在后台运行,9分钟后收到SIGSTOP信号。为什么?

时间:2014-01-21 03:54:11

标签: ios sockets background voip

客户端:在plist文件中 所需的背景模式:

[App plays audio or streams audio/video using AirPlay,App provides Voice over IP services]

在函数 createStream

 CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

在函数 applicationDidEnterBackground

BOOL backgroundAccepted = [application setKeepAliveTimeout:600 handler:^{
    [self send:[NSString stringWithFormat:@"%@ KeepAliveTimeout",[NSDate date]]];
}];
if (backgroundAccepted)
{
    DLog(@"VOIP background");
}
_bgTaskId=[application beginBackgroundTaskWithExpirationHandler:^{
    [self alert:@"ExpirationHandler"];
    [application endBackgroundTask:_bgTaskId];
    _bgTaskId=UIBackgroundTaskInvalid;
}];

在函数applicationWillEnterForeground

[application clearKeepAliveTimeout];

服务器每5秒钟向客户端发送一条消息,NSTimer.client应用程序使用本地通知立即在后台显示消息;

2 个答案:

答案 0 :(得分:0)

如果您的应用剂量在300秒间隔内醒来超过15次将被杀死。 如果您每隔5秒向应用发送一条消息并处理此消息,那么我很惊讶您的应用运行了9分钟。

在这里查看:SO1 SO2

答案 1 :(得分:0)

我遇到了像你这样的问题,你所要做的就是删除代码

_bgTaskId=[application beginBackgroundTaskWithExpirationHandler:^{
    [self alert:@"ExpirationHandler"];
    [application endBackgroundTask:_bgTaskId];
    _bgTaskId=UIBackgroundTaskInvalid;
}];

我已经多次尝试过,如果你调用beginBackgroundTaskWithExpirationHandler,你的应用程序将会被系统终止。

并保留代码     BOOL backgroundAccepted = [application setKeepAliveTimeout:600 handler:^ {         [self send:[NSString stringWithFormat:@"%@ KeepAliveTimeout",[NSDate date]]];         //除非你在这里有更多的工作要做。     }];     if(backgroundAccepted)     {         DLog(@" VOIP背景");     }

从结果中我可以看到,如果你已经为Socket保留了正确的句柄,你的句柄代码就会自动调用,就像你在前台一样。