【问题标题】:CallKit Call hasConnected always returning trueCallKit 调用 hasConnected 总是返回 true
【发布时间】:2020-12-04 15:48:56
【问题描述】:

我正在开发一个 VOIP 应用并在 iOS 上实现 CallKit。

来自此链接:https://developer.apple.com/documentation/callkit/cxcall/1649013-hasconnected?language=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]] && !call.hasConnected){
         _mybool = true;
          resolve(@"true");
        }
    }
  
    if(!_mybool){
      reject(false, false, false);
    }

【问题讨论】:

    标签: ios objective-c swift voip callkit


    【解决方案1】:

    在您的代码中,您在错误的位置检查调用状态。这会在您的执行中造成问题。

    您必须首先设置 callobserver 并调用它。你做对了。但是需要一个标志 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 && !didDetectOutgoingCall {
                didDetectOutgoingCall = true
                // "Call button pressed"
            }
            
            if call.hasEnded   == true && call.isOutgoing == false || // incoming end
                call.hasEnded   == true && call.isOutgoing == true {   // outgoing end
                // Disconnected
    
            }
            
            if call.isOutgoing == true && call.hasConnected == false && call.hasEnded == false {
                // "CXCallObserver : Dialing"
             
               //**Write your logic written in for loop here**
    
            }
            
            if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false {
                // "CXCallObserver: Incoming"
            }
            
            if call.hasConnected == true && call.hasEnded == false {
                // "CXCallObserver: Connected")
            }
        }
    

    注意:虽然这段代码是 swift 语言,但它很容易理解并且很容易转换为 Objective-c

    【讨论】:

    • 似乎有效,使用旧方法我总是在关闭应用程序时得到 hasEnded = false,即使双击主页按钮时也没有显示呼叫系统屏幕
    【解决方案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
    }
    

    【讨论】:

    • 如果您需要在 iOS 10 之前使用 callKit - 查看 CTCallCenter.h
    • 你能告诉我的代码有什么问题吗?我现在只针对 iOS 10 以上的用户
    猜你喜欢
    • 2013-08-06
    • 2017-05-10
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多