CTCallCenter – 调用事件处理程序 – 处于后台状态

关于苹果文档,在应用程序暂停时无法处理手机状态: http : //developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Reference/CTCallCenter/Reference/Reference.html

  “它被暂停时,您的应用程序不会收到通话事件” 

这是否也适用于“背景”状态? (由于苹果文档中描述的状态与“暂停”的应用程序状态不同,

http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

我正在使用以下代码处理电话状态:

CTCallCenter *callCenter = [[CTCallCenter alloc] init]; callCenter.callEventHandler=^(CTCall* call) { //call state }; 

我已经添加了一个本地通知到callEventHandler块,以检查是否会收到一个呼叫事件,而我的应用程序是在后台状态,但是接缝,该块没有执行(我的应用程序有一个后台支持和所有收到的事件TCP)正确处理,而应用程序在后台)

任何帮助表示赞赏!

谢谢

当应用程序在后台时,我所做的所有testing都无法使用callEventHandler 。 但是,当应用程序在前台时,一切都很好。

套接字工作,因为iOS为你处理它的应用程序,并相应地提供包。 但是为此,您需要创build一个VoIP套接字并将UIBackgroundModes添加到UIBackgroundModes到您的App-Info.plist

您将无法使用callEventHandler 在后台监视电话…

但是 ,根据苹果开发论坛中的这个线程 ,你可以在后台定期检查currentCalls ,以确定是否正在进行调用。

这里是你应该使用的代码(检查每秒):

 - (void)viewDidLoad { [super viewDidLoad]; _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(phoneDetection) userInfo:nil repeats:YES]; } - (void)phoneDetection { _callCenter = [[CTCallCenter alloc] init]; // Here is the important part : instanciating a call center each time you want to check ! [_callCenter setCallEventHandler:^(CTCall *call) { NSLog(@"Call detected"); }]; NSLog(@"%@", _callCenter.currentCalls); } 

我知道一些应用程序在后台运行无声audio文件,以防止10分钟不活动后closures。

蓝牙,位置和audio可以防止应用程序被完全杀死。

我的应用程序能够在后台检测传入呼叫和传出呼叫,因为应用程序在位置更新时保持活动状态。 过去我们使用过audio/蓝牙。

没有一些“keepAlive”的方法,操作系统将暂停你的应用程序,直到一些外部刺激重新激活它(推送通知,用户启动等…)