2016-04-27 4 views
0

Es gibt ein Problem mit AddressBook, das ich nicht reproduzieren kann, funktioniert Code auf meinem iPhone und iPad, geschieht dies auf dem Client-Telefon und führen zum Absturz der App. Soweit ich aus Crashlytics Problem in folgende Zeile sein sollte sehen:iOS AddressBook - Kontakt Bild absturz

let data = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue() 

Hier vollständigen Code für das Lesen Adressbuch:

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 
      } 

     } 


     … 
} 

Haben Sie Vorschläge haben, was so auf Kunden Telefon passieren könnte Ich kann diesen Fehler reproduzieren? Ist es möglich, dass ein Kontakt beschädigt ist? Wie soll ich damit umgehen?

Ich habe diesen Beitrag Get iOS contact image with ABPersonCopyImageData gesehen, dass ABPersonCopyImageData Null zurückgeben konnte, ich versuchte, damit umzugehen, aber App stürzt immer noch ab.

+0

Könnten Sie den Code eingeben, der "versucht, das zu handhaben" bitte? Der verlinkte Beitrag sieht so aus, als würde er die optionalen Daten richtig behandeln. –

+0

Sie sollten versuchen, diesen Code mit Null Bild Kontakt –

+0

zu überprüfen Könnten Sie bitte Stack-Trace und/oder Fehlermeldung zu Ihrer Frage hinzufügen. –

Antwort

1

Überprüfen Sie alle für Null. Wenn ABPersonCopyImageDataWithFormat null zurückgibt, rufen Sie takeRetainedValue auf null auf. und dann benutze es nil, um ein Bild zu erstellen

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

Vielleicht sollten Sie die Daten selbst und nicht die UIImage testen und auch eine UIImageView statt einer UIImage initialisieren.

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