iOS APP之間數(shù)據(jù)共享

前言

iOS中的沙盒可以讓平臺(tái)更加的安全,這也是沙盒給用戶(hù)帶來(lái)的最主要好處擦耀。不過(guò)由于沙盒的嚴(yán)格限制,導(dǎo)致程序之間共享數(shù)據(jù)比較麻煩碧聪。

我們?cè)趇OS平臺(tái)上想要實(shí)現(xiàn)不同App之間的內(nèi)容分享一般有幾種常用方式:

  1. 第一種是通過(guò)AirDrop實(shí)現(xiàn)不同設(shè)備的App之間文檔和數(shù)據(jù)的分享;

  2. 第二種是給每個(gè)App定義一個(gè)URL Scheme,通過(guò)訪問(wèn)指定了URL Scheme的一個(gè)URL,實(shí)現(xiàn)直接訪問(wèn)一個(gè)APP

  3. 第三種是通過(guò)UIDocumentInteractionController或者是UIActivityViewController這倆個(gè)iOS SDK中封裝好的類(lèi)在App之間發(fā)送數(shù)據(jù)吞杭、分享數(shù)據(jù)和操作數(shù)據(jù)曼月;

  4. 第四種是通過(guò)App Groups碴萧,在iOS 8的SDK中提供的擴(kuò)展新特性實(shí)現(xiàn)跨App的數(shù)據(jù)操作和分享;這個(gè)功能需要APP使用同一個(gè)證書(shū)姨夹。

  5. 第五種是通過(guò)UIPasteboard剪切板,粘貼板的內(nèi)容可以是文本、URL巷送、圖片和UIColor等几苍,另一個(gè)app就可以根據(jù)粘貼板的名字去讀取相關(guān)的信息厘贼。

  6. 第六種是Shared Keychain Access來(lái)實(shí)現(xiàn)數(shù)據(jù)共享,不過(guò)要使用同一個(gè)證書(shū)

  7. 還有一種集成第三方SDK實(shí)現(xiàn)的有限個(gè)App的數(shù)據(jù)分享,比如社交平臺(tái)(QQ,微信,新浪微博等)給我們提供的官方SDK欣簇,或者是集成了多個(gè)社交平臺(tái)的ShareSDK組件和友盟分享組件等

本文主要討論UIDocumentInteractionController實(shí)現(xiàn)數(shù)據(jù)共享规脸。

預(yù)覽文檔和呈現(xiàn)選項(xiàng)菜單

如果你的app需要打開(kāi)它不支持的文件(PDF文件、圖像文件熊咽,等等)莫鸭,或者需要將app的文件傳輸給另外一個(gè)允許接收此類(lèi)型文件的app時(shí)『崤梗可以使用文件交互控制器(UIDocumentInteractionController類(lèi)的實(shí)例)為用戶(hù)提供可接收程序來(lái)處理文件被因,說(shuō)的簡(jiǎn)單點(diǎn)就是通過(guò)Quick Look框架判斷文檔是否能被另一個(gè)app打開(kāi)和預(yù)覽。

UIDocumentInteractionController在iOS3.2中就已經(jīng)存在了,使用起來(lái)非常靈活梨与,功能也比較強(qiáng)大堕花。它除了支持同設(shè)備上app之間的文檔共享外,還可以實(shí)現(xiàn)文檔的預(yù)覽蛋欣、打印航徙、發(fā)郵件以及復(fù)制。

要使用一個(gè)文件交互控制器(UIDocumentInteractionController類(lèi)的實(shí)例)陷虎,需要以下步驟:

  • 為每個(gè)你想打開(kāi)的文件創(chuàng)建一個(gè)UIDocumentInteractionController類(lèi)的實(shí)例

  • 實(shí)現(xiàn)UIDocumentInteractionControllerDelegate代理

  • 顯示預(yù)覽窗口/顯示菜單

一到踏、創(chuàng)建實(shí)例

DocumentInteraction Controller使用靜態(tài)方法interactionControllerWithURL創(chuàng)建實(shí)例,這個(gè)方法使用一個(gè)NSURL作為參數(shù)尚猿。

//創(chuàng)建實(shí)例
NSURL *filePath = [NSURL fileURLWithPath:path];
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];

二窝稿、顯示預(yù)覽窗口

Document Interaction Controller對(duì)象使用presentPreviewAnimated方法彈出一個(gè)全屏的文檔預(yù)覽窗口。

BOOL b = [documentController presentPreviewAnimated:YES];

三凿掂、顯示菜單

如果你不想在本應(yīng)用里面打開(kāi)文件伴榔,那么可以通過(guò)第三方應(yīng)用打開(kāi)預(yù)覽文件。通過(guò)OptionsMenu(選項(xiàng)菜單)庄萎,顯示能夠接收該類(lèi)型文件的應(yīng)用踪少,由用戶(hù)選擇相應(yīng)的操作。
顯示菜單可以使用下列方法:

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

