CallKit находит номер, используемый для запуска приложения из собственного приложения для телефона

Я реализовал CallKit в нашем приложении. Звонки, которые делает наше приложение, отображаются в списке недавних родных телефонных приложений.

При нажатии на запись для нашего приложения в списке недавних, наше приложение запускается. Есть ли способ узнать, какой номер (/ запись) использовался для запуска нашего приложения? (openURL или что-то в этом роде)


person Rasmus Höglund    schedule 30.09.2016    source источник
comment
Вы можете получить решение в Swift 4 здесь. Надеюсь, это поможет вам.   -  person Shubham    schedule 06.08.2019


Ответы (1)


Вы захотите реализовать application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool в AppDelegate. Для этого конкретного действия userActivity будет иметь свойство interaction со свойством intent, которое является экземпляром INStartAudioCallIntent (или INStartVideoCallIntent, если ваше приложение работает с видео).

Объект намерения содержит массив INPerson объектов контактов, которые можно использовать для определения информации о том, что было набрано.

Если ваше приложение не загружает контакты в систему, ваши звонки являются индивидуальными (в отличие от групповых) и вы просто хотите получить доступ к «набранному номеру», вы, вероятно, найдете то, что хотите, на intent.contacts?.first?.personHandle?.value.

Также обратите внимание, что вам нужно связать и импортировать фреймворк Intents.

Обновить

Предыдущий ответ был правильным только наполовину. Есть два способа получить эту информацию, и оба должны быть реализованы.

Приведенный выше вариант continueUserActivity будет вызываться при нажатии элемента в списке последних (или выборе контакта), а ваше приложение уже запущено.

Однако, если ваше приложение в данный момент не запущено, оно будет запущено и continueUserActivity вызываться не будет. Вместо этого система вызовет didFinishLaunchingWithOptions вашего AppDelegate с UIApplicationLaunchOptionsKey.userActivityDictionary, который можно использовать следующим образом:

if let activityOptions = launchOptions?[UIApplicationLaunchOptionsKey.userActivityDictionary] as? [String: AnyObject],
   let activity = activityOptions["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity {
  self.launchWithActivity(activity)
}

Если у вас есть экземпляр NSUserActivity, поведение будет таким же, как и в continueUserActivity.

Обновить еще раз

Согласно @vivek takrani в комментариях ниже, кажется, что continueUserActivity можно вызывать всегда, независимо от того, было ли приложение ранее открыто или нет. Я бы проверил это на более ранних версиях iOS 10, если вы собираетесь поддерживать его, поскольку я не верю, что это было так на момент написания этого ответа.

person Colin M    schedule 30.09.2016
comment
Спасибо, это то, что мне было нужно! - person Rasmus Höglund; 04.10.2016
comment
@RasmusHöglund & Colin, когда вы нажимаете на список последних, мое приложение не запускается и не отображает опцию вызова в последних. Я не знаю, что я пропустил? - person RJV Kumar; 07.11.2016
comment
Он открывается только для записей, созданных вашим приложением (с помощью callkit). У вас есть записи, созданные вашим приложением в недавних? - person Rasmus Höglund; 08.11.2016
comment
@RJVKumar Кроме того, чтобы ваше приложение отображалось в списке контактов и других частях системы, вы должны установить supportedHandleTypes на CXProviderConfiguration, чтобы включить типы дескрипторов, которые поддерживает ваше приложение. Это позволит звонить с помощью вашего приложения прямо из контактов. - person Colin M; 08.11.2016
comment
Эй, метод continueUserActivity вызывается все время, даже когда пользователь нажал на вызов из журнала вызовов и приложение было закрыто. - person vivek takrani; 06.09.2018
comment
Это может иметь место в более поздних обновлениях iOS. Всегда казалось странным, что раньше так работало. Я обновлю свой ответ, чтобы сослаться на ваш комментарий. - person Colin M; 07.09.2018
comment
Обязательно ли добавлять функцию Deep Linking, чтобы получить выбранный номер приложения VOIP и начать аудиозвонки в этом приложении? - person Parth Barot; 02.10.2019