web-dev-qa-db-ja.com

MFMailComposeViewControllerは、iOS9でのみエラーをスローします

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で呼び出されます。

このエラーの原因を見つける方法のヒントを教えていただければ幸いです。ありがとう!

20
Sleiman

問題はシミュレータにあり、実際のデバイスではメールcomposerが正しく機能しています。

15
Borzh

Apple開発者フォーラムによると、詳細は こちら です。

シミュレータはメールをサポートしていません。デバイスでメール機能をテストしてみてください。

6
Ashvin Ajadiya

次を使用する必要があります:[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);

1
Idali

なぜ発生するのか、どのようにして発見したのかわかりません。アプリがクラッシュする行のコメントを外すと、ナビゲーションバーの外観プロキシでNSFontAttributeNameを設定することでクラッシュが発生するようです。

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

[[UINavigationBar appearance] setTitleTextAttributes:format];

@Sleimanで問題が解決するかどうか試してみてください。

0
dev_jac

この問題の簡単な回避策として、「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)
0
Yuchen Zhong