ios 以编程方式链接CNContacts

6l7fqoea  于 2023-03-24  发布在  iOS
关注(0)|答案(4)|浏览(206)

在我的应用程序中,我想创建一个新联系人。如果已经存在同名的联系人,我想将新联系人链接到旧联系人。
我已经查看了CNContact和CNContactStore引用,没有看到任何链接联系人的方法。这可能吗?如果可能,如何链接?

gwo2fgha

gwo2fgha1#

在10S9中,代表同一个人的不同账户中的联系人可以自动链接在一起。
要实现这一点,您应该确保新插入的联系人的名称与您要统一的联系人的名称相匹配。
下面链接的文档给出了iCloud和Facebook上的“John Appleseed”的示例。
https://developer.apple.com/library/watchos/documentation/Contacts/Reference/Contacts_Framework/index.html

vtwuwzda

vtwuwzda2#

我不确定,但我怀疑iOS只会链接不同的来源,如果你在同一个地址簿中创建两个联系人,他们就不会被链接。
联系人库中对该区域的支持非常少。您可以使用CNContact.isUnifiedWithContact(withIdentifier:)检测联系人是否已统一并链接到另一个特定联系人,并且您可以决定是否要返回统一联系人。

wixjitnu

wixjitnu3#

下面是合并联系人与联系人存储中已经存在的联系人的代码。仅供参考,唯一的值,如名字姓氏将被替换,数组,如数字,电子邮件,地址将被追加现有的值。干杯!!

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
    picker.dismiss(animated: true, completion: nil)
    let identifier = contact.identifier
    updateContact(contactIdentifier: identifier)
}

func updateContact(contactIdentifier: String){

    let keysToFetch = [CNContactViewController.descriptorForRequiredKeys()]
    let contactStore = CNContactStore()
    do {
        let contactToUpdate =  try contactStore.unifiedContact(withIdentifier: contactIdentifier, keysToFetch: keysToFetch).mutableCopy() as! CNMutableContact
        if contactToUpdate.familyName.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.familyName = "your value"
        }
        if contactToUpdate.givenName.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.givenName = "your value"
        }
        if contactToUpdate.organizationName.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.organizationName = "your value"
        }
        if contactToUpdate.jobTitle.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.jobTitle = "your value"
        }
  // here the contact used below is the one that you want to merge with 
     an existing one.

        for i in contact.phoneNumbers {
            contactToUpdate.phoneNumbers.append(i)
        }
        for i in contact.emailAddresses {
            contactToUpdate.emailAddresses.append(i)
        }
        for i in contact.postalAddresses {
            contactToUpdate.postalAddresses.append(i)
        }
        let contactsViewController = CNContactViewController(forNewContact: contactToUpdate)
        contactsViewController.delegate = self
        contactsViewController.title = "Edit contact"
        contactsViewController.contactStore = contactStore
        let nav = UINavigationController(rootViewController: contactsViewController)
        DispatchQueue.main.async {
            self.present(nav, animated: true, completion: nil)
        }

    }
    catch {
        print(error.localizedDescription)
    }
}
zvokhttg

zvokhttg4#

CNContact框架有许多问题,其中之一是文档,但是当您在多个容器中创建联系人时,每个容器都有自己的标识符(它几乎可以在创建后立即更改,前Gmail容器)。他们应该通过一个统一的联系人自动链接。但我注意到,如果联系人只有一个给定的名称(没有姓氏)联系人不会被链接。我不确定Apple使用什么匹配密钥来创建统一联系人,但它似乎是给定和姓氏的组合,假设它们不重复。我没有找到任何方法来通过编程将联系人链接在一起。

相关问题