Document Interaction是為你的app提供把文件傳輸給其它app和接收其它app傳來的文件的功能,網(wǎng)上的Document Interaction教程都是比較老的,為此附上2016最新Document Interaction教程。
注冊應(yīng)用程序支持的文件類型
打開項目的info.plist文件,在其中加上
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>wzzyinqiang.guangyao-s-data</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.microsoft.powerpoint.ppt</string>
<string>public.item</string>
<string>com.microsoft.word.doc</string>
<string>com.adobe.pdf</string>
<string>com.microsoft.excel.xls</string>
<string>public.image</string>
<string>public.content</string>
<string>public.composite-content</string>
<string>public.archive</string>
<string>public.audio</string>
<string>public.movie</string>
<string>public.text</string>
<string>public.data</string>
</array>
</dict>
</array>
這其中有不少配置屬性,一個一個講解。
CFBundleDocumentTypes這是一個主屬性,它代表你的app有著多種CFBundleTypeName,每種CFBundleTypeName有一個名字。
LSHandlerRank這是另一個屬性,它代表你的app接收到文件后是保存到沙盒還是其它的處理方式,Owner是保存到沙盒,這里我推薦大家就用Owner就可以了。(注意一定要是Owner,網(wǎng)上有的資料是owner,首字母如果沒有大寫,在上傳ipa時會報ERROR ITMS-90151的錯誤,當(dāng)時這個問題糾結(jié)了我好久……)
LSItemContentTypes這是你所支持的文件類型屬性,可以看到下面是一個array,其中有不少的文件類型,這里大家直接復(fù)制上面的就好,它包含了大部分的文件類型。
如何監(jiān)測你的app收到了文件?
如果你的app處于掛起狀態(tài),并以“其它應(yīng)用打開”這種方式重新激活了你的app,那么你可以在
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(nullableNSString*)sourceApplication annotation:(id)annotation
這個函數(shù)中來接收到該文件的url,用調(diào)用函數(shù)[NSData dataWithContentsOfURL:url]獲取到這個文件的data就可以對它操作了。
如果你的app根本沒有被打開,那么你可以在啟動函數(shù)
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
調(diào)用[launchOptions[UIApplicationLaunchOptionsURLKey]即可獲取到這個文件的url了。
創(chuàng)建并呈現(xiàn)DocumentInteraction Controller
self.documentController= [UIDocumentInteractionControllerinteractionControllerWithURL:[NSURLfileURLWithPath:self.file_path]];
[self.documentControllerpresentOpenInMenuFromRect:CGRectZeroinView:self.viewanimated:YES];
self是當(dāng)前的vc。
這里把documentController作為成員變量是因為如果你把documentController作為局部變量來創(chuàng)建和使用,在presentOpenInMenuFromRect函數(shù)調(diào)用后該局部變量就會被銷毀,因為已經(jīng)沒有指針指向它了,不知道這是不是一個官方bug,也可能是因為arc的問題,總之把它設(shè)置為成員變量是最簡單直接的解決辦法。
上面兩條代碼會造成短暫的卡頓,推薦把第一條代碼放到子線程。
DocumentInteraction Controller本身并不復(fù)雜,代碼量也很小,只是有一些配置的地方要注意。