3

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

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

  • 有没有办法检测到应用程序已从此呼叫最近单击中打开/恢复?
  • 我们可以禁用这个 callkit 功能吗?

感谢提供信息:)

4

2 回答 2

3

我想让应用程序在用户按下最近通话后拨打电话,但我没有找到任何相关信息。

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

我们可以禁用这个 callkit 功能吗?

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

于 2016-12-19T19:52:42.383 回答
1

备查;

  1. 呼叫工具包提供商配置应具有此通用和电话号码类型列表

    config.supportedHandleTypes = [.generic,.phoneNumber]
    
  2. Callkit 更新远程句柄应该像下面这样初始化

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

3.您应该通过选择 project>target>Build Phases> Link Binary With Libraries 将 Intents.framework 添加到您的项目中,然后单击 + 按钮

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

    <key> NSUserActivityTypes </key>
         <array>
             <string>INStartCallIntent</string>
         </array>
    
  2. 对于 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
                    }
         
            }
          }
        
    }
于 2021-08-13T13:56:33.687 回答