iOS 地址簿 - 获取联系人图像崩溃
iOS AddressBook - get contact image crash
AddressBook 存在一些我无法重现的问题,代码在我的 iPhone 和 iPad 上运行,这发生在客户端 phone 上并导致应用程序崩溃。据我从 Crashlytics 中看到的问题应该在以下行中:
let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
阅读通讯录的完整代码如下:
var err : Unmanaged<CFError>? = nil
let addressBookRef : ABAddressBook? = ABAddressBookCreateWithOptions(nil, &err).takeRetainedValue()
if addressBookRef == nil {
print(err)
return
}
let contacts = ABAddressBookCopyArrayOfAllPeople(addressBookRef).takeRetainedValue() as NSArray as [ABRecord]
for contact in contacts {
let firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as? String
let lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as? String
var image: UIImage?
if ABPersonHasImageData(contact) {
let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
if let img = UIImage(data: data) {
image = img
}
}
…
}
您对客户端可能发生的情况有任何建议 phone 以便我重现此错误吗?是否有可能某些联系人已损坏?我该如何处理?
我已经看到这个 post ABPersonCopyImageData 可以 return 零,我试图处理它,但应用程序仍然崩溃。
也许您应该测试数据本身而不是 UIImage,并初始化 UIImageView 而不是 UIImage。
if let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
image = UIImage(data: data)
}
检查全部是否为零。如果 ABPersonCopyImageDataWithFormat returns 为 nil,则在 nil 上调用 takeRetainedValue。然后也使用它 nil 来创建图像
guard let CFData = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail) else {
print("no cfdata")
return
}
if let data = CFData.takeRetainedValue {
if let img = UIImage(data: data) {
image = img
}
}
AddressBook 存在一些我无法重现的问题,代码在我的 iPhone 和 iPad 上运行,这发生在客户端 phone 上并导致应用程序崩溃。据我从 Crashlytics 中看到的问题应该在以下行中:
let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
阅读通讯录的完整代码如下:
var err : Unmanaged<CFError>? = nil
let addressBookRef : ABAddressBook? = ABAddressBookCreateWithOptions(nil, &err).takeRetainedValue()
if addressBookRef == nil {
print(err)
return
}
let contacts = ABAddressBookCopyArrayOfAllPeople(addressBookRef).takeRetainedValue() as NSArray as [ABRecord]
for contact in contacts {
let firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as? String
let lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as? String
var image: UIImage?
if ABPersonHasImageData(contact) {
let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
if let img = UIImage(data: data) {
image = img
}
}
…
}
您对客户端可能发生的情况有任何建议 phone 以便我重现此错误吗?是否有可能某些联系人已损坏?我该如何处理?
我已经看到这个 post
也许您应该测试数据本身而不是 UIImage,并初始化 UIImageView 而不是 UIImage。
if let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
image = UIImage(data: data)
}
检查全部是否为零。如果 ABPersonCopyImageDataWithFormat returns 为 nil,则在 nil 上调用 takeRetainedValue。然后也使用它 nil 来创建图像
guard let CFData = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail) else {
print("no cfdata")
return
}
if let data = CFData.takeRetainedValue {
if let img = UIImage(data: data) {
image = img
}
}