2012-09-28 26 views
8

我正在遷移使用UIActivityViewController在iOS6中共享,但我無法弄清楚如何創建電子郵件附件對象,以便在通過電子郵件分享時包含在內。使用iOS6連接對象UIActivityViewController

在iOS5中相應的代碼是:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
[picker addAttachmentData:data mimeType:@"application/XXX" fileName:fileName]; 

回答

24

您對UIActivityViewController的控制非常有限,但是如果您附加了衆所周知的MIME類型,我發現您可以通過在文件URL中提供關聯的文件擴展名使其正常工作。例如,如果你的附件是一個電子名片,請在該文件的URL「的.vcf」擴展名:

NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
// The file extension is important so that some mime magic happens! 
NSString *filePath = [docsPath stringByAppendingPathComponent:@"vcard.vcf"]; 
NSURL *fileUrl  = [NSURL fileURLWithPath:filePath]; 

[data writeToURL:fileUrl atomically:YES]; // save the file 

// Now pass the file URL in the activity items array 
UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems: 
    @[@"Here's an attached vCard", fileUrl] applicationActivities:nil]; 
[vc presentModalViewController:avc animated:YES]; 
+0

這實際上工作,感謝markiv :)我將這與另一個指南關於如何爲應用程序創建自定義文件(例如使用.myApp的文件),並得到它與fileURL一起工作。 – Setomidor

+1

對不起,提出這個老問題,但不應該[數據writeToURL:filePath atomically:YES]''[data writeToURL:fileURL atomically:YES]'? –

+0

@GabrielePetronella是或我相信[data writeToFile:filePath atomically:YES]也可以。 –

0

從我可以告訴你不能用UIActivityViewController做到這一點 - 我甚至不能設法使目前的HTML內容的郵件正文 - 所以你最好使用SLComposeViewController。

+0

有可能通過標記你把這個字符串變成活動項目與 ...添加HTML內容 - 只有這樣,它被解釋爲HTML。 – SMSidat

+0

@SMSidat你確定嗎?這正是我所做的,它是字面呈現(即不解釋爲HTML) –

+0

我很確定 - 我已經做到了,它的工作原理。我並不是真的想要劫持這個問答線程,所以如果你已經有了這個問題,我會很樂意在那裏幫助你,或者你可以用你的代碼的相關部分創建一個新的問題,而我看看我能做什麼 – SMSidat

2

大家很奇怪,爲什麼他們的文件沒有使用UIActivityViewController像Dropbox和其他通用文件的應用程序所共享處理應用程序,你真正想要的是一個UIDocumentInteractionController。

使用它是這樣的:

class ViewController { 
    var openInController:UIDocumentInteractionController! 

    init() { 
     openInController = UIDocumentInteractionController(URL: docURL) 
    } 

    func shareDoc { 
     openInController.presentOptionsMenuFromRect(CGRectZero, inView: self.view, animated: true) 
    } 
}