Документация для CTCallCenter: setCallEventHandler: указывает, что:
Однако события вызова также могут иметь место, пока ваше приложение приостановлено. Пока оно приостановлено, ваше приложение не получает вызывать события. Когда ваше приложение возобновляет активное состояние, оно получает одно событие вызова для каждого вызова, который изменил состояние
Часть, относящаяся к этому вопросу,
Когда ваше приложение возобновляет активное состояние, оно получает одно событие вызова для каждого вызова, который изменил состояние
Предположим, что приложение получит событие вызова для вызова, который имел место в прошлом, когда приложение было приостановлено. И это возможно в соответствии с ответом на этот вопрос: Как приложение Navita TEM получает информацию журнала звонков?
Мой вопрос: если мое приложение приостановлено и происходит вызов, то когда мое приложение возобновляет активное состояние, как он может получить событие вызова для вызванного вызова?
Я пробовал много, много экспериментов с кодом, но не смог получить информацию о вызовах, когда мое приложение возобновляет активное состояние.
Это самая простая вещь, которую я пробовал: 1) Создайте новый проект, используя шаблон приложения Xcode single view. 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) Вызов setCallEventHandler: в appBecameActive вместо didFinishLaunchingWithOptions
3) Добавление возможностей фона в приложение - через startBackgroundTaskWithExpirationHandler и/или обновления местоположения с использованием startUpdatingLocation или startMonitoringForSignificantLocationChanges.
4) Различные комбинации указанных выше.
Награда будет присуждена после того, как я получу код на моем устройстве, который сможет получать события вызова, которые произошли во время приостановки приложения.
Это на iOS 7.