這些方法都是類(lèi)似的糠涛,只是顯示位置有區(qū)別而已援奢。以下代碼演示其中一個(gè)方法的使用。

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

四忍捡、使用委托

如果你顯示一個(gè)Document Interaction Controller集漾,則必需要為delegate屬性用指定一個(gè)委托。讓委托告訴DocumentInteraction Controller如何顯示砸脊。

documentController.delegate = self;

委托對(duì)象需要實(shí)現(xiàn)一系列委托方法具篇,最常見(jiàn)的包括:

- documentInteractionControllerViewControllerForPreview:
- documentInteractionControllerViewForPreview:
- documentInteractionControllerRectForPreview:

這3個(gè)方法在用戶(hù)點(diǎn)擊“快速查看”菜單時(shí)依次調(diào)用。

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
return self;
}
- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller {
return self.view;
}

- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller {
  return self.view.frame;
}

//點(diǎn)擊預(yù)覽窗口的“Done”(完成)按鈕時(shí)調(diào)用
- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller {
}

分享文件

- (void)shareFile {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"皮卡丘"
ofType:@"jpeg"];

//創(chuàng)建實(shí)例
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];

//設(shè)置代理
documentController.delegate = self;
BOOL canOpen = [documentController presentOpenInMenuFromRect:CGRectZero
inView:self.view
animated:YES];
if (!canOpen) {
NSLog(@"沒(méi)有程序可以打開(kāi)要分享的文件");
}
}

預(yù)覽文件(注冊(cè)應(yīng)用程序支持的文件類(lèi)型)

- (void)preview {
if (!_path) {
return;
}

NSURL *fileURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", [self getURL], [_path lastPathComponent]]];

//創(chuàng)建實(shí)例
UIDocumentInteractionController *documentController =
[UIDocumentInteractionController
interactionControllerWithURL:fileURL];

//設(shè)置代理
documentController.delegate = self;

[documentController presentPreviewAnimated:YES];
}

向系統(tǒng)注冊(cè)本應(yīng)用

配置Info.plist文件

如果你的程序能夠打開(kāi)某種文件凌埂,你可以向系統(tǒng)進(jìn)行注冊(cè)驱显。方便其他程序通過(guò) iOS 的document interaction技術(shù)提供給用戶(hù)一個(gè)選擇,從而調(diào)用你的程序處理這些文件瞳抓。

這需要在程序的Info.plist文件中添加CFBundleDocumentTypes
鍵(查看CoreFoundation Keys)埃疫。
系統(tǒng)將該鍵中包含的內(nèi)容進(jìn)行登記,這樣其他程序就可以通document interaction controller訪問(wèn)到這些信息挨下。

CFBundleDocumentTypes鍵是一個(gè)dictionary數(shù)組,每個(gè)dictionary表示了一個(gè)指定的文檔類(lèi)型脐湾。一個(gè)文檔類(lèi)型通常與某種文件類(lèi)型是一一對(duì)應(yīng)的臭笆。
但是,如果你的程序?qū)Χ鄠€(gè)文件類(lèi)型采用同樣的處理方式,你也可以把這些類(lèi)型都分成一個(gè)組愁铺,統(tǒng)一視作一個(gè)文檔類(lèi)型鹰霍。例如,你的程序中使用到的本地文檔類(lèi)型茵乱,有一個(gè)是舊格式的茂洒,還有一個(gè)新格式(似乎是影射微軟office文檔),則你可以將二者分成一組瓶竭,都放到同一個(gè)文檔類(lèi)型下督勺。這樣,舊格式和新格式的文件都將顯示為同一個(gè)文檔類(lèi)型斤贰,并以同樣的方式打開(kāi)智哀。

CFBundleDocumentTypes數(shù)組中的每個(gè) dictionary 可能包含以下鍵:

  • CFBundleTypeName
    指定文檔類(lèi)型名稱(chēng)。

  • CFBundleTypeIconFiles
    是一個(gè)數(shù)組荧恍,包含多個(gè)圖片文件名瓷叫,用于作為該文檔的圖標(biāo)。

  • LSItemContentTypes
    是一個(gè)數(shù)組送巡,包含多個(gè)UTI【Uniform Type Identifiers】類(lèi)型的字符串摹菠。UTI
    類(lèi)型是本文檔類(lèi)型(組)所包含的文件類(lèi)型。

  • LSHandlerRank
    表示應(yīng)用程序是“擁有”還是僅僅是“打開(kāi)”這種類(lèi)型而已骗爆。

下表列出了Info.plist中的一個(gè)CFBundleTypeName官方示例次氨。

  1. 自定義文件格式的文檔類(lèi)型
<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>
  1. 自己程序配置文件
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>com.appname.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>

打開(kāi)支持的文件類(lèi)型

你可以在應(yīng)用程序委托的application:didFinishLaunchingWithOptions:
方法中獲得該文件的信息。如果你的程序要處理某些自定義的文件類(lèi)型淮腾,你必須實(shí)現(xiàn)這個(gè)委托方法(而不是applicationDidFinishLaunching:方法) 并用這個(gè)方法啟動(dòng)應(yīng)用程序糟需。

