iOS AddressBook - 获取联系人图像崩溃

时间:2016-04-27 13:43:30

标签: ios swift contacts

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仍在崩溃。

2 个答案:

答案 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)
}