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

Когда [MFMailComposeViewController canSendMail] вернется NO

В моем приложении iPhone используется класс MFMailComposeViewController для отправки электронного письма с приложением. Приложение будет пытаться отобразить диалог почтового композитора, если метод "canSendMail" класса MFMailComposeViewController возвращает true (YES). В частности, если следующий метод возвращает ДА, он показывает композитор почты, в противном случае пользователю будет предоставлено диалоговое окно с предупреждением об ошибке, указывающее, что на устройстве не установлены учетные записи электронной почты:

- (BOOL)canDeviceSendEmail
{
    Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
    return mailClass != nil && [mailClass canSendMail];
}

Команда тестировщиков сообщила, что они получают это диалоговое окно с предупреждением об ошибках, даже если на устройстве настроены учетные записи электронной почты. Тестер использовал iPhone 3G с ОС 3.1.3. Поэтому класс MFMailComposeViewController должен существовать, и метод canSendMail должен возвращать NO.

Поэтому мой вопрос: кроме случаев, когда на устройстве не установлены учетные записи электронной почты, в каких других случаях метод "canSendMail" возвращает NO?

~ Спасибо

4b9b3361

Ответ 1

Если на устройстве включена хотя бы одна учетная запись электронной почты, следующий вызов должен вернуть YES:

[MFMailComposeViewController canSendMail]

И наоборот, если все учетные записи отключены/удалены, он вернет NO.

Ответ 2

Чтобы +canSendMail вернуть YES, необходимо настроить учетную запись по умолчанию для отправки писем.

(Внутренне, +[MFMailComposeViewController canSendMail] вызывает +[MailAccountProxy defaultMailAccountForDelivery], который считает, что первая учетная запись электронной почты -isDefaultDeliveryAccount.)

Ответ 3

Это сработало для меня.

В настройках устройства Go → Mail, Contacts, Calendar- > Accounts

Здесь вы можете видеть, что никакая учетная запись не добавлена. Теперь добавить учетную запись, вернитесь к своему приложению, и вы можете найти его возвращение да на этот раз, и вы можете отправить E-mail. Благодаря

Ответ 4

В дополнение к тому, что учетная запись электронной почты не настроена на устройстве, canSendMail также возвращает NO, когда профиль MDM установлен и настроен, чтобы не разрешать сторонним приложениям отправлять почту. В этом случае вы должны использовать openURL: с URL-адресом mailto: для запуска Mail.app и необязательно заполнить поля to, cc, bcc, subject и body.

mailto: RFC  - https://tools.ietf.org/html/rfc2368

Ответ 5

В случае iOS 10.1 вы можете сначала включить почту из iCloud (в настройках). Затем войдите в свою учетную запись iCloud. После этих изменений все контакты и электронная почта должны быть доступны на вашем симуляторе.

С изменением я могу получить true из:

MFMailComposeViewController.canSendMail()

Я использую Xcode 8.1 с Swift 3.

Ответ 6

Вы не можете быть уверены, что MFMailComposeViewController должен существовать, потому что ваш метод не различает MFMailComposeViewController not existing и [MFMailComposeViewController canSendMail] возвращает NO.

Какая iPhone OS, на которую вы тестируете, не актуальна; какая версия iPhone SDK, связанная с вашими ссылками на приложения, определяет, будет ли MFMailComposeViewController доступным во время выполнения. Если вы хотите этот класс, вам нужно построить с SDK 3.0 или новее.

Ответ 7

Включили ли вы систему обмена сообщениями? У меня была аналогичная проблема, и только потому, что я забыл добавить правильную структуру в проект XCode.

Ответ 8

[MFMailComposeViewController canSendMail] вернет НЕТ, если у вас нет учетной записи электронной почты на устройстве. В этом случае вы можете открыть почтовое приложение по следующему коду:

- (void)openMailApp {
    NSString *recipients = @"mailto:?cc=&subject=";
    NSString *body = @"&body=";
    NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
    email = [email stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
}