AddressBook存在一些我无法重现的问题,代码适用于我的iPhone和iPad,这种情况发生在客户端手机上并导致应用程序崩溃。据我所知,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
}
}
…
}
您对客户手机上可能发生的事情有什么建议吗?我可以重现此错误吗?某些联系是否可能已损坏?我该怎么办呢?
我看过这篇帖子Get iOS contact image with ABPersonCopyImageData,ABPersonCopyImageData可以返回nil,我试图处理,但app仍在崩溃。
答案 0 :(得分:1)
全部检查是否为零。如果ABPersonCopyImageDataWithFormat返回nil,则在nil上调用takeRetainedValue。然后用它来创建图像
guard let CFData = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail) else {
print("no cfdata")
return
}
if let data = CFData.takeRetainedValue {
if let img = UIImage(data: data) {
image = img
}
}
答案 1 :(得分:0)
也许您应该测试数据本身而不是UIImage,并初始化UIImageView而不是UIImage。
if let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue()
image = UIImage(data: data)
}