Absturzbericht, wenn der Benutzer auf das Adressbuch zugreift

8

In meiner App wird Crashlytics verwendet, um Absturzberichte von Benutzern zu sammeln. Hier ist ein Absturzbericht von einem Benutzer. Es hängt möglicherweise von den Kontaktinformationen des Benutzers ab. Ich kann den Absturz nicht wiederherstellen, da ich nicht weiß, was in seinen Kontakten ist. Hat jemand eine Vorstellung von dieser Situation?

%Vor%

Der Code für 8 SeeYouKee PhoneNumberInputViewController.m line 538-[PhoneNumberInputViewController dofetchContacts:] lautet:

%Vor%

BEARBEITEN 1

%Vor%

Bearbeiten 2

%Vor%     
lu yuan 13.05.2013, 03:04
quelle

3 Antworten

5

Könnte es sein, dass Sie ABAddressBookCreateWithOptions () und / oder ABAddressBookRequestAccessWithCompletion () für einen anderen Thread als den Aufruf von ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering () aufrufen?

Bitte beachten Sie Folgendes aus der API-Dokumentation von Apple:

  

Der Completion-Handler wird in einer beliebigen Warteschlange aufgerufen. Wenn Ihre App in der gesamten App ein Adressbuch verwendet, müssen Sie dafür sorgen, dass die gesamte Verwendung dieses Adressbuchs in einer einzigen Warteschlange ausgeführt wird, um den korrekten threadsicheren Betrieb zu gewährleisten.

Quelle: Ссылка

Alternativ können Sie sicherstellen, dass Sie das ABAddressBookRef, das Sie von ABAddressBookCreateWithOptions () erhalten haben, nicht vorzeitig freigeben. Denken Sie daran, dass ABAddressBookRequestAccessWithCompletion () asynchron ist.

    
salling 28.06.2013, 18:22
quelle
6

Ich sehe, dass der abgestürzte Thread "com.apple.root.default-priority"

ist

ABAddressBook ist NICHT threadsicher, also wenn Sie es aus zwei verschiedenen Threads aufrufen, es löst eine Ausnahme aus und stürzt die App ab .

Auch wenn Sie Ihre Aufrufe immer an DISPATCH_QUEUE_PRIORITY_DEFAULT absetzen, kann es auf zwei verschiedenen Threads ausgeführt werden, da DISPATCH_QUEUE_PRIORITY_DEFAULT keine serielle Warteschlange ist.

Verwenden Sie dies, um Ihre serielle Warteschlange zu erstellen, die an DISPATCH_QUEUE_PRIORITY_DEFAULT sendet:

%Vor%

Denken Sie daran, alle Ihre Anrufe an das Adressbuch an diese Warteschlange zu senden (sync oder async).

BEARBEITEN:

Es sieht so aus, als ob Sie dofetchContacts in einem Completion-Handler-Block aufrufen, der an die Funktion ABAddressBookRequestAccessWithCompletion übergeben wird. Stellen Sie sicher, dass dieser Anruf im Hauptthread gesendet wird!

Die Dokumentation sagt:

  

Der Completion-Handler wird in einer beliebigen Warteschlange aufgerufen. Wenn deine App   verwendet ein Adressbuch in der App, für die Sie verantwortlich sind   Sicherstellen, dass die gesamte Verwendung dieses Adressbuchs an einen einzigen Benutzer gesendet wird   Warteschlange, um den korrekten Thread-sicheren Betrieb sicherzustellen.

    
avishic 23.05.2013 13:35
quelle
0
%Vor%     
Bhavesh Nayi 28.06.2013 10:34
quelle