CNContactViewController обрабатывает CNContactPhoneNumbersKey вместе с CallKit - PullRequest
0 голосов
/ 04 января 2019

У меня есть приложение 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).

1 Ответ

0 голосов
/ 07 января 2019

Упаковка makeMyVoIPCall(number: phoneNumber!, video: false) в основной поток решает проблему.

Я не могу понять, почему iOS просто игнорирует значение false.

...