Из ваших комментариев мы установили, что didReceiveIncomingPushWithPayload
вызывается правильно, поэтому уведомления pu sh, по-видимому, были настроены правильно.
Одна вещь здесь неактуальна, и это может быть причиной того, что вы получили уведомления о пропущенных вызовах вместо возможности пропустить вызов go в обычном режиме: сообщив о входящем вызове с помощью [self.cxProvider reportNewIncomingCallWithUUID:self.uuid update:callUpdate completion:^(NSError *error)
, вы напрямую сообщаете об окончании вызова на iOS с помощью
CXEndCallAction *endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.uuid];
CXTransaction *transaction = [[CXTransaction alloc] initWithAction:endCallAction];
[callController requestTransaction:transaction completion:^(NSError *error)
Это не должно в таком случае: вы по существу сообщаете iOS сначала, что у вас есть новый входящий вызов, а затем только через миллисекунды, при следующем основном запуске l oop, вы сообщаете, что удаленная сторона повесила трубку. Такой поток будет иметь смысл только в сценарии ios, где удаленная сторона фактически зависает в это время, например, из-за того, что установка соединения слишком медленная или вызывающий абонент снова очень быстро зависает. Но из того, что я понял, это не (как правило) дело здесь. Поэтому я думаю, что вы не захотите сообщать о завершении вызова на iOS вскоре после обработки уведомления pu sh. Может быть, вы можете попробовать, если это работает, если вы удалите следующие строки:
CXCallController *callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()];
dispatch_async(dispatch_get_main_queue(), ^{
CXEndCallAction *endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.uuid];
CXTransaction *transaction = [[CXTransaction alloc] initWithAction:endCallAction];
[callController requestTransaction:transaction completion:^(NSError *error) {
NSLog(@"error2 ----> %@",error);
if (@available(iOS 13.0, *)) {
[self.cxProvider reportCallWithUUID:self.uuid endedAtDate:[NSDate now] reason:CXCallEndedReasonRemoteEnded];
} else {
}
}];
});
Еще одна вещь, которую я хотел бы исследовать: есть ли сообщение об ошибке, которое дает какие-либо подсказки в исходной отчетности в [self.cxProvider reportNewIncomingCallWithUUID:self.uuid update:callUpdate completion:^(NSError *error)
?
Наконец, я бы посоветовал проверить, что ваш обработчик завершения действительно вызывается в конце, установив точку останова или добавив регистратор в
dispatch_async(dispatch_get_main_queue(), ^{
completion();
NSLog(@"completion handler called");
});