使用 Callkit 接听电话后如何保持原生 UI

Posted

技术标签:

【中文标题】使用 Callkit 接听电话后如何保持原生 UI【英文标题】:How to keep native UI after accept a call using Callkit 【发布时间】:2017-03-03 16:27:33 【问题描述】:

我正在使用 Callkit 和 Linphone 开发 ios voip 应用程序。当我接到来电时,系统会向用户显示本机电话 UI 接受或拒绝取消呼叫,当用户点击接受按钮时,呼叫开始但电话 UI 消失。

如何在用户接听电话后保持原生手机 UI,就像 whatsapp 一样?

另外,如何在拨出电话时显示本机电话 UI?

这是我的 providerDelegate 代码:

func reportIncomingCall(uuid: UUID, handle: String, hasVideo: Bool = false, completion: ((NSError?) -> Void)? = nil) 
    // Construct a CXCallUpdate describing the incoming call, including     the caller.
    let update = CXCallUpdate()
    update.remoteHandle = CXHandle(type: .generic, value: handle)
    update.hasVideo = hasVideo

    // Report the incoming call to the system
    provider.reportNewIncomingCall(with: uuid, update: update)  error in
        /*
         Only add incoming call to the app's list of calls if the call was allowed (i.e. there was no error)
         since calls may be "denied" for various legitimate reasons. See CXErrorCodeIncomingCallError.
         */
        if error == nil 
            print("calling")

        
    


func provider(_ provider: CXProvider, perform action: CXStartCallAction) 
    let update = CXCallUpdate()
    update.remoteHandle = action.handle

    provider.reportOutgoingCall(with: action.uuid, startedConnectingAt: Date())
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "callStart"), object: self, userInfo: ["uuid":action.uuid])
    action.fulfill(withDateStarted: Date())



func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "callStart"), object: self, userInfo: ["uuid":action.uuid])

    // ACCEPT CALL ON SIP MANAGER
    if let voiceCallManager = AppDelegate.voiceCallManager 
        voiceCallManager.acceptCall()
    

    action.fulfill(withDateConnected: Date())


【问题讨论】:

接到电话后,您的呼叫屏幕 UI 扬声器是否会激活? 【参考方案1】:

接听来电后无法保持原生 UI。而 Whatsapp 使用自己的 UI,类似于原生 UI。

当您锁定 iPhone 并接听来电时,它不会显示您的 APP UI。但是,如果 iPhone 已解锁并且您接听来电,iPhone 将打开您的应用程序,您必须显示您的手机 UI。

并且对于拨出电话,您无法显示本机电话 UI,它会显示您是否接到电话。

因此,您需要一个自定义电话用户界面来拨出电话和已建立的电话。

【讨论】:

很好的答案。你知道当你从锁屏接听电话时发生了什么吗? didActivate 方法似乎没有被调用。 我在 iOS 11 中没有发现任何新的设置让你遗憾地使用原生 Phone UI。 我知道...当我检查 iOS 11 中的 Callkit 更改时,这是一个糟糕的通知。 我不知道为什么Apple工程师决定在iPhone处于解锁模式时显示APP UI而不是默认电话UI。但这是一个糟糕的选择。至少他们应该为开发人员提供一个选择默认电话或应用程序 UI 的选项。 TBO,使用 Apple 的东西是痛苦的。

以上是关于使用 Callkit 接听电话后如何保持原生 UI的主要内容,如果未能解决你的问题,请参考以下文章

使用 CallKit 接听电话时如何显示 ViewController

使用 CallKit 显示用于拨出 VoIP 呼叫的 iOS 本机呼叫 UI

斯威夫特/CallKit。是不是可以通过自定义 UI 通知 CallKit 接受来电?

Callkit 和 Webrtc 从锁定屏幕接听电话时没有音频

如何在没有调用者 UUID 的情况下从自定义 UI 结束 CallKit 调用?

iOS10:CallKit的简单应用