CNContacts框架可能的错误与电话标识符?

Meg*_*anX 7 ios cncontact cncontactviewcontroller

最近我从旧的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)
    }
Run Code Online (Sandbox Code Playgroud)

这很简单.但是如果在CNContactViewController中我编辑用户照片,电话标识符将会改变,即使我没有编辑该控制器中的电话号码.电话标识符可以像这样轻松打印:

po newContact?.phoneNumbers.first?.identifier
Run Code Online (Sandbox Code Playgroud)

这真的搞砸了我的同步,因为用户可能只是更换照片,但电话号码的标识符会改变,我将无法知道发生了什么.如果我编辑其他一些数据,如人名,公司等,这个标识符将不会改变......即使我将手机编辑为其他值,它也会保持不变.但由于某些原因,更改照片会让它完全混乱.

有没有人观察过这个?

以下是测试此https://drive.google.com/file/d/0B9ngBRq15jSuZTBYNVJCaVJ5WGc/view?usp=sharing的示例项目的链接

编辑:我在真正的手机上测试了这个

小智 3

我在 iPhone 8 模拟器上尝试了您的示例项目,但似乎无法重现该问题。这是我设置初始联系人照片后的输出:

\n\n
(lldb) po newContact?.phoneNumbers.first?.identifier\n\xe2\x96\xbf Optional<String>\n  - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"\n\n(lldb) po oldContact?.phoneNumbers.first?.identifier\n\xe2\x96\xbf Optional<String>\n  - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我再次点击按钮并将另一张照片设置为联系人照片后:

\n\n
(lldb) po oldContact?.phoneNumbers.first?.identifier\n\xe2\x96\xbf Optional<String>\n  - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"\n\n(lldb) po newContact?.phoneNumbers.first?.identifier\n\xe2\x96\xbf Optional<String>\n  - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些对我来说看起来都一样。我对您的项目所做的唯一一件事是将 getContact() 中的查找更改为我自己的联系人数据库中存在的标识符。

\n