2

我已经在我的 voip 应用程序中实现了通话套件,在该应用程序中,我为来电或去电生成通话记录(在最近的电话选项卡上可见)。当我点击通话记录时,它将打开我的应用程序。我已经重写了UIApplication委托方法来获取处理程序。

- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler  

但我无法在NSUserActivity. 如何在我的应用程序中获取通话记录信息?

任何帮助都非常感谢。谢谢!

4

3 回答 3

5

Swift 4 中的完整解决方案

您需要配置您的应用程序以继续调用 userActivity。

  • 在 CXProviderConfiguration 中添加 supportedHandleTypes 属性

        let configuration = CXProviderConfiguration.init(localizedName:"Product name")
        configuration.supportedHandleTypes = Set([CXHandle.HandleType.generic])
    
  • 在项目的 Info.plist 中添加 INStartAudioCallIntent 类型的 NSUserActivityTypes在此处输入图像描述

  • 目标项目 -> 构建阶段 -> 库添加 Intents.framework

  • 在 AppDelegate 中导入 Intents 框架
  • 下面是从 userActivity 中提取电话号码的代码

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        let intraction = userActivity.interaction
        let startAudioCallIntent = intraction?.intent as? INStartAudioCallIntent
        let contact = startAudioCallIntent?.contacts?[0]
        let contactHandle = contact?.personHandle
        if let phoneNumber = contactHandle?.value {
           print(phoneNumber)
        }
        return true
    }
    

    希望这对您有所帮助。

于 2019-08-06T12:04:13.390 回答
4

我们可以从userActivity中获取电话号码

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restora`tionHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler{
    INInteraction *interaction = userActivity.interaction;
    INStartAudioCallIntent *startAudioCallIntent = (INStartAudioCallIntent *)interaction.intent;
    INPerson *contact = startAudioCallIntent.contacts[0];
    INPersonHandle *personHandle = contact.personHandle;
    NSString *phoneNumber = personHandle.value;
}
于 2017-02-08T08:52:33.363 回答
0

调用信息封装在INPerson对象中,可以从INInteraction对象中解析出来。

在向 SiriKit 提供联系人时,传递给其他应用程序的任何 INInteraction 对象都包含 INPerson 对象中包含的信息。请勿包含您不愿意与其他应用程序共享的任何信息。

您必须从 NSActivity 对象中获取交互和意图对象。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
 if let intent = activity.interaction?.intent as? INStartCallIntent,
        let contacts = intent.contacts,
        let value = contacts.first?.personHandle?.value {
            let contactHandle name  = value
            // This is the contact handle, now you can add your business logic.
        }

  return true
}
于 2020-01-07T12:27:57.887 回答