iOS: как создать / подготовить пользовательское вложение электронной почты в фоновом режиме, когда уже отображается представление составления почты?
Я хотел бы поделиться пользовательским контентом своего приложения для iOS 6.0 по электронной почте.
Но так как моему контенту требуется некоторое время для подготовки, прежде чем я смогу поделиться им, мне не удается показать представление составления почты сразу, когда пользователь нажимает кнопку "Поделиться". К сожалению, MFMailComposeViewController нужны все вложения с самого начала, поэтому мне нужно дождаться вложения, прежде чем я смогу инициализировать и показать MFMailComposeViewController (как это предлагается здесь: UIActivityView прикрепить файл к электронной почте)
- Редактируйте после прочтения ответа Сапана: мне нужно поведение, подобное UIActivityViewController, когда вы делитесь, например, видеофайлом, который еще должен быть создан: пользователь нажимает кнопку "Поделиться", и сразу же появляется UIActivityController. Вложение создается в фоновом режиме, и создание не прерывает работу пользователя. -
Я попробовал UIActivityViewController с его приятной асинхронной функцией UIActivityItemProvider, но, к сожалению, это работает только для вложений с публичными типами пантомимы, такими как изображения и видео. Мой пользовательский "элемент" NSData просто игнорируется не только для публикации на Facebook (что имеет смысл), но и для обмена электронной почтой. Или я здесь что-то не так делаю
MyUIActivityItemProvider *myCustomDocProvider = [[MyUIActivityItemProvider alloc] initWithPlaceholderItem:[[NSData alloc]init] andCustomInfoToCreateNSDataFrom:customAppInfo];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:@[myTextString, myCustomDocProvider] applicationActivities:nil];
[self presentViewController:activityVC animated:YES completion:nil];
Я уже думаю о создании собственного настраиваемого представления компоновщика электронной почты, чтобы я мог создавать вложения в фоновом режиме, пока пользователь печатает. Но я не хочу. Мне нравится идея "согласованности элементов пользовательского интерфейса", о которой я читал на HIG.
Что я могу сделать?
3 ответа
Вы можете создать метод следующим образом, а затем вызвать его, используя [self performSelectorInBackground:@selector(sendMail)];
-(void) sendMail
{
// Prepare the data
// Attach the data
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
[picker addAttachmentData:myData mimeType:@"<YOUR-MIME-TYPE>" fileName:@"Filename"];
// Show compose view controller on the main thread
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Fill out the email body text
NSString *emailBody = @"Body";
[picker setMessageBody:emailBody isHTML:NO];
[self presentModalViewController:picker animated:YES];
});
}
Это можно сделать с помощью логического значения в myCustomDocProvider для удержания возврата элемента до завершения построения файла. Если вы хотите показать прогресс или индикатор активности на главном экране, вы можете сделать это, вызвав его из основного потока. Вот фрагмент кода этого в действии:
Установите контроллер представления активности в вашем провайдере с помощью этой функции, чтобы загрузить представление прогресса.
self.parentViewController = parentVc;
Вот функция элемента с загрузкой блокировки и просмотра обратной связи.
self.wait = true;
[self prepareFile:^(){
[self performSelectorOnMainThread:@selector(dismissProgressView)
withObject:nil waitUntilDone:NO];
}];
[self performSelectorOnMainThread:@selector(loadProgressView)
withObject:nil waitUntilDone:NO];
while (self.wait) {
[self performSelectorOnMainThread:@selector(updateProgressView)
withObject:nil waitUntilDone:NO];
}
return self.completedUrl;
Затем вы можете создать три функции, которые вызываются в главном потоке, чтобы показать представление прогресса, обновить представление прогресса, ожидая завершения файла. В реализации функции dismissProgressView убедитесь, что для логического значения ожидания установлено значение false, когда dismissViewController завершен.
Что вы можете сделать, так это установить почтовое тело в HTML с изображениями или мультимедиа, на которые ссылается удаленный сервер. Затем пользователь увидит испорченное изображение в представлении составления письма (возможно, вы можете скрыть это, используя какой-то умный HTML), но во время получения почты загрузка должна быть завершена.
Не оптимально, потому что он может потерпеть неудачу после отправки электронного письма, но, вероятно, ваш лучший выбор