CTCallCenter:setCallEventHandler:的文档指出:
然而,当你的应用程序处于挂起状态时,呼叫事件也可能发生。当它被挂起时,你的应用程序不会收到呼叫事件。当你的应用程序恢复活动状态时,它会接收到每个更改状态的呼叫的单个呼叫事件。
与此问题相关的部分是:
当您的应用程序恢复活动状态时,它会接收到每个更改状态的呼叫的单个呼叫事件
这意味着应用程序将会接收到在应用程序挂起期间发生的通话事件。根据此问题的答案,这是可能的: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;
}
使用这段代码,如果应用程序在呼叫发生时处于前台,则可以获取呼叫事件。但是,如果在进行呼叫之前将任务从应用程序中删除,则无法在下一次恢复活动状态时获取呼叫事件-正如苹果文档中所述。
我尝试过的其他事情:
1)文档指出,块对象在默认优先级全局调度队列上分派,因此我尝试在dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})
中放置setCallEventHandler的注册。
2)在appBecameActive而不是didFinishLaunchingWithOptions中调用setCallEventHandler:
3)通过beginBackgroundTaskWithExpirationHandler和/或使用startUpdatingLocation或startMonitoringForSignificantLocationChanges添加背景功能到应用程序中。
4)以上各种组合。
只要我在设备上获得能够获取在应用挂起期间发生的呼叫事件的代码,就会授予奖励。
这是在iOS 7上。