MFMailComposeViewController throws an error only in iOS 9

点点圈 提交于 2019-11-29 01:16:34

The issue is with simulator, on the real device mail composer is working correctly.

As per Apple Developer Forum, more details are here.

The simulator doesn't support mail. You should likely try testing mail functionality in a device.

You should use : [self.window.rootViewController presentViewController:picker animated:YES completion:NULL]; presentModalViewController is DEPRECATED since ios6 is and has been replaced by presentViewController:animated:completion: ie: - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

I have no idea why it happens or how did I discovered it, the crash seems to be generated by setting the NSFontAttributeName in the Appearance proxy for the navigation bar, if I uncomment that line the app crashes.

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

[[UINavigationBar appearance] setTitleTextAttributes:format];

Please @Sleiman try and see if this fixes the issue for you too.

As a simple work around for this problem, you can use "mailto" protocol, it will:

  • Not crash the app (device and simulator)
  • Prompt the user to login if the device has not login with any mail account

Example in 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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!