客户端:在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应用程序使用本地通知立即在后台显示消息;
答案 0 :(得分:0)
答案 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保留了正确的句柄,你的句柄代码就会自动调用,就像你在前台一样。