項目中有個下載檔案功能,下載後需要能查看,總不能為每一種類型的檔案寫個查看功能吧.
好在iOS有個UIDocumentInteractionController ,可以幫你調起手機上已安裝的應用來查看檔案.
首先要配置一下info.plist檔案,告訴系統哪些類型的檔案需要使用UIDocumentInteractionController來開啟
也可以用在代碼裡設定UTI這個屬性,我沒試過哈,
plist裡面可以一波帶走,簡單省事
總結一下差不多就這些吧:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>com.myapp.common-data</string>
<key>LSHandlerRank</key>
<string>Default</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>
直接粘到info.plist就可以了.
先遵守這個代理協議:UIDocumentInteractionControllerDelegate
然後是代碼部分:
// 拿到下載的檔案路徑 NSString *filePath = [[LGDownloadManager sharedInstance] getFilePathWithURL:fileModel.url];;if (filePath == nil) return;// 轉成URLNSURL *url = [NSURL fileURLWithPath:filePath]; if (url) { self.documentVC = [UIDocumentInteractionController interactionControllerWithURL:url]; [self.documentVC setDelegate:self]; BOOL canOpen = [self.documentVC presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES]; // 返回NO說明沒有可以開啟該檔案的愛屁屁, 友情提示一下 if (canOpen == NO) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"沒有找到可以開啟該檔案的應用" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; [alert show]; }}
填坑: self.documentVC這個對象只在這一處用了, 我直接 UIDocumentInteractionController *documentVC = ..... 不就行了.
我一開始就是這麼乾的,既然提了,那結果可想而知,還是太年輕了.
為什麼不行嘞?
documentVC對像如果不被引用,出了大括弧就被釋放掉了,都成nil了,自然是彈不出來的,所有他必須作為self的一個成員變數被引用才能保證不被過早釋放掉