Danut Pralea * ответ великолепен, однако код кажется слишком длинным для того, кто ищет простой способ до отправитьвложение по электронной почте программно .
Суть
Я сократил его ответ, чтобы вычеркнуть только важные биты, а также рефакторинг его так:
MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;
mailComposer.subject = @"Sample subject";
mailComposer.toRecipients = @[@"arthur@example.com", @"jeanne@example.com", ...];
mailComposer.ccRecipients = @[@"nero@example.com", @"mashu@example.com", ...];
[mailComposer setMessageBody:@"Sample body" isHTML:NO];
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
[mailComposer addAttachmentData:fileData
mimeType:mimeType
fileName:fileName];
[self presentViewController:mailComposer animated:YES completion:nil];
По сути, это суть, этого достаточно, как есть.Например, если вы добавите этот код к действию кнопки, появится экран составления электронного письма с предварительно заполненными соответствующими полями, а также файл, который вы хотите прикрепить к электронному письму.
Дополнительная литература
Framework
MFMailComposeViewController
находится под MessageUI
Framework, поэтому для его использования следует импортировать (если вы этого не сделалипока) Фреймворк выглядит так:
#import <MessageUI/MessageUI.h>
Проверка работоспособности почты
Теперь, когда вы запускаете исходный код и еще не настроили почтовую учетную запись на своемустройство (не уверен, что поведение на симуляторе), этот код приведет к сбою вашего приложения.Похоже, что если учетная запись почты еще не настроена, выполнение [[MFMailComposeViewController alloc] init]
все равно приведет к тому, что mailComposer
будет равен нулю, вызовет сбой .Поскольку ответ в связанном вопросе гласит:
Вы должны проверить, может ли MFMailComposeViewController отправлять вашу почту непосредственно перед отправкой
Вы можете сделатьэто с помощью метода canSendMail следующим образом:
if (![MFMailComposeViewController canSendMail]) {
[self openCannotSendMailDialog];
return;
}
Вы можете исправить это перед выполнением [[MFMailComposeViewController alloc] init]
, чтобы вы могли немедленно уведомить пользователя.
Обработка notSendMail
Если canSendMail
возвращает false, согласно Apple Dev Docs, это означает, что устройство не настроено для отправки почты.Это может означать , что, возможно, пользователь еще не настроил свою учетную запись Mail.Чтобы помочь пользователю с этим, вы можете предложить открыть приложение Почта и настроить его учетную запись.Вы можете сделать это следующим образом:
NSURL *mailUrl = [NSURL URLWithString:@"message://"];
if ([[UIApplication sharedApplication] canOpenURL:mailUrl]) {
[[UIApplication sharedApplication] openURL:mailUrl];
}
Затем вы можете реализовать openCannotSendMailDialog
следующим образом:
- (void)openCannotSendMailDialog
{
UIAlertController *alert =
[UIAlertController alertControllerWithTitle:@"Error"
message:@"Cannot send mail."
preferredStyle:UIAlertControllerStyleAlert];
NSURL *mailUrl = [NSURL URLWithString:@"message://"];
if ([[UIApplication sharedApplication] canOpenURL:mailUrl]) {
[alert addAction:
[UIAlertAction actionWithTitle:@"Open Mail"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:mailUrl];
}]];
[alert addAction:
[UIAlertAction actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * _Nonnull action) {
}]];
} else {
[alert addAction:
[UIAlertAction actionWithTitle:@"OK"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * _Nonnull action) {
}]];
}
[self presentViewController:alert animated:YES completion:nil];
}
Mime Types
Есликак и я, вы забыли / не уверены, какой mimeType
использовать, здесь - это ресурс, который вы можете использовать.Скорее всего, достаточно text/plain
, если прикрепляемый файл представляет собой простой текст или image/jpeg
/ image/png
для изображений.
Делегат
Как вы, вероятно, заметили, XCode выдает нам предупреждение в следующей строке:
mailComposer.mailComposeDelegate = self;
Это потому, что мы еще не настроили себя на соответствие соответствующему протоколу и реализацию его метода делегата.Если вы хотите получать события, независимо от того, была ли почта отменена, сохранена, отправлена или даже не прошла отправку, вам нужно настроить свой класс на соответствие протоколу MFMailComposeViewControllerDelegate
и обработать следующие события :
- MFMailComposeResultSent
- MFMailComposeResultSaved
- MFMailComposeResultCancelled
- MFMailComposeResultFailed