iOS Callkit - 来电最近记录

iOS Callkit - incoming Call Recents History

我在我们的应用程序中实现了呼叫工具包,仅用于在应用程序关闭或在后台(推送呼叫通知)时收到来电。我只是注意到,每次我接到一个电话并使用 callkit 显示它时,这个电话会自动出现在通话记录中(本机 Call App 中的“最近”选项卡)。

每次我点击其中一个最近的应用程序时,我的应用程序都会恢复或启动。 我想让应用程序在用户按下最近的电话后拨出电话,但我没有找到任何相关信息。

感谢提供信息:)

I wanted to make the app place an outgoing call after the user press the recent call but I didn't find anything about it.

在您应用的 Info.plist 中,您必须在 NSUserActivityTypes 键中包含 INStartAudioCallIntent and/or INStartVideoCallIntent,并且您的应用委托必须实现 -application:continueUserActivity:restorationHandler: 方法来处理开始调用的意图。有关详细信息,请参阅 Speakerbox 示例应用程序。

Can we disable this callkit feature ?

如果您不为通话 CXCallUpdate 设置 remoteHandle,则“最近”中的项目将不可按。

供将来参考;

  1. 呼叫工具包提供者配置应该有这个通用和 phone 数字类型列表

    config.supportedHandleTypes = [.generic,.phoneNumber]
    
  2. Callkit update remotehandle 应该像下面这样初始化

     update.remoteHandle = CXHandle(type: .generic, value:String(describing: payload.dictionaryPayload["caller_id"]!))
    

3.You 应通过选择项目>目标>构建阶段> Link Binary With Libraries 添加 Intents.framework 到您的项目并单击 + 按钮

  1. 您应该将 INStartCallIntent 添加到您的 info.plist 中,如下所示

    <key> NSUserActivityTypes </key>
         <array>
             <string>INStartCallIntent</string>
         </array>
    
  2. for swift 5 您应该将以下功能添加到您的 SceneDelegate.swift

    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {}
    

或者 swift 4 及以下你应该添加下面的函数到 Appdelegate.swift

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

 return true
}

然后将下面的代码添加到您的继续用户活动功能

let interaction = userActivity.interaction
            if let startAudioCallIntent = interaction?.intent as? INStartAudioCallIntent{
        
                let contact = startAudioCallIntent.contacts?.first
            
                let contactHandle = contact?.personHandle
    
                    if let phoneNumber = contactHandle?.value {
                       print(phoneNumber)
                      // Your Call Logic
                        }
                    }
         
            }

  

你应该得到一个警告

 INStartAudioCallIntent' was deprecated in iOS 13.0: INStartAudioCallIntent is deprecated. Please adopt INStartCallIntent instead

应用此建议失败,因为无法将 startAudioCallIntent 强制转换为 INStartCallIntent,因此请忽略它。

非常重要当应用程序终止时,不会调用场景委托中的继续用户活动功能,因此运行您在应用程序启动时的意图,您应该将代码块添加到

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}

你的代码应该如下所示

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
     
        let contentView = ContentView()

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView.environmentObject(AppDelegate.shared)) // This is my code so you may not use Appadelegate.shared. ignore it
            self.window = window
            window.makeKeyAndVisible()
        }
        
        
        if let userActivity = connectionOptions.userActivities.first {
            let interaction = userActivity.interaction
            if let startAudioCallIntent = interaction?.intent as? INStartAudioCallIntent{
        
                let contact = startAudioCallIntent.contacts?.first
            
                let contactHandle = contact?.personHandle

                    if let phoneNumber = contactHandle?.value {
                        
                        // Your Call Logic
                    }
         
            }
          }
        
    }