5

「[MFMailComposeViewController canSendMail]」を呼び出した後、奇妙なクラッシュが発生します。

再生できません。iTunesConnect からのものです。そのメソッド (canSendMail) はメイン スレッドから呼び出されており、その時点では、アドレス帳に対して何もしていません。

任意のアイデア/提案は非常に高く評価されます.

前もって感謝します!

注: これは 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

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

アップデート:

このクラッシュの原因となるコードのスニペットは次のとおりです。

-(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)];
    }
}
4

3 に答える 3

7

私は最近、iOS 5 を実行している顧客からのクラッシュ レポートを見ましたが、これは本質的にこれと同じものです。私の推測では、アドレス帳データベースの破損が原因であると思われます。クラッシュは への呼び出しで発生することに注意してくださいABAddressBookCreate(これは紛らわしい名前ですが、open に似ています); これを引き起こすことができるはずのあなたがしていることは何もありません。

アドレス帳を管理していて、どこかで同期している場合は、同期をオフにし、すべての連絡先を削除してから、もう一度同期してみてください (もちろん、最初にバックアップします)。

MFMailComposeViewControllerおそらく、ユーザーに To: アドレスを提供するために、アドレス帳にアクセスしています。

[Nit: 関数を終了する直前に自動変数を nil してもあまり意味がありません。]

于 2013-03-14T23:35:44.723 に答える
3

これは、iOS 6 で解決された iOS 5 のバグです。iOS 5 デバイスでは「修正」できず、ユーザーの責任ではありません。

これが私がそれを処理するために行うことです...

私が行ったことは、コードの周りに try/catch を配置することです。この例外がキャッチされた場合は、次のいずれかを行います。

A: ユーザーが iOS 6 にアップグレードできないデバイスを使用している場合 (以前のデバイスで、このリストにないデバイス: http://ipod.about.com/od/iPhoneQandA/f/What-Devices-Are-Ios-6 -Compatible.htm )、Apple が原因で制御または修正できないエラーが発生したこと、および新しい iOS デバイスのみがこの問題を修正することを示すダイアログを適切にポップします。

また

B: ユーザーが iOS 6 にアップグレードできるデバイスを使用している場合は、ユーザーにそのバグについて知らせるダイアログを表示し、将来的に問題を修正するために iOS 6 にアップグレードするように指示します。

うまくいけば、これが最善の方法で処理されます。

于 2013-06-16T21:11:30.727 に答える