Ответ 1
Если на устройстве включена хотя бы одна учетная запись электронной почты, следующий вызов должен вернуть YES:
[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?
~ Спасибо
Если на устройстве включена хотя бы одна учетная запись электронной почты, следующий вызов должен вернуть YES:
[MFMailComposeViewController canSendMail]
И наоборот, если все учетные записи отключены/удалены, он вернет NO.
Чтобы +canSendMail
вернуть YES, необходимо настроить учетную запись по умолчанию для отправки писем.
(Внутренне, +[MFMailComposeViewController canSendMail]
вызывает +[MailAccountProxy defaultMailAccountForDelivery]
, который считает, что первая учетная запись электронной почты -isDefaultDeliveryAccount
.)
Это сработало для меня.
В настройках устройства Go → Mail, Contacts, Calendar- > Accounts
Здесь вы можете видеть, что никакая учетная запись не добавлена. Теперь добавить учетную запись, вернитесь к своему приложению, и вы можете найти его возвращение да на этот раз, и вы можете отправить E-mail. Благодаря
В дополнение к тому, что учетная запись электронной почты не настроена на устройстве, canSendMail
также возвращает NO
, когда профиль MDM установлен и настроен, чтобы не разрешать сторонним приложениям отправлять почту. В этом случае вы должны использовать openURL:
с URL-адресом mailto:
для запуска Mail.app и необязательно заполнить поля to, cc, bcc, subject и body.
mailto: RFC - https://tools.ietf.org/html/rfc2368
В случае iOS 10.1 вы можете сначала включить почту из iCloud (в настройках). Затем войдите в свою учетную запись iCloud. После этих изменений все контакты и электронная почта должны быть доступны на вашем симуляторе.
С изменением я могу получить true
из:
MFMailComposeViewController.canSendMail()
Я использую Xcode 8.1 с Swift 3.
Вы не можете быть уверены, что MFMailComposeViewController
должен существовать, потому что ваш метод не различает MFMailComposeViewController
not existing и [MFMailComposeViewController canSendMail]
возвращает NO
.
Какая iPhone OS, на которую вы тестируете, не актуальна; какая версия iPhone SDK, связанная с вашими ссылками на приложения, определяет, будет ли MFMailComposeViewController доступным во время выполнения. Если вы хотите этот класс, вам нужно построить с SDK 3.0 или новее.
Включили ли вы систему обмена сообщениями? У меня была аналогичная проблема, и только потому, что я забыл добавить правильную структуру в проект XCode.
[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]];
}