在我的应用程序中,我想创建一个新联系人。如果已经存在同名联系人,我想将新联系人链接到旧联系人。
我查看了 CNContact 和 CNContactStore 参考资料,没有看到任何链接联系人的方法。这可能吗?如果可能,如何实现?
在IOS9中代表同一个人的不同账户中的联系人可能会自动链接在一起
为此,您应确保新插入的联系人的姓名与您要统一的联系人的姓名相匹配。
下面链接的文档给出了 iCloud 和 Facebook 上的“John Appleseed”示例。
我不确定,但我怀疑 iOS 只链接不同的来源。如果您在同一个地址簿中创建两个联系人,他们将不会链接。
联系人库中对这方面的支持非常少。您可以使用 CNContact.isUnifiedWithContact(withIdentifier:) 检测联系人是否统一并链接到另一个特定联系人,并且您可以决定是否要返回统一联系人。
下面是将联系人与联系人存储中已有联系人合并的代码。仅供参考,唯一值(如给定姓名、姓氏)将被替换,数字、电子邮件、地址等数组将附加现有值。干杯!
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)
}
}
CNContact 框架有很多问题,其中之一是文档,但是当您在多个容器中创建联系人时,每个容器都有自己的标识符(几乎可以在创建后立即更改,例如 Gmail 容器)。它们应该通过统一联系人自动链接。但是我注意到,如果联系人只有一个名字(没有姓氏),则联系人将不会被链接。我不确定 Apple 使用什么匹配密钥来创建统一联系人,但它似乎是给定名称和姓氏的组合,假设它们不重复。 我没有找到任何方法以编程方式将联系人链接在一起。