Когда [MFMailComposeViewController canSendMail] вернет НЕТ - PullRequest
42 голосов
/ 20 марта 2010

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

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

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

Поэтому мой вопрос: кроме случая, когда на устройстве не настроены учетные записи электронной почты, при каких других обстоятельствах метод canSendMail может возвращать НЕТ?

~ Спасибо

Ответы [ 9 ]

70 голосов
/ 09 сентября 2010

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

[MFMailComposeViewController canSendMail]

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

10 голосов
/ 20 марта 2010

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

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

7 голосов
/ 16 октября 2015

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

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

3 голосов
/ 08 сентября 2014

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

В настройках устройства Go-> Почта, Контакты, Календарь-> Учетные записи

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

1 голос
/ 25 октября 2017

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

- (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]];
}
1 голос
/ 17 ноября 2016

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

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

MFMailComposeViewController.canSendMail()

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

0 голосов
/ 12 марта 2018

Ответ Владимира без устарелых функций:

    NSString *recipients = @"mailto:testingEmail@example.com?subject=emailsubject";

    NSString *body = @"&body=body:";
    NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
    email = [email stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email] options:@{} completionHandler:^(BOOL success) {
    }];
0 голосов
/ 21 марта 2010

Вы включили Messaging Framework? Однажды у меня была похожая проблема, и это было только потому, что я забыл добавить правильную структуру в проект XCode.

0 голосов
/ 20 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...