UIDocumentInteractionController和UIActivityViewController主要都是用來完成app間文件傳輸?shù)墓δ埽ㄒ簿褪莻髡f中的進(jìn)程間交互)扮匠,很多人將他當(dāng)做是一種系統(tǒng)原生的分享方案宅倒。具體如何實(shí)現(xiàn)在此就不做贅述了崔涂,很多前輩都寫過相關(guān)的文章蠕啄,非常詳盡。
這篇文章主要解決的問題是:
通過UIDocumentInteractionController/UIActivityViewController把文件分享給第三方app,之前本來用的好好的,怎么到了iOS11就毫無反應(yīng)了呢?
解決問題的關(guān)鍵點(diǎn)就是:copy文件到沙盒窄驹。
對(duì)褪秀,就是這么簡(jiǎn)單牵现,但也就是這么出人意料诸老。實(shí)際應(yīng)用中拒迅,大多數(shù)分享的文件可能都是保存在沙盒里的寓调;但是综膀,一般做Demo的時(shí)候呻征,大多可能就是拖個(gè)文件到boundle中谆级,這也就造成了后續(xù)分享文件功能毫無反應(yīng)的結(jié)果洞拨。
來說說具體怎么改進(jìn)吧扯罐。
- 首先,如果你要分享的文件是在boundle中烦衣,那么就一定要先把他copy到沙盒中歹河,然后把沙盒路徑傳給UIDocumentInteractionController/UIActivityViewController;
- 既然做了copy花吟,那么大多數(shù)情況下也同樣需要remove掉秸歧,不然應(yīng)用所占體積會(huì)越來越大,當(dāng)然衅澈,如果你有特殊需求除外键菱。但是remove需要放在哪里進(jìn)行呢?
1 - 對(duì)UIActivityViewController 來說今布,他有一個(gè)屬性completionWithItemsHandler经备,這是用戶完成/取消選擇的回調(diào)拭抬,在回調(diào)中刪除沙盒中copy過去的文件,并不影響三方app獲取文件侵蒙,因?yàn)榇藭r(shí)文件已經(jīng)被復(fù)制到了三方的沙盒中造虎,默認(rèn)是/Documents/Inbox中。
2 - 對(duì)于UIDocumentInteractionController纷闺,其分享彈窗有兩套方法:OpenInMenu 和 OptionsMenu算凿,甚至連代理方法都有對(duì)應(yīng)的兩套:
- (void)documentInteractionControllerDidDismissOptionsMenu:(UIDocumentInteractionController *)controller;
- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller;
從方法名就可以看出來,這兩個(gè)方法也是分享彈窗在消失時(shí)調(diào)用的代理方法急但,因此根據(jù)你彈出分享彈窗的方式在相應(yīng)的代理方法中實(shí)現(xiàn)remove文件的操作即可澎媒。
- 如果你的app需要接收別人分享過來的文件,那么在什么地方接收呢波桩?
在UIDocumentInteractionController的官方文檔《Document Interaction Programming Topics for iOS》中
You receive information about the file to be opened in the
application:willFinishLaunchingWithOptions:
orapplication:didFinishLaunchingWithOptions:
method of your application delegate. If your application handles custom file types, you must implement this delegate method (instead of theapplicationDidFinishLaunching:
method) and use it to initialize your application.
建議使用application:willFinishLaunchingWithOptions:或application:didFinishLaunchingWithOptions:方法來接收分享過來的文件信息,但經(jīng)過我的實(shí)踐發(fā)現(xiàn):
無論iOS11還是iOS10请敦,無論是UIDocumentInteractionController還是UIActivityViewController:
1.當(dāng)接收app在后臺(tái)時(shí)镐躲,有其他app向其分享文件,都會(huì)執(zhí)行
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
方法侍筛;
2.接收app在完全退出的情況下萤皂,有其他app向其分享文件,會(huì)先后執(zhí)行
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
和
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法匣椰。
因此個(gè)人建議統(tǒng)一在openURL方法中處理即可裆熙。
還有一個(gè)很坑的地方,就是UIDocumentInteractionController的強(qiáng)引用問題禽笑。在iOS11之前入录,如果不強(qiáng)引用,則會(huì)直接崩潰佳镜;而在iOS11中僚稿,不崩潰了~ 我原本天真的以為,是修好了~然而我還是太年輕蟀伸。蚀同。。僅僅只是把崩潰修好了而已0√汀4缆纭!你可能沒太理解我的意思吧迟蜜?崩潰修好了不就是好了嗎刹孔?是“只”有崩潰好了!后面的功能還是不能用小泉!還得強(qiáng)引用才能正常使用芦疏!我勒個(gè)擦冕杠!以前還有報(bào)錯(cuò)信息可循,現(xiàn)在直接就是毫無反應(yīng)酸茴,讓人更加懵圈分预!簡(jiǎn)直爆炸啊P胶础A浴!
還有就是這個(gè)copy文件的問題酪穿,我也沒有在任何官方文檔中看到凳干,因?yàn)閕OS11出來之后,和UIDocumentInteractionController還有UIActivityViewController相關(guān)的所有文檔被济,Guide救赐,Sample Code等等都沒有過任何更新。只磷。经磅。感覺又是Apple自己悄悄弄的呢。钮追。预厌。(如果有小伙伴能找到相關(guān)的官方說明,敬請(qǐng)賜教元媚,非常感謝T础)
特別鳴謝
我全網(wǎng)只在這個(gè)帖子的9樓看到了copy的解決方法(他說的是copy到cache中,實(shí)測(cè)到Document也沒有問題)刊棕,鳴謝這位做好事不留名的英雄炭晒。