在调用“[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)];
}
}
答案 0 :(得分:7)
我最近看到了运行iOS 5的客户的崩溃报告,该报告基本上与此版本重复。我最好的猜测是它是由一个损坏的地址簿数据库引起的。请注意,崩溃发生在对ABAddressBookCreate
的调用中(这是一个误导性的名称;它更像是打开的);你没有做任何应该能够引起这种情况的事。
如果您可以控制地址簿,并且在同一地点进行同步,则可以尝试关闭同步,删除所有联系人,然后再将它们同步(当然首先备份)。
MFMailComposeViewController
正在访问地址簿,可能是为了向用户提供:地址。
[尼特:在退出函数之前,自动变量没有多大意义。]
答案 1 :(得分:4)
只是在这里添加一些数据,这看起来像是你无法控制的。来自实时应用程序的崩溃数据显示同样的崩溃发生在11万用户中,数万人。所有的崩溃都发生在iOS 5.1和5.1.1的某些版本中,所以看起来问题已经在iOS 6中解决了。
如另一个答案中所述,您可以将[MFMailComposeViewController canSendMail]
块中的@try { }
调用包裹起来,并且在抛出异常的情况下不执行任何操作。这至少可以防止那些地址簿损坏的不良用户崩溃。
答案 2 :(得分: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设备可以解决此问题。
OR
B:如果用户所在的设备可以升级到iOS 6,请弹出一个对话框,让用户知道该错误,并指示他们升级到iOS 6以便将来解决问题。
希望以最好的方式解决这个问题。