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:在退出函数之前取消自动变量没有多大意义。]

于 2013-03-14T23:35:44.723 回答
4

只是在这里添加一些数据,这看起来超出了您的控制范围。来自实时应用程序的崩溃数据显示,同样的崩溃发生在数以万计的 11 个用户身上。所有的崩溃都发生在 iOS 5.1 和 5.1.1 的某些版本中,所以看起来问题在 iOS 6 中已经解决了。

正如另一个答案中提到的,您可以将调用包装[MFMailComposeViewController canSendMail]在一个@try { }块中,并且在它引发异常的情况下不执行任何操作。这至少可以防止那些通讯簿损坏的可怜用户崩溃。

于 2013-06-14T19:13:52.443 回答
3

这是 iOS 5 中的一个错误,已在 iOS 6 中解决。它无法在 iOS 5 设备上“修复”,这不是您的错。

这是我要处理的...

我所做的是在我的代码周围放置一个 try/catch,如果这个异常被捕获,我要么:

答:如果用户使用的设备无法升级到 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 回答