2014-01-21 21 views
0

客户端:在plist文件 所需的背景模式:ios voip套接字在后台运行,9分钟后,SIGSTOP信号接收。为什么?

[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个senconds与NSTimer.client应用程序中使用本地通知,立即显示在后台消息;

回答

0

如果您的应用程序在300秒内唤醒超过15次,将会被杀死。 如果您每5秒向应用程序发送一条消息并处理此消息,则我惊讶于您的应用程序运行了9分钟。

看一看这里:SO1SO2

0

我必须经历这样你到底问题,所有你需要做的就是删除代码

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

我已经尝试了几次,如果你打电话beginBackgroundTaskWithExpirationHandler,无论如何你的应用程序将被系统终止。

,只是保持代码 BOOL backgroundAccepted = [应用setKeepAliveTimeout:600处理程序:^ { [自发送:[的NSString stringWithFormat:@ “%@的KeepAliveTimeout”,[NSDate的日期]]]; //除非你有更多的工作要做。 }];如果(背景接受) { } DLog(@“VOIP background”); }

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