UIDocumentInteractionController之程序間文檔共享

iOS中的沙盒可以讓平臺更加的安全,這也是沙盒給用戶帶來的最主要好處。不過由于沙盒的嚴格限制,導致程序之間共享數據比較麻煩。一般在程序間共享文檔可以通過UIDocumentInteractionController類實現通訊。它支持在你的app中用其他app預覽和顯示文檔。同時也支持文件關聯,允許其他app通過你的程序打開文件。這些技術包括了UIKit中提供的UIDocumentInteractionController類(UIDocumentInteractionController Class Reference),以及Quick Look框架(Quick Look Framework Reference)。

本文將就如何在應用之間進行文件共享進行基本探究。還請大牛勿噴。

蘋果官方文檔

效果圖

文件共享

跨APP傳文件

預覽文檔和呈現選項菜單

如果你的app需要打開它不支持的文件(PDF文件、圖像文件,等等),或者需要將app的文件傳輸給另外一個允許接收此類型文件的app時。可以使用文件交互控制器(UIDocumentInteractionController類的實例)為用戶提供可接收程序來處理文件,說的簡單點就是通過Quick Look框架判斷文檔是否能被另一個app打開和預覽。

UIDocumentInteractionController在iOS3.2中就已經存在了,使用起來非常靈活,功能也比較強大。它除了支持同設備上app之間的文檔共享外,還可以實現文檔的預覽、打印、發郵件以及復制。

要使用一個文件交互控制器(UIDocumentInteractionController類的實例),需要以下步驟:

  1. 為每個你想打開的文件創建一個UIDocumentInteractionController類的實例
  2. 實現UIDocumentInteractionControllerDelegate代理
  3. 顯示預覽窗口/顯示菜單。

一、創建實例

DocumentInteraction Controller使用靜態方法interactionControllerWithURL創建實例,這個方法使用一個NSURL作為參數。

//創建實例
NSURL *filePath = [NSURL fileURLWithPath:path];UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];

二、顯示預覽窗口

Document Interaction Controller對象使用presentPreviewAnimated方法彈出一個全屏的文檔預覽窗口。

BOOL b = [documentController presentPreviewAnimated:YES];

三、顯示菜單

如果你不想在本應用里面打開文件,那么可以通過第三方應用打開預覽文件。通過OptionsMenu(選項菜單),顯示能夠接收該類型文件的應用,由用戶選擇相應的操作。

顯示菜單可以使用下列方法:

- presentOptionsMenuFromRect:inView:animated:
- presentOptionsMenuFromBarButtonItem:animated:
- presentOpenInMenuFromRect:inView:animated:
- presentOpenInMenuFromBarButtonItem:animated:

這些方法都是類似的,只是顯示位置有區別而已。以下代碼演示其中一個方法的使用。

CGRect navRect = self.navigationController.navigationBar.frame;
navRect.size = CGSizeMake(1500.0f, 40.0f);
[documentController presentOptionsMenuFromRect:navRectinView:self.viewanimated:YES];

四、使用委托

如果你顯示一個Document Interaction Controller ,則必需要為delegate屬性用指定一個委托。讓委托告訴DocumentInteraction Controller如何顯示。

documentController.delegate = self;

委托對象需要實現一系列委托方法,最常見的包括:

- documentInteractionControllerViewControllerForPreview:
- documentInteractionControllerViewForPreview:
- documentInteractionControllerRectForPreview:

這3個方法在用戶點擊“快速查看”菜單時依次調用。

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {return self;
}
- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller {return self.view;
}- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller {return self.view.frame;}//點擊預覽窗口的“Done”(完成)按鈕時調用
- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller {
}

功能一:分享文件

- (void)shareFile {NSString *filePath = [[NSBundle mainBundle] pathForResource:@"皮卡丘"ofType:@"jpeg"];//創建實例UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];//設置代理documentController.delegate = self;BOOL canOpen = [documentController presentOpenInMenuFromRect:CGRectZeroinView:self.viewanimated:YES];if (!canOpen) {NSLog(@"沒有程序可以打開要分享的文件");}
}

功能二:預覽文件(注冊應用程序支持的文件類型)

