CTCallCenter - 呼叫事件处理程序 - 处于后台状态

时间:2012-04-11 08:03:46

标签: objective-c ios background state

关于Apple文档,暂停应用程序时无法处理手机状态: https://developer.apple.com/documentation/coretelephony/ctcallcenter

  

“暂停时,您的应用程序不会收到呼叫事件”

这对“背景”状态也是如此吗? (由于背景状态与关于Apple文档中描述的状态的“暂停”应用程序状态不同)

https://web.archive.org/web/20140824215114/https://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)

3 个答案:

答案 0 :(得分:4)

我已完成的所有测试当应用程序处于后台时,我无法使用callEventHandler接收任何测试。但是,当应用程序处于前台时,一切都很顺利。

套接字有效,因为iOS会为您的应用程序处理它并相应地提供包。但为此,您需要创建一个voip套接字并将voip添加到{em> App-Info.plist 的UIBackgroundModes

答案 1 :(得分:1)

您将无法使用callEventHandler监控背景中的电话 ...

,根据this thread in apple dev forums,您可以在后台定期查看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);  
}

答案 2 :(得分:0)

我知道有些应用会在后台运行无声的音频文件,以防止在10分钟不活动后关闭。

蓝牙,位置和音频可以防止应用被完全杀死。

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

没有" keepAlive"操作系统将暂停您的应用程序,直到某些外部刺激重新激活它(推送通知,用户启动等...)