MFMailComposeViewController仅在iOS 9中引发错误

时间:2015-08-18 16:43:23

标签: ios objective-c ios9

我无法打开MFMailComposeViewController而不会在iOS 9模拟器中抛出致命错误。

相同的代码(目标C)在iOS 8.x及更低版本中完美运行但今天我安装了Xcode 7 beta 5,当我在iOS 9模拟器上运行应用程序时,我得到一个标题为" MailCompositionService quit的对话框出乎意料"当我查看错误报告时,我看到:

  

特定应用信息:   ***因未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [__ NSArrayI isEqualToString:]:无法识别的选择器发送到实例0x7fd314280b10'

     

以NSException类型的未捕获异常终止   abort()调用   CoreSimulator 179 - 设备:iPhone 6 - 运行时:iOS 9.0(13A4325c) - DeviceType:iPhone 6

邮件撰写视图出现时发生错误。它会冻结几秒钟然后出现错误对话框。

打开邮件撰写视图的代码是:

if ([MFMailComposeViewController canSendMail])
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [picker setSubject:@"Comment title"];
    [picker setMessageBody:@"Comment description" isHTML:NO];

    [self.window.rootViewController presentModalViewController:picker animated:YES];
    [picker release];
}

如果有必要知道,在应用崩溃之前,mailComposeController:didFinishWithResult:error: = resultMFMailComposeResultCancelled = error会调用nil

我很欣赏如何找到此错误原因的提示。谢谢!

5 个答案:

答案 0 :(得分:15)

问题在于模拟器,在真实设备上邮件编辑器工作正常。

答案 1 :(得分:6)

根据Apple Developer Forum,更多详情为here

  

模拟器不支持邮件。您应该尝试测试邮件   设备中的功能。

答案 2 :(得分:1)

你应该使用: [self.window.rootViewController presentViewController:picker animated:YES completion:NULL]; presentModalViewController已弃用,因为ios6已被presentViewController:animated:completion:取代 即:      - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

答案 3 :(得分:0)

我不知道为什么会发生这种情况或者我是如何发现它的,如果我取消注释应用程序崩溃的那一行,似乎是通过在导航栏的外观代理中设置NSFontAttributeName来生成崩溃。

    NSDictionary* format = @{
                         NSForegroundColorAttributeName:[UIColor whiteColor],
                         //NSFontAttributeName: [UIFont boldSystemFontOfSize:20],
                         };

[[UINavigationBar appearance] setTitleTextAttributes:format];

请@Sleiman尝试看看这是否也为您解决了这个问题。

答案 4 :(得分:0)

作为解决此问题的简单方法,您可以使用" mailto"协议,它将:

  • 不会崩溃应用程序(设备和模拟器)
  • 如果设备未使用任何邮件帐户登录,则提示用户登录

swift中的示例:

Swift 3.0

let mailRecipient = "support@abc.com"
let mailSubject = "Help with ABC for iOS"
let mailBody = "xxx"

let mailTo = "mailto:\(mailRecipient)?subject=\(mailSubject)&body=\(mailBody)"

guard let escapedMailTo = mailTo.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
    NSLog("Invalid mail to format")
    return
}

guard let url = NSURL(string: escapedMailTo) else {
    NSLog("Invalid mail to format: \(escapedMailTo)")
    return
}

UIApplication.sharedApplication().openURL(url)

Swift 2.3

let mailRecipient = "support@abc.com"
let mailSubject = "Help with ABC for iOS"
let mailBody = "xxx"

let mailTo = "mailto:\(mailRecipient)?subject=\(mailSubject)&body=\(mailBody)"

guard let escapedMailTo = mailTo.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()) else {
    NSLog("Invalid mail to format")
    return
}

guard let url = NSURL(string: escapedMailTo) else {
    NSLog("Invalid mail to format: \(escapedMailTo)")
    return
}

UIApplication.sharedApplication().openURL(url)