Метод делегата iOS CallKit CXCallObserver callChanged никогда не срабатывает

Я прочитал несколько других сообщений, таких как этот: iOS : Не удалось получить события исходящего вызова в CallKit. Решение неизменно состоит в том, чтобы убедиться, что ссылка на объект CXCallObserver является надежной, чтобы она не исчезла до того, как она понадобится. Я считаю, что я сделал это и все еще имею проблему. Я использую Objective-C, SDK 11.3; код строится нормально, никаких ошибок или сбоев не происходит. Метод callChanged просто никогда не срабатывает. Любые идеи?

Вот мой код:

CXCallObserverDelegate.h: (Не знаю, зачем мне нужно было создавать это самому, но мой код не будет собираться без него. Однако, когда я это делаю, я получаю предупреждение о том, что «Повторяющееся определение игнорируется». Не похоже на это должна быть проблема, но может быть?).

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

@protocol CXCallObserverDelegate

    - (void)callObserver:(CXCallObserver *)callObserver
        callChanged:(CXCall *)call;

@end

MyViewController.h:

#import "CXCallObserverDelegate.h"

@interface MyViewController: MixpanelTrack <OtherDelegate,AnotherDelegate,CXCallObserverDelegate>

{ … }

MyViewController.m:

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

@property (atomic, strong) CXCallObserver *callObserver;

-(void)viewDidLoad {
    [super viewDidLoad];
    [self launchCallObserver];

}


-(void) launchCallObserver {

    CXCallObserver *callObserver = [[CXCallObserver alloc] init];
    [callObserver setDelegate:self queue:nil];
    self.callObserver = callObserver;    

}


-(void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    if (call.hasConnected) {
        [TSMessage showNotificationWithTitle:@“I never see this“ type:TSMessageNotificationTypeSuccess];

    } else if (call.hasEnded) {
        [TSMessage showNotificationWithTitle:@“I never see this either“ type:TSMessageNotificationTypeSuccess];        
    }
}

Я делаю звонки программно через свое приложение с помощью:

[[UIApplication sharedApplication] openURL:phoneUrl];

person Tom Peterson    schedule 15.08.2018    source источник
comment
Попробуйте сделать AppDelegate как CXCallObserver. AppDelegate корректно обрабатывает все события вызовов.   -  person Oleg    schedule 07.03.2019


Ответы (1)


Я проверил наш проект и увидел вашу проблему: вы используете классы импорта вместо среды Callkit, поэтому вы переопределяете CXCallObserverDelegate, когда никогда не импортируете этот протокол.

Чтобы решить эту проблему, вам нужно импортировать фреймворк с помощью:

#import <CallKit/CallKit.h>

вместо

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

Я надеюсь, это поможет вам

person AntonioM    schedule 21.08.2018
comment
Спасибо за ответ, Антонио. К сожалению, я до сих пор не получаю никакого действия callChanged. Я изменил все свои операторы импорта, чтобы ссылаться только на ‹CallKit/CallKit.h›. Я также смог удалить свой пользовательский файл CXCallObserverDelegate.h без каких-либо побочных эффектов. Не знаю, что с этим было. Я также попытался переместить все это в класс AppDelegate, настроив объект CXCallObserver из метода didFinishLaunchingWithOptions. Все, что я пытаюсь создать, работает нормально, просто ничего не делает с callChanged. - person Tom Peterson; 22.08.2018
comment
Привет, @TomPeterson, ты уверен, что экземпляр MyViewController создается при вызове callChanged? У нас есть менеджер для него (настраивается при вызове метода didFinishLaunchingWithOptions). Другой вопрос ... Вы эмулируете или используете вызовы приложений или используете другие вызовы (например, GSM, Whatsapp и т. Д.)? - person AntonioM; 23.08.2018
comment
Я почти уверен, что экземпляр MyViewController создан и остается таким, когда вызов начинается и завершается. В представлении MyViewController отображаются значки изображений потенциальных получателей вызовов. Когда пользователь нажимает на один из них, диалоговое окно предлагает ему позвонить этому получателю, а основной экран остается непрозрачным. Когда пользователь щелкает значок, чтобы инициировать вызов, заставка добавляется в качестве подпредставления к окну всего на секунду, а затем на время звонка вступает в действие собственный вид вызова и устройство телефона. - person Tom Peterson; 24.08.2018
comment
Когда вызов завершается, экран-заставка снова появляется еще на секунду, затем представление MyViewController снова появляется в том же состоянии, в котором оно было оставлено (т. е. если пользователь прокрутил, чтобы найти желаемого получателя вызова, страница пятно в прокрутке.Так что, кажется, вид не был перезагружен). - person Tom Peterson; 24.08.2018
comment
Я также знаю, что в этом процессе, когда пользователь нажимает кнопку вызова, срабатывает метод AppDelegate.applicationWillResignActive(), но всего через секунду срабатывает applicationDidBecomeActive(). Таким образом, приложение, кажется, было в неактивном состоянии всего секунду, независимо от того, как долго был звонок. Первоначально я пытался измерить продолжительность звонка с помощью этих двух методов, но по этой причине это не сработало. - person Tom Peterson; 24.08.2018
comment
Мои вызовы выполняются методом UIApplication.openUrl(). Приложения для промежуточных вызовов не используются. Можете ли вы объяснить, как работает менеджер? Может быть, это то, что мне нужно. - person Tom Peterson; 24.08.2018
comment
Привет, я проверял наш проект и обнаружил два отличия: во-первых, мы используем CXCallController вместо CXCallObserver. И мы не используем метод openURL(), потому что наши вызовы находятся в приложении, например вызов Whatsapp, это не вызов GSM. Через несколько часов я лучше проверю наш проект и надеюсь помочь вам, так что у нас есть providerDelegate. Тем временем вы можете протестировать CXCallController. - person AntonioM; 27.08.2018
comment
Я попытался использовать CXCallController для создания объекта CXCallObserver, но безуспешно. Затем я попытался запустить вызов с помощью CXCallController.requestTransactionWithAction. Это успешно запустило вызов, но в методе callChanged CXCallObserver ничего не зарегистрировано. Есть ли способ вообще использовать CXCallObserver? - person Tom Peterson; 28.08.2018
comment
Я просматривал наш проект и увидел, что наше приложение, когда оно находится в фоновом режиме, не использует функцию callObserver:callChanged:, но когда мы используем requestTransaction:completion:, оно работает без проблем. Извините, я больше не могу вам помочь, потому что у нас это как у вас примерно - person AntonioM; 05.09.2018
comment
Спасибо за ваше время, Антонио. - person Tom Peterson; 06.09.2018