CTCallCenter:setCallEventHandler: 的文档指出:
但是,调用事件也可能在您的应用程序运行时发生
暂停。暂停期间,您的申请不会收到
调用事件。当您的应用程序恢复活动状态时,它
为每个更改状态的呼叫接收一个呼叫事件
与这个问题相关的部分是
当您的应用程序恢复活动状态时,它会收到一个
每个更改状态的调用的调用事件
这意味着应用程序将收到过去在应用程序暂停期间发生的呼叫的呼叫事件。根据这个问题的答案这是可能的:Navita TEM 应用程序如何获取通话记录信息? https://stackoverflow.com/questions/21193088/how-does-the-navita-tem-app-get-call-log-information
我的问题是:如果我的应用程序被挂起并且发生了呼叫,那么当我的应用程序恢复活动状态时,它如何检索发生的呼叫的呼叫事件?
我尝试了很多很多代码实验,但当我的应用程序恢复活动状态时,无法检索任何呼叫信息。
这是我尝试过的最简单的事情:
1) 使用 Xcode 单视图应用程序模板创建一个新项目。
2)将如下代码添加到didFinishLaunchingWithOptions中
3)启动应用程序
4) 远离应用程序的任务
5) 从另一台设备拨打电话、接听电话、从任一设备挂断电话
6) 将应用程序带回前台,从而恢复活动状态。
注册通话事件的代码是:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.callCenter = [[CTCallCenter alloc] init];
[self.callCenter setCallEventHandler:^(CTCall *call)
{
NSLog(@"Event handler called");
if ([call.callState isEqualToString: CTCallStateConnected])
{
NSLog(@"Connected");
}
else if ([call.callState isEqualToString: CTCallStateDialing])
{
NSLog(@"Dialing");
}
else if ([call.callState isEqualToString: CTCallStateDisconnected])
{
NSLog(@"Disconnected");
} else if ([call.callState isEqualToString: CTCallStateIncoming])
{
NSLog(@"Incomming");
}
}];
return YES;
}
使用此代码,如果呼叫发生时应用程序位于前台,我就能够获取呼叫事件。但是,如果我在拨打电话之前离开应用程序,那么当我的应用程序下次恢复活动状态时,我将无法收到呼叫事件 - 正如 Apple 文档中所述。
我尝试过的其他事情:
1)文档指出块对象是在默认优先级全局调度队列上调度的,因此我尝试将 setCallEventHandler 的注册放在其中dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})
2)在appBecameActive中调用setCallEventHandler:而不是didFinishLaunchingWithOptions
3) 向应用程序添加后台功能 - 通过 beginBackgroundTaskWithExpirationHandler 和/或使用 startUpdatingLocation 或 startMonitoringForSignificantLocationChanges 进行位置更新。
4)上述的各种组合。
一旦我的设备上运行了能够获取应用程序暂停时发生的呼叫事件的代码,就会获得赏金。
这是在 iOS 7 上。