- (void)preview {if (!_path) {return;}NSURL *fileURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", [self getURL], [_path lastPathComponent]]];//創建實例UIDocumentInteractionController *documentController =[UIDocumentInteractionControllerinteractionControllerWithURL:fileURL];//設置代理documentController.delegate = self;[documentController presentPreviewAnimated:YES];
}

配置Info.plist文件

如果你的程序能夠打開某種文件,你可以向系統進行注冊。方便其他程序通過 iOS 的document interaction技術提供給用戶一個選擇,從而調用你的程序處理這些文件。

這需要在程序的Info.plist文件中添加CFBundleDocumentTypes鍵(查看CoreFoundation Keys)。

系統將該鍵中包含的內容進行登記,這樣其他程序就可以通過document interaction controller訪問到這些信息。

CFBundleDocumentTypes鍵是一個dictionary數組,每個dictionary表示了一個指定的文檔類型。一個文檔類型通常與某種文件類型是一一對應的。

但是,如果你的程序對多個文件類型采用同樣的處理方式,你也可以把這些類型都分成一個組,統一視作一個文檔類型。**例如,你的程序中使用到的本地文檔類型,有一個是舊格式的,還有一個新格式(似乎是影射微軟office文檔),則你可以將二者分成一組,都放到同一個文檔類型下。這樣,舊格式和新格式的文件都將顯示為同一個文檔類型,并以同樣的方式打開。**

CFBundleDocumentTypes數組中的每個 dictionary 可能包含以下鍵:

  • CFBundleTypeName

    指定文檔類型名稱。

  • CFBundleTypeIconFiles

    是一個數組,包含多個圖片文件名,用于作為該文檔的圖標。

  • LSItemContentTypes

    是一個數組,包含多個UTI【Uniform Type Identifiers】類型的字符串。UTI類型是本文檔類型(組)所包含的文件類型。

  • LSHandlerRank

    表示應用程序是“擁有”還是僅僅是“打開”這種類型而已。

下表列出了Info.plist中的一個CFBundleTypeName官方示例。

  1. 自定義文件格式的文檔類型

    <dict>
    <key>CFBundleTypeName</key>
    <string>My File Format</string>
    <key>CFBundleTypeIconFiles</key><array><string>MySmallIcon.png</string><string>MyLargeIcon.png</string></array>
    <key>LSItemContentTypes</key><array><string>com.example.myformat</string></array>
    <key>LSHandlerRank</key>
    <string>Owner</string>
    </dict>
    
  2. 自己程序配置文件

    <key>CFBundleDocumentTypes</key>
    <array><dict><key>CFBundleTypeName</key><string>com.myapp.common-data</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>
    

打開支持的文件類型

你可以在應用程序委托的application:didFinishLaunchingWithOptions:方法中獲得該文件的信息。如果你的程序要處理某些自定義的文件類型,你必須實現這個委托方法(而不是applicationDidFinishLaunching: 方法) 并用這個方法啟動應用程序。

application:didFinishLaunchingWithOptions:方法的option參數包含了要打開的文件的相關信息。尤其需要在程序中關心下列鍵:

  • UIApplicationLaunchOptionsURLKey

    包含了該文件的NSURL。

  • UIApplicationLaunchOptionsSourceApplicationKey

    包含了發送請求的應用程序的 Bundle ID。

  • UIApplicationLaunchOptionsAnnotationKey

    包含了源程序向目標程序傳遞的與該文件相關的屬性列表對象。

如果UIApplicationLaunchOptionsURLKey鍵存在,你的程序應當立即用該 URL 打開該文件并將內容呈現給用戶。其他鍵可用于收集與打開的文件相關的參數和信息。

如果你的應用程序處于活躍狀態,此時application:didFinishLaunchingWithOptions:方法是不會被調用的。需要實現application:openURL:options:方法

