Подтвердить что ты не робот

MFMailComposeViewController выдает ошибку только в iOS 9

Я не могу открыть MFMailComposeViewController, не бросая фатальную ошибку в iOS 9 Simulator.

Тот же код (Objective C) работает безупречно в iOS 8.x и ниже, но сегодня я установил Xcode 7 beta 5, и когда я запустил приложение на iOS 9 Simulator, я получил диалоговое окно под названием "MailCompositionService неожиданно завершено" и когда я просматриваю отчет об ошибке, я вижу:

Информация о приложении: *** Завершение приложения из-за неотображенного исключения "NSInvalidArgumentException", причина: '- [__ NSArrayI isEqualToString:]: непризнанный селектор, отправленный экземпляру 0x7fd314280b10'

завершение с неперехваченным исключением типа NSException abort() CoreSimulator 179 - Устройство: iPhone 6 - Runtime: 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.

Буду признателен за то, как найти причину этой ошибки. Спасибо!

4b9b3361

Ответ 1

Проблема заключается в симуляторе, на реальном устройстве почтовый композитор работает правильно.

Ответ 2

В соответствии с форумом разработчиков Apple более подробно здесь.

Симулятор не поддерживает почту. Вероятно, вам следует попробовать проверить почту функциональности в устройстве.

Ответ 3

Вы должны использовать: [self.window.rootViewController presentViewController:picker animated:YES completion:NULL]; presentModalViewController DEPRECATED, поскольку ios6 заменен на presentViewController:animated:completion: то есть:   - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

Ответ 4

Я понятия не имею, почему это происходит или как я его обнаружил, авария, похоже, генерируется установкой NSFontAttributeName в прокси-сервере Appearance для панели навигации, если я раскомментирую эту строку, когда приложение сработает.

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

[[UINavigationBar appearance] setTitleTextAttributes:format];

Пожалуйста, попробуйте @Sleiman и посмотрите, исправляет ли это проблему для вас.

Ответ 5

Как простая работа для этой проблемы, вы можете использовать протокол mailto, это будет:

  • Не сбой приложения (устройства и симулятора)
  • Попросите пользователя войти в систему, если устройство не зарегистрировалось в любой почтовой учетной записи.

dUhNm.png

Пример в быстрой:

Swift 3.0

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.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.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)