Как добавить несколько вложений электронной почты с помощью UIActivityItemProvider
Я работаю над приложением для iOS, в котором я хочу добавить НЕСКОЛЬКО вложений в электронное письмо, используя UIActivityItemProvider. Я хочу сделать это с помощью UIActivityItemProvider, потому что я не хочу нести накладные расходы при обработке записи, прежде чем отобразить UIActivtyViewController для пользователя. Если я передаю одно изображение с использованием объекта NSData или NSURL в элемент "url" возвращаемого объекта, то встроенное изображение отображается нормально. Если я передам массив этих объектов, то ничего не появится. Я считаю, что передача массива будет работать, если я буду использовать параметр ActivityItems при инициализации NSActivityViewController, но, опять же, я не хочу этого делать, потому что я хочу воспользоваться преимуществами отложенной обработки, доступной с помощью UIActivityItemProvider. Ниже мой код
@implementation NoteRecordActivityProvider
- (id)initWithPlaceholderItem:(id)placeholderItem
{
//Initializes and returns a provider object with the specified placeholder data
return [super initWithPlaceholderItem:placeholderItem];
}
- (id)item
{
// //Generates and returns the actual data object
NSData *imageFile = [[NSData alloc]init];
NSString *imageFileName;
NSURL *url;
NSString* exportPath;
NSMutableArray* imageArray = [[NSMutableArray alloc]initWithCapacity:0];
NSInteger photoCount = self.noteRecord.photoCount;
for (NSInteger i = 0; i < photoCount; i+=1)
{
//Add File Attachment
PhotoObject *po = (PhotoObject*)[self.noteRecord photoObjects:i];
NSString *photoGUID = [(PhotoObject*)[self.noteRecord photoObjects:i]GUID];
imageFile = ImageDataReturningMethodHere;
imageFileName = [[NSArray arrayWithObjects:@"Image", [NSString stringWithFormat:@"%ld", (long)i], @".png", nil] componentsJoinedByString:@""];
exportPath = [[FileSystemProvider exportPath] stringByAppendingPathComponent:imageFileName];
[imageFile writeToFile:exportPath atomically:YES];
url = [NSURL fileURLWithPath:exportPath];
[imageArray addObject:url];
}
if ([self.activityType isEqualToString:UIActivityTypeMail])
return imageArray;
else
return nil;
}
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return @{@"body":@"", @"url":[[NSURL alloc]init]};
}
-(NSString *) activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType {
return [NSString stringWithFormat:@"Attached Record: %@", self.noteRecord.title];
}
@end
1 ответ
Я нашел ответ на этот вопрос. Сначала я создал PhotoAttachmentActivityProvider, у которого было свойство для исходного документа, содержащего фотографию, которую я хотел прикрепить, и индекс для вложения в этом документе. Я вставляю свой код, который использует пользовательский документ под названием NoteRecord:
@interface EMailPhotoAttachmentItemProvider : UIActivityItemProvider
@property (nonatomic, readwrite) NSInteger photoIndex;
@property (nonatomic, strong) NoteRecord* noteRecord;
@end
Затем, когда я показываю UIActivityViewController, я добавляю 1 из этих пользовательских объектов UIActivityItemProvider для каждого вложения:
for (NSInteger i = 0; i < self.noteRecord.photoCount; i++)
{
EMailPhotoAttachmentItemProvider* photoProvider = [[EMailPhotoAttachmentItemProvider alloc]initWithPlaceholderItem:@{@"body":textToShare, @"url":url}];
photoProvider.photoIndex = i;
photoProvider.noteRecord = self.noteRecord;
[activityProviders addObject:photoProvider];
}
//Initialize the ActivityViewController
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityProviders applicationActivities:applicationActivities];
Затем в пользовательском UIActivityItemProvider я проверяю, обрабатываю ли я EMAIL, и затем создаю URL для изображения, используя предоставленный документ и индекс изображения:
#import "EMailPhotoAttachmentItemProvider.h"
#import "MiscUtilities.h"
#import "FileSystemProvider.h"
@implementation EMailPhotoAttachmentItemProvider
- (id)initWithPlaceholderItem:(id)placeholderItem
{
//Initializes and returns a provider object with the specified placeholder data
return [super initWithPlaceholderItem:placeholderItem];
}
- (id)item
{
if ([self.activityType isEqualToString:UIActivityTypeMail])
{
// Code here gets the image file from the NoteRecord at the PhotoIndex provided to
// the UIActivityItemProvider at the imageIndex, creates a URL for that image and returns it here.
// Your implementation will vary
PhotoObject *po = (PhotoObject*)[self.noteRecord photoObjects:self.photoIndex];
NSString *photoGUID = [(PhotoObject*)[self.noteRecord photoObjects:self.photoIndex]GUID];
NSData *imageFile = [[[MiscUtilities getApplicationDelegate]imageProvider]imageDataWithCaptionFromGUID:photoGUID caption:po.caption maxResolution:600];
NSString *imageFileName = [[NSArray arrayWithObjects:@"Image", [NSString stringWithFormat:@"%ld", (long)self.photoIndex], @".png", nil] componentsJoinedByString:@""];
imageFileName = [[FileSystemProvider exportPath] stringByAppendingPathComponent:imageFileName];
[imageFile writeToFile:imageFileName atomically:YES];
NSURL *url = [NSURL fileURLWithPath:imageFileName];
return url;
}
else
{
return nil;
};
}
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
NSString* defaultImagePath = [[FileSystemProvider imagePath]stringByAppendingPathComponent:@"default.png"];
NSURL *url = [[NSURL alloc]initWithString:defaultImagePath];
return @{@"body":@"", @"url":url};
}
@end