在本地创建的 CNContact(s) 未同步到 iCloud 帐户

CNContact(s) created locally are not synced to iCloud account

最近我们的一些用户抱怨联系人没有同步到他们的 iCloud 帐户。它在 iOS 8 中工作,并在 iOS 9 中的一个更新中神秘地停止了。随着 iOS 10 的临近,我认为它可能与 AddressBook.framework 的弃用有关至 Contacts.framework。然而,即使移动到新的 Contacts.framework 也没有解决问题。

设备控制台上没有错误日志,当联系人在设备上 created/updated 时,两个框架都不会生成任何错误。

联系人在设备上可见和可用,只是不同步到 iCloud 和附加到 iCloud 帐户的其他设备。

经过大量调试后,我能够将问题隔离到 imageData 属性。已填充 imageData 的联系人未同步,少数没有图像的联系人已同步。这让我查看了 imageData 的代码。结果我一直在使用 UIImagePNGRepresentationUIImage 转换为 NSData for imageData。移动到 UIImageJPEGRepresentation 解决了这个问题。日期已保存,iCloud 帐户已同步。

感谢 Apple 没有记录此更改。 (即使没有记录也可能是图像大小)

本地创建的 CNContact(s) 未同步到第三方应用程序。

我在 iphone 联系人中创建了联系人 page.Those 我的联系人未同步 application.I 已使用以下方法从我的联系人框架中获取联系人。

设备控制台上没有错误日志,当联系人在设备上 created/updated 时,两个框架都不会生成任何错误。

联系人在设备上可见和可用,只是没有同步到我的 app.I 已允许我的应用程序访问我的联系人。

@available(iOS 10.0, *)
func retrieveContacts(_ completion: (_ success: Bool, _ contacts: [ContactEntry]?) -> Void) {
    var contacts = [ContactEntry]()
    do {
        let contactsFetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor, CNContactImageDataAvailableKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor])
        try contactStore.enumerateContacts(with: contactsFetchRequest, usingBlock: { (cnContact, error) in
            if let contact = ContactEntry(cnContact: cnContact) {
                contacts.append(contact)
                print(contact,contacts.count)
            }
        })
        completion(true, contacts)
    } catch {
        completion(false, nil)
    }
    
    let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName),CNContactPhoneNumbersKey] as [Any]
    let fetchRequest = CNContactFetchRequest( keysToFetch: keysToFetch as! [CNKeyDescriptor])
    var contacts1 = [CNContact]()
    
    if #available(iOS 10.0, *) {
        fetchRequest.mutableObjects = false
    } else {
        // Fallback on earlier versions
    }
    fetchRequest.unifyResults = true
    fetchRequest.sortOrder = .userDefault
    
    let contactStoreID = CNContactStore().defaultContainerIdentifier()
    print("\(contactStoreID)")
    
    
    do {
        
        try CNContactStore().enumerateContacts(with: fetchRequest) { (contact, stop) -> Void in
            
                contacts1.append(contact)
            print(contact)
        }
    } catch let e as NSError {
        print(e.localizedDescription)
    }