application:didFinishLaunchingWithOptions:方法的option參數(shù)包含了要打開(kāi)的文件的相關(guān)信息。尤其需要在程序中關(guān)心下列鍵:

  • UIApplicationLaunchOptionsURLKey
    包含了該文件的NSURL谷朝。

  • UIApplicationLaunchOptionsSourceApplicationKey
    包含了發(fā)送請(qǐng)求的應(yīng)用程序的 Bundle ID洲押。

  • UIApplicationLaunchOptionsAnnotationKey
    包含了源程序向目標(biāo)程序傳遞的與該文件相關(guān)的屬性列表對(duì)象

如果UIApplicationLaunchOptionsURLKey鍵存在,你的程序應(yīng)當(dāng)立即用該 URL 打開(kāi)該文件并將內(nèi)容呈現(xiàn)給用戶(hù)圆凰。其他鍵可用于收集與打開(kāi)的文件相關(guān)的參數(shù)和信息杈帐。

如果你的應(yīng)用程序處于活躍狀態(tài),此時(shí)application:didFinishLaunchingWithOptions:方法是不會(huì)被調(diào)用的专钉。需要實(shí)現(xiàn)application:openURL:options:方法

以下是參考別人的寫(xiě)法

- (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發(fā)送請(qǐng)求的應(yīng)用程序的 Bundle ID:%@\n\n文件的NSURL:%@\n\n文件相關(guān)的屬性列表對(duì)象:%@",
launchOptions[UIApplicationLaunchOptionsSourceApplicationKey],
launchOptions[UIApplicationLaunchOptionsURLKey],
launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]];

[[[UIAlertView alloc] initWithTitle:@""
message:str
delegate:nil
cancelButtonTitle:@"確定"
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發(fā)送請(qǐng)求的應(yīng)用程序的 Bundle ID:%@\n\n文件的NSURL:%@", options[UIApplicationOpenURLOptionsSourceApplicationKey], url];

[[[UIAlertView alloc] initWithTitle:@""
message:str
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil, nil] show];

_vc.path = [url description];
[_vc preview];
}
return YES;
}

參考

SuperDannyUIDocumentInteractionController之程序間文檔共享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挑童,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子跃须,更是在濱河造成了極大的恐慌站叼,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菇民,死亡現(xiàn)場(chǎng)離奇詭異尽楔,居然都是意外死亡投储,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)阔馋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玛荞,“玉大人,你說(shuō)我怎么就攤上這事呕寝⊙校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵下梢,是天一觀的道長(zhǎng)客蹋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怔球,這世上最難降的妖魔是什么嚼酝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮竟坛,結(jié)果婚禮上闽巩,老公的妹妹穿的比我還像新娘。我一直安慰自己担汤,他們只是感情好涎跨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著崭歧,像睡著了一般隅很。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上率碾,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天叔营,我揣著相機(jī)與錄音,去河邊找鬼所宰。 笑死绒尊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仔粥。 我是一名探鬼主播婴谱,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼躯泰!你這毒婦竟也來(lái)了谭羔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麦向,失蹤者是張志新(化名)和其女友劉穎瘟裸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诵竭,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡话告,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年十办,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片超棺。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呵燕,靈堂內(nèi)的尸體忽然破棺而出棠绘,到底是詐尸還是另有隱情,我是刑警寧澤再扭,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布氧苍,位于F島的核電站,受9級(jí)特大地震影響泛范,放射性物質(zhì)發(fā)生泄漏让虐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一罢荡、第九天 我趴在偏房一處隱蔽的房頂上張望赡突。 院中可真熱鬧,春花似錦区赵、人聲如沸惭缰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漱受。三九已至,卻和暖如春骡送,著一層夾襖步出監(jiān)牢的瞬間昂羡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工摔踱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虐先,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓昌渤,卻偏偏與公主長(zhǎng)得像赴穗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膀息,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理般眉,服務(wù)發(fā)現(xiàn),斷路器潜支,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評(píng)論 25 707
  • iOS中的沙盒可以讓平臺(tái)更加的安全甸赃,這也是沙盒給用戶(hù)帶來(lái)的最主要好處。不過(guò)由于沙盒的嚴(yán)格限制冗酿,導(dǎo)致程序之間共享數(shù)據(jù)...
    SuperDanny閱讀 2,881評(píng)論 3 20
  • J2EE website workflow Spring website workflow
    超薄智能閱讀 499評(píng)論 1 1
  • 我不可能踏進(jìn)同一條河流埠对,也不可能遇見(jiàn)同一個(gè)你络断。 我會(huì)試著堅(jiān)持,久到我忘記了你项玛,或者你忘不了我貌笨。 我凝視著天邊的晚霞...
    火云洞洞主閱讀 168評(píng)論 0 0