在本地创建的 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
的代码。结果我一直在使用 UIImagePNGRepresentation
将 UIImage
转换为 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)
}
最近我们的一些用户抱怨联系人没有同步到他们的 iCloud 帐户。它在 iOS 8 中工作,并在 iOS 9 中的一个更新中神秘地停止了。随着 iOS 10 的临近,我认为它可能与 AddressBook.framework
的弃用有关至 Contacts.framework
。然而,即使移动到新的 Contacts.framework 也没有解决问题。
设备控制台上没有错误日志,当联系人在设备上 created/updated 时,两个框架都不会生成任何错误。
联系人在设备上可见和可用,只是不同步到 iCloud 和附加到 iCloud 帐户的其他设备。
经过大量调试后,我能够将问题隔离到 imageData
属性。已填充 imageData
的联系人未同步,少数没有图像的联系人已同步。这让我查看了 imageData
的代码。结果我一直在使用 UIImagePNGRepresentation
将 UIImage
转换为 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)
}