Как получить информацию журнала вызовов voip в приложении - Call Kit

Я реализовал набор вызовов в своем приложении voip, в котором я генерирую журналы вызовов для входящих или исходящих вызовов (отображается на последней вкладке телефона). Когда я нажимаю на журналы вызовов, он открывает мое приложение. Я переопределил метод делегата UIApplication, чтобы получить обработчик.

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

Но я не могу получить информацию о журнале вызовов в NSUserActivity. Как я могу получить информацию о журнале вызовов в своем приложении?

Любая помощь очень ценится. Спасибо!


person Shubham    schedule 07.02.2017    source источник
comment
Насколько я понял из вашего вопроса, вы не можете получить информацию о пользователе, когда нажимаете на последние с телефона?   -  person ridvankucuk    schedule 07.02.2017
comment
Какую информацию журнала вызовов вы ищете?   -  person user102008    schedule 07.02.2017
comment
@user102008 user102008 Мне нужен номер телефона или вызов UUID, чтобы инициировать новый исходящий вызов.   -  person Shubham    schedule 08.02.2017
comment
@Shubham: см. пример кода Speakerbox, чтобы узнать, как получить номер телефона (при условии, что вы указали номер телефона, когда сообщили об этом CallKit в первом звонке, который был помещен в «Последние»). UUID — это то, что вы создаете при создании нового вызова, и он должен быть уникальным для этого нового вызова.   -  person user102008    schedule 08.02.2017
comment
@Shubham Для NSUserActivity написано расширение для получения контакта. Вы можете проверить это на примере Apple ссылка   -  person ridvankucuk    schedule 08.02.2017


Ответы (3)


Мы можем взять номер телефона из 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;
}
person RJV Kumar    schedule 08.02.2017
comment
Отлично, спасибо за вашу помощь. - person Shubham; 08.02.2017

Полное решение в Swift 4

Вам нужно настроить свое приложение, чтобы получить продолжение userActivity.

  • Добавьте свойство supportHandleTypes в CXProviderConfiguration.

        let configuration = CXProviderConfiguration.init(localizedName:"Product name")
        configuration.supportedHandleTypes = Set([CXHandle.HandleType.generic])
    
  • Добавьте NSUserActivityTypes типа INStartAudioCallIntent в Info.plist вашего проекта введите здесь описание изображения

  • Целевой проект -> Фаза сборки -> Библиотеки добавляют Intents.framework

  • Импортируйте структуру Intents в свой AppDelegate
  • Ниже приведен код для извлечения номера телефона из 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
    }
    

    Надеюсь, это поможет Вам.

person Shubham    schedule 06.08.2019

Информация о вызове инкапсулируется в объекте 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
}
person vrat2801    schedule 07.01.2020