Документация CTCallCenter: setCallEventHandler: утверждает, что:Как получить событие вызова с помощью 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;
}
С помощью этого кода я могу получить назвать события, если приложение находится на переднем плане, когда происходит вызов. Но если я отвлекся от приложения перед выполнением вызова, то я не смогу получить событие вызова, когда мое приложение снова возобновит активное состояние, - как он заявляет, что это должно быть в документации Apple.
Другие вещи я пытался:
1) В документации говорится, что объект блок отправляется на приоритет по умолчанию глобальной очереди диспетчеризации, поэтому я попытался поместить регистрацию setCallEventHandler в dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})
2) Вызов setCallEventHandler: в appBecameActive вместо didFinishLaunchingWithOptions
3) Добавление фоновых способности приложения - с помощью beginBackgroundTaskWithExpirationHandler и/или обновления местоположения с использованием startUpdatingLocation или startMonitoringForSignificantLocation Изменения.
4) Различные сочетания вышеуказанного.
Награда будет присуждена, как только я получу код на своем устройстве, который сможет получать события вызова, которые имели место, когда приложение было приостановлено.
Это на прошивке 7.
Добавить журнал как первую строку doneFinishLaunchingWithOptions и снова запустить один из ваших неудачных тестов, он регистрируется? – Wain
Да. У меня нет проблем с базовой настройкой использования обработчика - я могу получить обновления, если приложение находится на переднем плане, и, как я упоминал в 2), я также могу получить их в фоновом режиме до истечения срока действия обработчика истечения срока действия. Таким образом, он регистрируется в файле didFinishLaunchingWithOptions и вызывается. – Gruntcakes
Я действительно интересовался, что обратный вызов каким-то образом заменялся, и был запущен новый сеанс, поэтому список событий был потерян ... – Wain