2016-04-27 13 views
0

私は再現できないAddressBookに問題があります。私のiPhoneとiPadでコードが動作します。これはクライアントの電話機で起こり、アプリがクラッシュします。私の知る限りCrashlyticsの問題から見ることができるように行を次のようにする必要があります。ここではiOSアドレス帳 - 連絡先イメージのクラッシュを受け入れる

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を返す可能性があると私はそれを処理しようとしましたが、アプリはまだクラッシュしています。

+0

「それを処理しようとしました」というコードを入力してください。リンクされた投稿は、オプションのデータを適切に扱うように見えます。 –

+0

このコードをnil image contact –

+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 
    } 
} 
0

UIImageではなくデータ自体をテストし、UIImageViewの代わりにUIImageViewを初期化する必要があります。

if let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue() 
    image = UIImage(data: data) 
}