首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CNContactViewController处理CNContactPhoneNumbersKey和CallKit

CNContactViewController处理CNContactPhoneNumbersKey和CallKit
EN

Stack Overflow用户
提问于 2019-01-04 15:37:36
回答 1查看 230关注 0票数 0

我有一个使用VoIP集成的CallKit应用程序。

在我的联系人屏幕中,我有一个包含所有设备联系人的UITableView,当用户按下联系人时,我用以下内容填充一个CNContactViewController

代码语言:javascript
复制
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呼叫,所以我使用以下代码:

代码语言:javascript
复制
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更改为特定的数字,而不是按下(请参阅上面的注释行)。我再次看到两个调用,系统调用单击的属性,我的应用程序调用"+1234567890“。
  • 我还验证了在处理操作时返回值应该是false,而不是true。

需要什么才能告诉系统我正在处理操作,而SIM/GSM呼叫不应该执行?

我正在iOS 12.1.1 (16C50)上进行测试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-07 18:58:14

makeMyVoIPCall(number: phoneNumber!, video: false)封装在主线程包中解决了这个问题。

我真的不明白为什么iOS会忽略false值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54041982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档