簡體   English   中英

如何使用UIActivityItemProvider發送帶有UIActivityViewController附件的電子郵件?

[英]How do I use UIActivityItemProvider to send an email with attachment with UIActivityViewController?

我正在嘗試使用UIActivityItemProvider通過電子郵件附件從我的應用程序內共享文件。 我還需要填充電子郵件的主題行,並指定附件的名稱與設備上存儲的文件名稱不同。

這是我正在使用的代碼。 問題是電子郵件中缺少附件。

@interface ItemProvider:UIActivityItemProvider
@property (nonatomic, strong) NSURL *filepath;
@property (nonatomic, strong) NSString *emailBody;
@property (nonatomic, strong) NSString *emailSubject;
@end

@implementation ItemProvider

- (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
    return [NSDictionary dictionary];
}

// The following are two methods in the UIActivityItemSource Protocol
// (UIActivityItemProvider conforms to this protocol) - both methods required
#pragma mark UIActivityItemSource

//- Returns the data object to be acted upon. (required)
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{


    if ([activityType isEqualToString:UIActivityTypeMail]) {
        return @{@"body":self.emailBody, @"url":self.filepath};
    }


    return @{@"body":self.emailBody, @"url":self.filepath};
}

//- Returns the placeholder object for the data. (required)
//- The class of this object must match the class of the object you return from the above method
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    return @{@"body":self.emailBody, @"url":self.filepath};
}

-(NSString *) activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType {
    return self.emailSubject;
}

@end

然后在我的viewController中我這樣做:

      ItemProvider *provider = [[ItemProvider alloc] initWithPlaceholderItem:@{@"body":emailBody, @"url":filePath}];
    provider.emailBody = emailBody;
    provider.emailSubject = info.title;
    provider.filepath = filePath;
    NSArray *activityItems = @[provider];

    // Build a collection of custom activities (if you have any)
//    NSMutableArray *customActivities = [[NSMutableArray alloc] init];


    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];

    [self presentViewController:activityController animated:YES completion:nil];

對於那些仍然在尋求解決方案的人來說,有一個更優雅的解決方案來定制UIActivityViewController 為解決原始問題,附件未顯示的原因是因為它應該是一個單獨的UIActivityItemProvider對象。

所以解決方案是創建兩個UIActivityItemProvider子類,一個包裝'emailBody'和'emailSubject',另一個包裝附件。 使用UIActivityItemProvider進行附件的好處是,您有機會在需要之前延遲處理附件,而不是在呈現UIActivityViewController之前這樣做。

實現AttachmentProvider類以提供如下附件:

@implementation AttachmentProvider : UIActivityItemProvider

- (id)item {
    if ([self.activityType isEqualToString:UIActivityTypeMail]) {

        /* Replace with actual URL to a file. Alternatively
         * you can also return a UIImage.
         */

        return [NSData dataWithContentsOfURL:dataURL];
    }
    return nil;
}

@end

實現EmailInfoProvider類以提供電子郵件正文和主題類,如下所示:

@implementation EmailInfoProvider : UIActivityItemProvider

- (id)item {
    return @"Your email body goes here";
}

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType {
    if ([activityType isEqualToString:UIActivityTypeMail]) {
        return @"Your subject goes here";
    }
    return nil;
}

@end

然后,您可以在viewController中創建一個包含這兩個項目的UIActivityViewController ,如下所示:

- (void)shareAction {

    AttachmentProvider *attachment  = [[AttachmentProvider alloc] init];
    EmailInfoProvider *emailContent = [[EmailInfoProvider alloc] init];

    // You can provider custom -(id)init methods to populate EmailInfoProvider

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[attachment, emailContent] applicationActivities:nil];
    [self presentViewController:activityController animated:YES completion:nil];
}

我發送的電子郵件附件沒有ItemProvider。 它運作良好:-)

NSMutableArray *selDocs = [[NSMutableArray alloc] init];
for (Document *theDoc in self.selectedDocs) {
     NSURL *fileUrl = [NSURL fileURLWithPath:theDoc.filePath];       
    [selDocs addObject:fileUrl];
}
NSArray *postItems = [NSArray arrayWithArray:selDocs];

UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];
[avc setValue:@"Your email Subject" forKey:@"subject"];

avc.completionHandler = ^(NSString *activityType, BOOL completed){
    NSLog(@"Activity Type selected: %@", activityType);
    if (completed) {
        NSLog(@"Selected activity was performed.");
    } else {
        if (activityType == NULL) {
            NSLog(@"User dismissed the view controller without making a selection.");
        } else {
            NSLog(@"Activity was not performed.");
        }
    }
};

[self presentViewController:avc animated:YES completion:nil];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM