最近,我已经从旧的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中编辑用户照片,即使我未在此 Controller 中编辑电话号码,电话标识符也会更改。可以像这样轻松地打印电话标识符:
po newContact?.phoneNumbers.first?.identifier
这确实搞乱了我的同步,因为用户可能只会更改照片,但是电话号码的标识符将更改,而我将无法知道发生了什么。如果我编辑其他数据,例如个人姓名,公司等,此标识符将不会更改。即使我将电话编辑为其他值,该标识符也将保持不变。但是由于某种原因,更改照片会使照片完全困惑。
还有其他人观察到吗?
这里是示例项目的链接以测试此https://drive.google.com/file/d/0B9ngBRq15jSuZTBYNVJCaVJ5WGc/view?usp=sharing
编辑:我在真实电话上测试了
最佳答案
我在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()中的查找更改为我自己的联系人数据库中存在的标识符。