У меня есть приложение VoIP, которое использует интеграцию CallKit.
На моем экране контактов у меня есть UITableView
со всеми контактами устройства, и когда пользователь нажимает контакт, я заполняю CNContactViewController
с помощью:
extension ContactsViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedContact = viewModel.contactAt(section: indexPath.section, index: indexPath.row)
Logd(self.logTag, "\(#function) \(String(describing: selectedContact))")
let contactViewController = CNContactViewController(for: selectedContact!)
contactViewController.title = CNContactFormatter.string(from: selectedContact!,
style: CNContactFormatterStyle.fullName)
contactViewController.contactStore = viewModel.contactStore
contactViewController.allowsActions = false
contactViewController.delegate = self
navigationItem.titleView = nil
navigationController?.pushViewController(contactViewController, animated: true)
tableView.deselectRow(at: indexPath, animated: false)
}
}
Заполняет просмотр сведений о контактах без проблем.
Я хотел бы поймать действие пользователя на нажатие телефонного номера и выполнить вызов VoIP, поэтому я использую следующий код:
extension ContactsViewController: CNContactViewControllerDelegate {
func contactViewController(_ viewController: CNContactViewController,
shouldPerformDefaultActionFor property: CNContactProperty) -> Bool {
if property.key == CNContactPhoneNumbersKey {
let phoneNumberProperty: CNPhoneNumber = property.value as! CNPhoneNumber
let phoneNumber = phoneNumberProperty.stringValue
makeMyVoIPCall(number: phoneNumber!, video: false)
//makeMyVoIPCall(number: "+1234567890", video: false)
return false
}
if property.key == CNContactSocialProfilesKey {
let profile: CNSocialProfile = property.value as! CNSocialProfile
if profile.service == appServiceName {
let phoneNumber = profile.username
makeMyVoIPCall(number: phoneNumber!, video: false)
return false
}
}
Logd(self.logTag, "\(#function) nothing to handle for \(property)")
return true
}
func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
dismiss(animated: true, completion: nil)
}
}
В результате, когда я нажимаю элемент элемента телефона, чтобы начать 2 вызова! Один вызов выполняется из моего приложения (VoIP), а другой - из системы (SIM / GSM).
Что я пробовал:
- Добавлен вышеуказанный код для обработки
CNContactSocialProfilesKey
, и в этом случае вызов выполняется, как и ожидалось, только один раз через мое приложение.
- Изменил makeMyVoIPCall на определенный номер вместо нажатой (см. Строку с комментариями выше). Снова я вижу 2 вызова, система вызывает свойство clicked, а мое приложение "+1234567890".
- Я также проверил, что возвращаемое значение должно быть ложным, а не истинным, когда вы обрабатываете действие.
Что требуется для того, чтобы сообщить системе, что я выполняю действие, и вызов SIM / GSM не должен выполняться?
Я тестирую на iOS 12.1.1 (16C50).