2013-02-19 33 views
5

Ich sehe einen seltsamen Absturz nach dem Aufruf von "[MFMailComposeViewController canSendMail]".Warum stürzt MFMailComposeViewController ab?

Ich kann es nicht reproduzieren, es ist von iTunesConnect. Diese Methode (canSendMail) wird aus dem Hauptthread aufgerufen, und an diesem Punkt mache ich keine irgendetwas mit dem Adressbuch.

Jede Idee/Vorschlag wird SEHR VIEL geschätzt.

Vielen Dank im Voraus!

Hinweis: Dies ist in iOS 5.1.1 passiert.

Exception Type: SIGABRT 
Exception Codes: #0 at 0x3583232c 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libsystem_kernel.dylib    0x3583232c __pthread_kill + 8 
1 libsystem_c.dylib     0x347e729f abort + 95 
2 AppSupport       0x3133cc57 abortAfterFailingIntegrityCheck + 39 
3 AppSupport       0x3133ceef runIntegrityCheckAndAbort + 535 
4 AppSupport       0x3133d025 checkResultWithStatement + 113 
5 AppSupport       0x3133ea13 _connectAndCheckVersion + 1059 
6 AppSupport       0x3133eab7 CPSqliteDatabaseConnectionForWriting + 43 
7 AppSupport       0x3133eb8d CPSqliteDatabaseRegisterFunction + 21 
8 AddressBook       0x337873f7 ABCDBContextCreateWithPathAndAddressBook + 215 
9 AddressBook       0x3377b429 ABCCreateAddressBookWithDatabaseDirectoryAndForceInProcessMigrationInProcessLinkingAndResetSortKeys + 233 
10 AddressBook       0x33789cd7 ABAddressBookCreate + 15 
11 Message        0x31072453 MFThreadLocalAddressBook + 87 
12 MessageUI       0x313a5471 +[MFMailComposeController initialize] + 9 
13 libobjc.A.dylib      0x35edc973 _class_initialize + 239 
14 libobjc.A.dylib      0x35edc87b prepareForMethodLookup + 143 
15 libobjc.A.dylib      0x35edc747 lookUpMethod + 47 
16 libobjc.A.dylib      0x35edc713 _class_lookupMethodAndLoadCache3 + 19 
17 libobjc.A.dylib      0x35edbfcb objc_msgSend_uncached + 27 
18 MessageUI       0x313a5455 +[MFMailComposeViewController canSendMail] + 33 

=============

UPDATE:

Der Code-Schnipsel, die diesen Absturz verursacht, ist die folgende:

-(IBAction)helpButtonPressed 
{ 
    if([MFMailComposeViewController canSendMail]) 
    { 
     NSString* mail = self.feedbackSettings[@"mail"]; 
     NSString* title = self.feedbackSettings[@"title"]; 

     MFMailComposeViewController* mailComposer = [[MFMailComposeViewController alloc] init]; 
     mailComposer.mailComposeDelegate = self; 
     mailComposer.toRecipients = @[ mail ]; 
     mailComposer.subject = title; 

     [self presentViewController:mailComposer animated:YES completion:nil]; 
     [mailComposer release], mailComposer = nil; 
    } 
    else 
    { 
     [UIAlertView showAlertViewWithTitle:nil message:NSLocalizedString(@"Please, setup a mail account in your phone first.", nil) buttonTitle:NSLocalizedString(@"OK", nil)]; 
    } 
} 
+0

Es kann sein, dass Sie versuchen, 'MFMailComposeViewController' zu präsentieren, wenn' canSendEmail' '' NO' zurückgibt. – jamapag

+0

Können Sie einen Code anfügen, in dem Sie 'MFMailComposeViewController' erstellen? – jamapag

+0

Nein, ich versuche nicht, MFMailComposeViewController zu präsentieren, wenn canSendEmail NEIN ist. Ich werde die Frage aktualisieren, danke. –

Antwort

7

