gpt4 book ai didi

ios - 如何使用 UIActivityItemProvider 通过 UIActivityViewController 发送带有附件的电子邮件?

转载 作者:IT王子 更新时间:2023-10-29 08:10:32 58 4
gpt4 key购买 nike

我正在尝试使用 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];
}

关于ios - 如何使用 UIActivityItemProvider 通过 UIActivityViewController 发送带有附件的电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20581389/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com