最近我已经从旧的ABAddressBook框架切换到新的CNContacts。在我的项目中,我将本机的联系人与我自己的核心数据联系人同步。为此,我使用联系人标识符和电话标识符来同步电话号码。
但我观察到有趣的事情,当我尝试编辑联系人时,我称这行代码为
func getContact() -> CNContact? {
let contactStore = CNContactStore()
guard let contactRecord = try? contactStore.unifiedContact(withIdentifier: "8222B6F1-DE99-4099-82A4-47EAB9206A94:ABPerson", keysToFetch: [CNContactViewController.descriptorForRequiredKeys()]) else {
return nil
}
return contactRecord
}
@IBAction func showContact() {
let contactViewController = CNContactViewController(forNewContact: self.getContact())
contactViewController.delegate = self
contactViewController.title = "New Contact"
let navigationController = UINavigationController(rootViewController: contactViewController)
navigationController.navigationBar.isTranslucent = false
self.present(navigationController, animated: true, completion: nil)
}
func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {
let newContact = self.getContact()
viewController.dismiss(animated: false, completion: nil)
}
这很简单。但是如果在CNContactViewController中我编辑用户照片,电话标识符将会改变,即使我没有编辑该控制器中的电话号码。电话标识符可以像这样轻松打印:
po newContact?.phoneNumbers.first?.identifier
这真的搞砸了我的同步,因为用户可能只是更换照片,但电话号码的标识符会发生变化,我无法知道发生了什么。如果我编辑其他一些数据,如人名,公司等,这个标识符将不会改变......即使我将手机编辑为其他值,它也会保持不变。但由于某种原因,改变照片会让它完全混乱。
还有其他人观察过这个吗?
以下是测试此https://drive.google.com/file/d/0B9ngBRq15jSuZTBYNVJCaVJ5WGc/view?usp=sharing
的示例项目的链接 编辑:我在真实手机上测试了这个答案 0 :(得分:3)
我在iPhone 8模拟器上尝试了您的示例项目,但似乎无法重现该问题。这是我设置初始联系人照片后的输出:
(lldb) po newContact?.phoneNumbers.first?.identifier
▿ Optional<String>
- some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"
(lldb) po oldContact?.phoneNumbers.first?.identifier
▿ Optional<String>
- some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"
然后我再次点击按钮并将其他照片设为联系人照片:
(lldb) po oldContact?.phoneNumbers.first?.identifier
▿ Optional<String>
- some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"
(lldb) po newContact?.phoneNumbers.first?.identifier
▿ Optional<String>
- some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"
这些对我来说都是一样的。我对你的项目所做的只是将getContact()中的查找更改为我自己的联系人数据库中存在的标识符。
答案 1 :(得分:2)
我上传了一个如何创建新联系人以及如何编辑它的示例
https://drive.google.com/file/d/0B7OUqtQ1nSxjb3lFTFA5WnlGdFk/view?usp=sharing
创建我正在使用的新联系人:
let newContact = CNMutableContact()
newContact.givenName = "Jhonny"
newContact.nickname = "Jhonny"
newContact.familyName = "My Family"
newContact.phoneNumbers.append(CNLabeledValue(label: "Home", value: CNPhoneNumber(stringValue: "555-123-4567")))
let contactViewController = CNContactViewController(forNewContact: newContact)
contactViewController.delegate = self
contactViewController.title = "New Contact"
let navigationController = UINavigationController(rootViewController: contactViewController)
self.present(navigationController, animated: true, completion: nil)
请注意此行
let contactViewController = CNContactViewController(forNewContact: newContact)
编辑我正在使用的联系人:
let contactViewController = CNContactViewController(for: contactRecord)
contactViewController.delegate = self
contactViewController.title = "Edit Contact"
let navigationController = UINavigationController(rootViewController: contactViewController)
self.present(navigationController, animated: true, completion: nil)
再次注意这一行
let contactViewController = CNContactViewController(for: contactRecord)
我认为问题是调用 CNContactViewController 的方法。构造函数与创建和编辑不同。 在演示中,您将在控制台日志中看到即使您编辑照片或其他任何内容,电话号码标识符仍保持不变。