【以下是本人的寫法】

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {_vc = [[ViewController alloc] init];UINavigationController *nav    = [[UINavigationController alloc] initWithRootViewController:_vc];self.window                    = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];self.window.backgroundColor    = [UIColor whiteColor];self.window.rootViewController = nav;[self.window makeKeyAndVisible];if (launchOptions) {NSString *str = [NSString stringWithFormat:@"\n發送請求的應用程序的 Bundle ID:%@\n\n文件的NSURL:%@\n\n文件相關的屬性列表對象:%@",launchOptions[UIApplicationLaunchOptionsSourceApplicationKey],launchOptions[UIApplicationLaunchOptionsURLKey],launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]];[[[UIAlertView alloc] initWithTitle:@""message:strdelegate:nilcancelButtonTitle:@"確定"otherButtonTitles:nil, nil] show];_vc.path = [launchOptions[UIApplicationLaunchOptionsURLKey] description];[_vc preview];}return YES;
}- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options {if (options) {NSString *str = [NSString stringWithFormat:@"\n發送請求的應用程序的 Bundle ID:%@\n\n文件的NSURL:%@", options[UIApplicationOpenURLOptionsSourceApplicationKey], url];[[[UIAlertView alloc] initWithTitle:@""message:strdelegate:nilcancelButtonTitle:@"確定"otherButtonTitles:nil, nil] show];_vc.path = [url description];[_vc preview];}return YES;
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247954.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webpack — 概述 (2)

webpack學前必備 webpack中文網 webpack官網 1. Webpack 介紹 Webpack 是什么?? (面試) 前端模塊化打包工具WebPack可以看做是模塊打包機&#xff1a;它做的事情是&#xff0c;分析你的項目結構&#xff0c;找到JavaScript模塊、其它的一些瀏覽器不能直接運行的拓展語言…

VUE安裝依賴命令總結

以下是個人用到過的vue安裝包以及依賴命令&#xff08;在接觸項目時&#xff0c;有未寫到的會隨時補充&#xff09; 1. vuex 作用&#xff1a;vue狀態管理 安裝&#xff1a;npm install vuex --save 開源地址&#xff1a;github 文檔&#xff1a;https://vuex.vuejs.org/zh/ 2.…

SQL總結(快速參考)

SQL 語句 語句 語法 AND / OR SELECT column_name(s) FROM table_name WHERE condition AND|OR condition ALTER TABLE (add column) ALTER TABLE table_name ADD column_name datatype ALTER TABLE (drop column) ALTER TABLE table_name DROP COLUMN column_name AS (alias…

Vue -項目創建(rem適配項的設置)

3. 項目rem 配置 ####3.1 rem介紹 小米、京東、攜程 m.mi.com/m.jd.com/m.ctrp.com 核心原理 1rem 當前 html 的fontSize也就是說 : rem是相當于根元素的字體大小// 使用div {width:2rem;height:2rem}// 媒體查詢media (min-width:320px) {html {font-size : 20px}}media (mi…

c#基礎知識梳理(四)

上期回顧 - https://www.cnblogs.com/liu-jinxin/p/10826971.html 一、類 當你定義一個類時&#xff0c;你定義了一個數據類型的藍圖。這實際上并沒有定義任何的數據&#xff0c;但它定義了類的名稱意味著什么&#xff0c;也就是說&#xff0c;類的對象由什么組成及在這個對象…

UIButton設置圓角和邊框及邊框顏色

UIButton *testButton [UIButton buttonWithType:UIButtonTypeSystem];[testButton setFrame:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 100,100)];[testButton setTitle:"獲取屏幕尺寸" forState:UIControlStateNormal];[testButt…

Git 的介紹簡介

使用 git 管理我們的項目并上傳到碼云 ##1. 本地管理 本地工作區 git add >暫存區 git commit > 倉庫區 git status : 查看我們的狀態 查看到很多紅色的 (有修改的 有刪除的 有添加的) git add . : 把當前所有文件添加到暫存區 git commit -m xxx 把代碼從暫存區 提交…

【王俊杰de人工智能實戰課】第7次作業2

Brief Guide 項目內容這個作業屬于哪個課程北航人工智能實戰課這個作業的要求在哪里第三次作業要求我在這個課程的目標是獲得機器學習相關的完整項目與學習經驗&#xff1b;通過與人工智能行業的大牛們聊天了解行業不同方向的發展以便進行職業規劃&#xff1b;為轉CS積累基礎知…

讓UITableView的section header view不懸停的方法

當 UITableView 的 style 屬性設置為 Plain 時&#xff0c;這個tableview的section header在滾動時會默認懸停在界面頂端。取消這一特性的方法有兩種&#xff1a; 將 style 設置為 Grouped 。這時所有的section header都會隨著scrollview滾動了。不過 grouped 和 plain 的樣式…

Promise 的基本使用 與 Ajax的jQuery封裝

Promise 的基本使用 為了解決回調地獄問題&#xff0c;從而給出的解決辦法&#xff1a; /*** Promise** 1. Promise 是 一個構造函數 new Vue()* 2. Promise() 里面有個參數, 參數就是一個回調 () > {}* 回調也有參數* resolve f 操作成功的時候調用resolve > …

個人沖刺9

1.昨天做了界面整體優化。 2.今天打算了解一下組成員的情況。 3.整體界面優化沒有什么問題。轉載于:https://www.cnblogs.com/Evak/p/10936840.html

iOS UITextField使用全攻略

//初始化textfield并設置位置及大小 UITextField *text [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //設置邊框樣式&#xff0c;只有設置了才會顯示邊框樣式 text.borderStyle UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone…

日期模糊查詢

SELECT * FROM 表名 t WHERE(to_char(t.日期字段,yyyy-MM-dd hh24:mi:ss)like %2011%)轉載于:https://www.cnblogs.com/macT/p/10865206.html

Uboot中start.S源碼的指令級的詳盡解析(轉)

Uboot中start.S源碼的指令級的詳盡解析轉載于:https://www.cnblogs.com/LittleTiger/p/10877516.html

Vuex說明及Todos項目改造

Vuex(vue) / Flux (angular) /Redux(react) vuex 是什么? 狀態管理工具 狀態即數據, 狀態管理就是管理組件中的data數據 Vuex 中的狀態管理工具,采用了 集中式 方式統一管理項目中組件之間需要通訊的數據 [看圖] 如何使用 最佳實踐 : 只將組件之間共享的數據放在 vuex …

Objective-C 深復制和淺復制與NSCopying協議

1.簡單復制只能實現淺拷貝&#xff1a;指針賦值&#xff0c;使兩個指針指向相同的一塊內存空間&#xff0c;操作不安全。 2. Foundation類已經遵守了<NSCopying>和 <NSMutableCopying>協議,即實現了copy和mutableCopy方法,因此Foundation對象可以使用這些方法創建對…

基于Vue項目打包上線配置

打包上線 開發階段 : npm run serve發布階段 : npm run build build之前 1. 把基準地址, 由開發階段的換成發布階段的 //main.js axios.defaults.baseURL http://localhost:30002. 忽略項目中打印的結果 // main.js console.log () > {}// 開發階段 > 注釋掉 >…

NSTimer 進階使用總結與注意事項

NSTimer 是 iOS 上的一種計時器&#xff0c;通過 NSTimer 對象&#xff0c;可以指定時間間隔&#xff0c;向一個對象發送消息。NSTimer 是比較常用的工具&#xff0c;比如用來定時更新界面&#xff0c;定時發送請求等等。但是在使用過程中&#xff0c;有很多需要注意的地方&…

一步一步教你實現iOS音頻頻譜動畫(一)

如果你想先看看最終效果再決定看不看文章 -> bilibili示例代碼下載 第二篇&#xff1a;一步一步教你實現iOS音頻頻譜動畫&#xff08;二&#xff09; 基于篇幅考慮&#xff0c;本次教程分為兩篇文章&#xff0c;本篇文章主要講述音頻播放和頻譜數據的獲取&#xff0c;下篇將…

微信小程序的基礎 (一)

微信小程序介紹- 鏈接 微信小程序&#xff0c;簡稱小程序&#xff0c;是一種不需要下載安裝即可使用的應用&#xff0c;它實現了應用“觸手可及”的夢想&#xff0c;用戶掃一掃或搜一下即可打開應用 1. 為什么是微信小程序? 微信有海量用戶&#xff0c;而且粘性很高&#x…