2013-02-19 19 views
5

Widzę dziwną awarię po wywołaniu "[MFMailComposeViewController canSendMail]".Dlaczego występuje błąd MFMailComposeViewController?

Nie mogę tego odtworzyć, pochodzi z iTunesConnect. Ta metoda (canSendMail) jest wywoływana z głównego wątku iw tym momencie nie robię niczego, co jest z książką adresową.

Każdy pomysł/sugestia będzie BARDZO doceniony.

Z góry dziękuję!

Uwaga: Stało się to w systemie iOS 5.1.1.

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:

Fragment kodu, który powoduje tę katastrofę jest następujący:

-(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

Możliwe, że próbujesz przedstawić 'MFMailComposeViewController', gdy' canSendEmail' zwróci 'NO'. – jamapag

+0

Czy możesz dołączyć fragment kodu, w którym tworzysz 'MFMailComposeViewController'? – jamapag

+0

Nie, nie próbuję przedstawić MFMailComposeViewController, gdy canSendEmail jest NIE. Zaktualizuję pytanie, dzięki. –

Odpowiedz

7

I Niedawno zobaczyłem raport o awariach od klienta z systemem iOS 5, który jest w zasadzie duplikatem tego. Domyślam się, że jest to spowodowane uszkodzoną bazą danych książki adresowej. Zauważ, że awaria następuje w wywołaniu ABAddressBookCreate (która jest mylącą nazwą, jest bardziej otwarta); nic nie robisz, co powinno być w stanie spowodować to.

Jeśli masz kontrolę nad książką adresową i zsynchronizujesz ją gdzieś, możesz spróbować wyłączyć synchronizację, usunąć wszystkie kontakty, a następnie zsynchronizować je z powrotem (oczywiście najpierw wykonaj kopię zapasową).

MFMailComposeViewController uzyskuje dostęp do książki adresowej, prawdopodobnie, aby zaoferować użytkownikowi: Adresy.

[Nit. Nie ma sensu nil'ing do automatycznej zmiennej tuż przed zakończyć funkcję]

+1

Dziękujemy za poświęcenie czasu na pisanie !. Tak, pomyślałem to samo, wygląda na uszkodzoną książkę adresową. (Nie, nie synchronizuję). Jeśli chodzi o zmienne nil'ing, masz rację, ale zawsze istnieje ukryte ryzyko, że jakiś inny programista rozszerzy Twój kod i * potencjalnie * chybi wydanie !. –

4

Wystarczy dodać jakieś dane tutaj, to wygląda jak coś, co jest poza kontrolą. Zawieszenie danych z aplikacji na żywo pokazuje tę samą awarię, która zdarza się 11 użytkownikom na dziesiątki tysięcy. Wszystkie awarie wystąpiły w niektórych wersjach systemu iOS 5.1 i 5.1.1, więc wygląda na to, że problem został rozwiązany w iOS 6.

Jak wspomniano w innej odpowiedzi, możesz zawinąć połączenie pod numer w bloku @try { }, i nic nie rób w przypadku, gdy zgłasza wyjątek. To przynajmniej zapobiegnie awariom tych biednych użytkowników z uszkodzonymi książkami adresowymi.

+0

Może być bardziej szczegółowy na zadane pytanie. – tuxnani

+0

Wciąż widzę to w Crashlytics, a nawet każdy, kto się zawiesza, jest nadal na iOS 5.1 lub 5.1.1. – Pascal

3

To jest błąd w iOS 5, który został rozwiązany w iOS 6. Nie można go "naprawić" na urządzeniach z systemem iOS 5 i nie jest to Twoja wina.

Oto, co zrobić, aby go obsługiwać ...

Co robiłem to umieścić try/catch wokół mojego kodu, a jeśli ten wyjątek zostanie złapany, to albo:

A: Jeśli użytkownik znajduje się na urządzeniu, które NIE MOŻE zostać uaktualnione do systemu iOS 6 (urządzenia starsze, a NIE na tej liście: http://ipod.about.com/od/iPhoneQandA/f/What-Devices-Are-Ios-6-Compatible.htm), z wdziękiem wyskakuj okno dialogowe z informacją, że napotkaliśmy błąd spowodowany przez firmę Apple, której nie możemy kontrolować ani naprawić, i że tylko nowsze urządzenie iOS rozwiązuje ten problem.

LUB

B: Jeśli użytkownik korzysta z urządzenia, które można uaktualnić iOS 6, pojawi się okno dialogowe, które pozwala użytkownikom wiedzieć o tym błąd i instruuje ich uaktualnienie do iOS 6, aby rozwiązać ten problem w przyszłości .

Mam nadzieję, że obsługuje to w najlepszy sposób.

+0

Dzięki za pomoc Ethan. Za kilka tygodni udostępnimy wsparcie dla systemu iOS 5, co jeszcze bardziej ułatwi sprawę. –

+0

Witam, czy masz jakieś informacje na temat tego, czym jest błąd? Podobnie jak Jorge i inni z podobnymi problemami nie używam samej Książki adresowej - gdzie umieściłeś tę obsługę wyjątku? – David

+0

@ethan, próbuję znaleźć jakąkolwiek dokumentację lub weryfikację tego błędu iOS 5 od Apple. Czy możesz mi coś wskazać? – XJones

Powiązane problemy