将联系人地址保存到统一联系人会导致(CNErrorDomain 错误 500)

Saving Contact Address to Unified Contact results in (CNErrorDomain error 500)

我的应用程序中存在一个奇怪的错误,我找不到任何 workarounds/fixes。出于某种原因,我能够将地址保存到未与社交资料(Facebook、Twitter 等)统一的联系人。但是,当我尝试为我的联系人添加与 Facebook 或 Twitter 统一的地址时,我收到一个奇怪的保存错误:

The operation couldn’t be completed. (CNErrorDomain error 500.)

这是我正在使用的一些代码:

    if mutableContact.isKeyAvailable(CNContactPostalAddressesKey) {
        var postalAddresses = [CNLabeledValue<CNPostalAddress>]()

        for address in self.contactAddresses {
            let postalAddress: CNLabeledValue<CNPostalAddress> = CNLabeledValue(label: CNLabelOther, value: address)
            postalAddresses.append(postalAddress)
        }

        mutableContact.postalAddresses = postalAddresses
    }

    let saveRequest = CNSaveRequest()

    if isNewContact {
        saveRequest.add(mutableContact, toContainerWithIdentifier: nil)
    } else {
        saveRequest.update(mutableContact)
    }

    do {
        try contactStore.execute(saveRequest)
    } catch let error as NSError {
        print(error.localizedDescription)
        let alertController = UIAlertController(title: "Failed to save/update contact!", message: "Unfortunatly, the app couldn't add or make modifications to your contact. Please try again or use the Contacts app to preform changes.", preferredStyle: .alert)
        let cancelAction = UIAlertAction(title: "Okay", style: .cancel) {
            action in
            self.dismiss(animated: true, completion: nil)
        }
        alertController.addAction(cancelAction)
        self.present(alertController, animated: true, completion: nil)
    }

好的,所以我收到了 Apple 的回复,这种行为是有意为之的。开发人员应检测到此政策违规行为,然后主动提出创建新联系人,然后 link 两个联系人。

我理解 Apple 这样做的原因,因为社交帐户不会存储与(比如说)iCloud 联系人相同的所有数据,因此您需要将这些值保存在其他地方,(并且您无法转换联系人到 iCloud,因为社交帐户将丢失其数据。)

不过,我认为您不能通过编程方式选择 link 联系人,可以吗?

据我了解,iOS 将决定两个联系人是否相同 - 可能当不止一个值匹配时(?)您可以检测两个给定的联系人是否 link 在一起。