IOS 9シミュレーターで致命的なエラーをスローせずに、MFMailComposeViewControllerを開くことができません。
同じコード(Objective C)はiOS 8.x以下で問題なく動作しますが、今日Xcode 7ベータ5をインストールし、iOS 9シミュレーターでアプリを実行すると、「MailCompositionServiceが予期せず終了しました」というタイトルのダイアログボックスが表示されます。エラーレポート、私は見ます:
アプリケーション固有の情報:***キャッチされない例外 'NSInvalidArgumentException'によりアプリを終了します、理由: '-[__ NSArrayI isEqualToString:]:認識されないセレクターがインスタンス0x7fd314280b10に送信されました'
coreSimulator 179と呼ばれるタイプNSExceptionのキャッチされない例外で終了するabort()-デバイス:iPhone 6-ランタイム:iOS 9.0(13A4325c)-デバイスタイプ: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:
はresult
= MFMailComposeResultCancelled
およびerror
= nil
で呼び出されます。
このエラーの原因を見つける方法のヒントを教えていただければ幸いです。ありがとう!
問題はシミュレータにあり、実際のデバイスではメールcomposerが正しく機能しています。
Apple開発者フォーラムによると、詳細は こちら です。
シミュレータはメールをサポートしていません。デバイスでメール機能をテストしてみてください。
次を使用する必要があります:[self.window.rootViewController presentViewController:picker animated:YES completion:NULL];
presentModalViewController is deprecated for ios6 is and is置き換えられたpresentViewController:animated:completion:
ie:-(void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);
なぜ発生するのか、どのようにして発見したのかわかりません。アプリがクラッシュする行のコメントを外すと、ナビゲーションバーの外観プロキシでNSFontAttributeNameを設定することでクラッシュが発生するようです。
NSDictionary* format = @{
NSForegroundColorAttributeName:[UIColor whiteColor],
//NSFontAttributeName: [UIFont boldSystemFontOfSize:20],
};
[[UINavigationBar appearance] setTitleTextAttributes:format];
@Sleimanで問題が解決するかどうか試してみてください。
この問題の簡単な回避策として、「mailto」プロトコルを使用できます。
Swiftの例:
スイフト3.
let mailRecipient = "[email protected]"
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.
let mailRecipient = "[email protected]"
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)