雖然它出現,目前的mailto:設置郵件主題和正文不工作的解決方案,這將在任何情況下都不是如果您想要將電子郵件正文設置爲包含HTML,並且仍然通過UIActivityViewController使用Apple的系統電子郵件圖標,那麼就足夠了。
這正是我們想要做的:使用系統圖標,但讓電子郵件包含HTML正文和自定義主題。
我們的解決方案是一種黑客攻擊,但至少現在它運行良好。它確實涉及使用MFMailComposeViewController,但它仍然允許您使用帶有UIActivityViewController的系統郵件圖標。
第1步:創建一個包裝類符合UIActivityItemSource像這樣:
@interface ActivityItemSource : NSObject <UIActivityItemSource>
@property (nonatomic, strong) id object;
- (id) initWithObject:(id) objectToUse;
@end
@implementation ActivityItemSource
- (id) initWithObject:(id) objectToUse
{
self = [super init];
if (self) {
self.object = objectToUse;
}
return self;
}
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
return self.object;
}
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return self.object;
}
第2步:子類UIActivityViewController並使其成爲一個MFMailComposeViewControllerDelegate像這樣:
@interface ActivityViewController : UIActivityViewController <MFMailComposeViewControllerDelegate>
@property (nonatomic, strong) id object;
- (id) initWithObject:(id) objectToUse;
@end
@implementation ActivityViewController
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
{
case MFMailComposeResultSent:
case MFMailComposeResultSaved:
//successfully composed an email
break;
case MFMailComposeResultCancelled:
break;
case MFMailComposeResultFailed:
break;
}
//dismiss the compose view and then the action view
[self dismissViewControllerAnimated:YES completion:^() {
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}];
}
- (id) initWithObject:(id) objectToUse
{
self = [super initWithActivityItems:[NSArray arrayWithObjects:[[ActivityItemSource alloc] initWithObject:objectToUse], nil] applicationActivities:nil];
if (self) {
self.excludedActivityTypes = [NSArray arrayWithObjects: UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, nil];
self.object = objectToUse;
}
return self;
}
注:當您正在呼叫super initWithActivityItems
您正在包裝您將在您的自定義活動項目中分享的對象活動項目
第3步:當用戶點擊郵件圖標時,啓動您自己的MFMailComposeViewController而不是系統。
你會在ActivityItemSource類的activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
方法做到這一點:
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
if([activityType isEqualToString:UIActivityTypeMail]) {
//TODO: fix; this is a hack; but we have to wait till apple fixes the inability to set subject and html body of email when using UIActivityViewController
[self setEmailContent:activityViewController];
return nil;
}
return self.object;
}
- (void) setEmailContent:(UIActivityViewController *)activityViewController
{
MFMailComposeViewController *mailController = [ShareViewController mailComposeControllerWithObject: self.object withDelegate: activityViewController];
[activityViewController presentViewController:mailController animated:YES completion:nil];
}
在mailComposeControllerWithObject
方法實例化MFMailComposeViewController類的一個實例,並將它設置爲包含任何你想要的數據。另請注意,您可以將activityViewController
設置爲撰寫視圖的委託。
這樣做的原因是,當顯示撰寫模式時,它會阻止顯示其他模式,即顯示自己的撰寫視圖會阻止顯示系統撰寫視圖。絕對是黑客,但它完成了工作。
希望這會有所幫助。
非常恐怖的解決方法 – Andy
你能分享完整的例子嗎? – Rajeev
這對任何人都有效嗎?如果是的話,你可以分享完整的代碼嗎? – mKane