Вызов CallKit hasConnected всегда возвращает true

#ios #objective-c #swift #voip #callkit

#iOS #objective-c #swift #voip #callkit

Вопрос:

Я работаю над приложением VOIP и внедряю CallKit на iOS.

По этой ссылке: https://developer.apple.com/documentation/callkit/cxcall/1649013-hasconnected ?язык =objc

Вызов считается подключенным, когда и вызывающий, и вызываемый могут начать общение.

Что это здесь значит? Означает ли это, что WebRTC или какой-либо другой аудио / видеопоток должен быть запущен, чтобы он вернул true? или это означает, что если пользователь нажимает кнопку приема вызова, он считается подключенным?

У меня есть следующий код для проверки состояния вызова, и он всегда возвращает true или все, что я даю в разрешении:

 CXCallObserver *callObserver = [[CXCallObserver alloc] init];
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString];
  
    BOOL _mybool = false;
  
    for(CXCall *call in callObserver.calls){
        
        if([call.UUID isEqual:[[NSUUID alloc] initWithUUIDString:uuidString]] amp;amp; !call.hasConnected){
         _mybool = true;
          resolve(@"true");
        }
    }
  
    if(!_mybool){
      reject(false, false, false);
    }
 

Ответ №1:

В вашем коде вы проверяете состояние вызова в неправильном месте. Это создает проблему при вашем выполнении.

Вы должны сначала настроить callobserver с помощью call it. что вы сделали правильно. Но требуется один флаг didDetectOutgoingCall

 func setupCallObserverWithCallKit() {
        
        if #available(iOS 10.0, *) {

            didDetectOutgoingCall = false
            if callObserver == nil {
                callObserver = CXCallObserver()
                callObserver!.setDelegate(self, queue: nil)
            }
            
        }
    }
 

а затем внутри callObserver напишите свою логику.

 @available(iOS 10.0, *)
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        
        if call.isOutgoing amp;amp; !didDetectOutgoingCall {
            didDetectOutgoingCall = true
            // "Call button pressed"
        }
        
        if call.hasEnded   == true amp;amp; call.isOutgoing == false || // incoming end
            call.hasEnded   == true amp;amp; call.isOutgoing == true {   // outgoing end
            // Disconnected

        }
        
        if call.isOutgoing == true amp;amp; call.hasConnected == false amp;amp; call.hasEnded == false {
            // "CXCallObserver : Dialing"
         
           //**Write your logic written in for loop here**

        }
        
        if call.isOutgoing == false amp;amp; call.hasConnected == false amp;amp; call.hasEnded == false {
            // "CXCallObserver: Incoming"
        }
        
        if call.hasConnected == true amp;amp; call.hasEnded == false {
            // "CXCallObserver: Connected")
        }
    }
 

Примечание: Хотя этот код написан на языке swift, его легко понять и легко преобразовать в objective-c

Комментарии:

1. кажется, сработало, со старым методом я всегда получаю hasEnded = false при закрытии приложения, даже при двойном нажатии кнопки home не отображается экран вызывающей системы

Ответ №2:

 //init
if (@available(iOS 10.0, *)) {
    self.callObserver = [CXCallObserver new];
    [self.callObserver setDelegate:self queue:nil];
}
 

и реализовать метод делегирования — CXCallObserverDelegate

 #pragma mark - CXCallObserverDelegate
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    //what you need))
    //call.isOutgoing
    //call.hasConnected
    //call.hasEnded
    //call.onHold 
    //call.hasEnded
}
 

Комментарии:

1. если вам нужно использовать CallKit до iOS 10 — посмотрите CTCallCenter.h

2. Не могли бы вы сказать, что не так в моем коде? и сейчас я ориентируюсь только на людей выше iOS 10