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:
BEARBEITEN 1
%Vor%Bearbeiten 2
%Vor%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.
Ich sehe, dass der abgestürzte Thread "com.apple.root.default-priority"
istABAddressBook 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.
Tags und Links ios abaddressbook crash-reports