最近的VoIP通话。是否可以从中触发本地iOS电话? (不是voip)

时间:2019-08-07 21:52:10

标签: swift callkit

使用Swift5。在我的voip应用程序中,所有呼叫日志历史记录均会根据需要显示在本机最近记录中。从最近的应用程序中选择未接来电时,它会打开我的应用程序,但什么也不做。实际上,这在某种程度上是故意的,因为我不希望提供呼出电话。仅入站。

因此,出于这个原因,我的目标是使用本机iOS电话方法返回呼叫。 CallKit有可能吗?

这是我的提供程序配置:

     required init?(coder aDecoder: NSCoder) {


    let configuration = CXProviderConfiguration(localizedName: "My voip app")
    configuration.maximumCallGroups = 2
    configuration.maximumCallsPerCallGroup = 2
    configuration.iconTemplateImageData = #imageLiteral(resourceName: "IconMask").pngData()
    if let callKitIcon = UIImage(named: "iconMask80") {
        configuration.iconTemplateImageData = callKitIcon.pngData()
    }

    configuration.supportedHandleTypes = [.phoneNumber]
    callKitProvider = CXProvider(configuration: configuration)
    callKitCallController = CXCallController()

通话结束时,我正在使用此电话:

    let callUpdate = CXCallUpdate()

    callUpdate.remoteHandle = CXHandle(type: .phoneNumber, value: remoteCallNumber!)

按照Speakerbox示例的模型,将其放置在AppDelegate中,但是似乎没有被调用。

  func application(_ application: UIApplication, continue userActivity:    NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    guard let handle = userActivity.startCallHandle else {
        print("Could not determine start call handle from user activity: \(userActivity)")
        return false
    }

    guard let video = userActivity.video else {
        print("Could not determine video from user activity: \(userActivity)")
        return false
    }

    callManager.startCall(handle: handle, videoEnabled: video)
    return true
}

选择“最近通话”时,加载我的应用程序屏幕不会产生任何错误。但是,声明的目标是让上面调用的useractivity函数并以本地方式而不是voip应用程序进行呼叫。

更新:我现在解决了这个问题。借用Speakerbox示例中的一些代码,这就是我所期望的,可以正常工作。

新的快捷文件:

import Foundation
import Intents

extension NSUserActivity: StartCallConvertible {

var startCallHandle: String? {
    guard
        let interaction = interaction,
        let startCallIntent = interaction.intent as? SupportedStartCallIntent,
        let contact = startCallIntent.contacts?.first
        else {
            return nil
    }

    return contact.personHandle?.value
}

var video: Bool? {
    guard
        let interaction = interaction,
        let startCallIntent = interaction.intent as? SupportedStartCallIntent
        else {
            return nil
    }

    return startCallIntent is INStartVideoCallIntent
}

}

AppDelegate:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {


    guard let handle = userActivity.startCallHandle else {
        print("Could not determine start call handle from user activity: \(userActivity)")
        return false
    }

    guard let number = URL(string: "tel://" + handle) else { return false }
    UIApplication.shared.open(number)


    return true
}

0 个答案:

没有答案