I Kürzlich wurde ein Absturzbericht von einem Kunden mit iOS 5 angezeigt, der im Wesentlichen ein Duplikat von diesem ist. Meine beste Vermutung ist, dass es durch eine korrupte Adressbuch-Datenbank verursacht wird. Beachten Sie, dass der Absturz in einem Aufruf an ABAddressBookCreate auftritt (was ein irreführender Name ist; es ist mehr wie offen); Es gibt nichts, was du tust, das das verursachen könnte.

Wenn Sie die Kontrolle über das Adressbuch haben und es irgendwo synchronisieren, können Sie versuchen, die Synchronisierung zu deaktivieren, alle Kontakte zu löschen und sie dann wieder zu synchronisieren (natürlich zuerst sichern).

MFMailComposeViewController greift vermutlich auf das Adressbuch zu, um dem Benutzer An: Adressen anzubieten.

[Nit. Nicht viel Sinn, in nil'ing eine automatische Variable, kurz bevor Sie eine Funktion verlassen]

+1

Danke für die Zeit des Schreibens!. Ja, ich dachte dasselbe, es sieht wie ein korruptes Adressbuch aus. (Nein, ich bin nicht synchronisiert). In Bezug auf Nil'ing-Variablen hast du recht, aber es besteht immer ein implizites Risiko, dass ein anderer Entwickler deinen Code erweitert und * möglicherweise * die Veröffentlichung verpasst! –

4

Nur einige Daten hier hinzufügen, das sieht aus wie etwas, das außerhalb Ihrer Kontrolle ist. Crash-Daten von einer Live-App zeigen den gleichen Absturz bei 11 Benutzern aus Zehntausenden. Alle Abstürze traten bei einigem Geschmack von iOS 5.1 und 5.1.1, so sieht es aus wie das Problem in iOS behoben wurde 6.

Wie in einer anderen Antwort erwähnt, Sie den Anruf [MFMailComposeViewController canSendMail] in einem @try { } Block wickeln können, und nichts tun, wenn eine Ausnahme ausgelöst wird. Dies wird zumindest verhindern, dass diese armen Benutzer mit beschädigten Adressbüchern abstürzen.

+0

Konkreter auf Fragen gestellt werden. – tuxnani

+0

Ich sehe das immer noch in Crashlytics, und tatsächlich stürzt jeder, der abstürzt, auf iOS 5.1 oder 5.1.1. – Pascal

3

Dies ist ein Fehler in iOS 5, der in iOS 6 gelöst wurde. Er kann nicht auf iOS 5-Geräten "repariert" werden und ist nicht deine Schuld. Hier

ist, was ich tue, es zu handhaben ...

Was ich getan habe, setzen eine try/catch um meinen Code, und wenn diese Ausnahme gefangen, ich entweder:

A: Wenn sich der Benutzer auf einem Gerät befindet, das NICHT auf iOS 6 aufgerüstet werden kann (Geräte, die älter sind und NICHT auf dieser Liste stehen: http://ipod.about.com/od/iPhoneQandA/f/What-Devices-Are-Ios-6-Compatible.htm), erscheint ein Popup-Fenster mit dem Hinweis, dass Apple einen Fehler verursacht hat, den wir nicht kontrollieren oder beheben können. und dass nur ein neueres iOS-Gerät dieses Problem behebt.

OR

B: Wenn der Benutzer auf einem Gerät, das 6 iOS aktualisiert werden kann, öffnet sich ein Dialog, der Benutzer zu dem Fehler wissen lässt, und weist sie auf iOS 6 zu aktualisieren, das Problem in Zukunft zu beheben .

Hoffentlich behandelt das auf die beste Weise.

+0

Danke für deine Hilfe Ethan. Wir werden die iOS 5-Unterstützung in ein paar Wochen einstellen, was die Dinge noch einfacher macht! –

+0

Hallo, haben Sie irgendwelche Informationen darüber, was der Fehler ist? Ebenso wie Jorge und andere mit ähnlichen Problemen verwende ich AddressBook nicht selbst - wo hast du diese Ausnahme behandelt? – David

+0

@Ethan, ich versuche, irgendeine Dokumentation oder Verifizierung dieses iOS 5 Bugs von Apple zu finden. Kannst du mich auf irgendetwas hinweisen? – XJones