盜夢空間 | iOS沙盒開發(fā)指南

試想有這么一款游戲:里面有山有水州藕,有車有房束世,有鐵軌公路,你在里面上天入海床玻,殺人放火毁涉,駕飛機(jī),開坦克锈死,你似乎擁有整個(gè)世界贫堰,而另一個(gè)玩家也有同樣的幻覺;對于游戲主機(jī)來說待牵,不過是給你們每人一個(gè)“盒子”其屏,一個(gè)微觀盆景罷了,你的胡作非為缨该,對其他玩家不會(huì)造成任何影響偎行。這便是沙盒,一種文件訪問權(quán)限的隔離機(jī)制贰拿。

每個(gè)應(yīng)用都有相同的文件目錄睦优,對自己目錄下的修改不會(huì)對其它應(yīng)用造成影響。
換句話說壮不,應(yīng)用也不能通過相同的路徑訪問到其它應(yīng)用的文件汗盘,這與我們在PC機(jī)下常用文件共享有很大的差別。


沙盒中各個(gè)文件夾的差別

每個(gè)應(yīng)用默認(rèn)都有以下文件夾询一,如下圖所示:



每個(gè)目錄的功能有以下差別:


每個(gè)文件夾的“能力”各有差別隐孽,以適用不同的使用場景,Document/適合用戶生成的健蕊,需要備份菱阵、共享的數(shù)據(jù),如文件工具生成的Doc類文檔缩功。
Library/適合后臺記錄值晴及,但用戶無需看到的數(shù)據(jù),比如服務(wù)器同步數(shù)據(jù)嫡锌,緩存數(shù)據(jù)庫文件等虑稼。

根目錄新建其它文件夾會(huì)怎么樣?
可以建任意文件夾及文件势木,但備份等行為并不保證蛛倦,比如iOS8下無法在根目錄建立文件夾,iOS9卻可以啦桌,不要依賴這種不確定的系統(tǒng)行為溯壶。


如何查看沙盒文件

查看模擬器沙盒:

  1. APP工程里加入以下代碼:
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);

控制臺輸出的路徑如下

/Users/[用戶名]/Library/Developer/CoreSimulator/Devices/04D49FFD-11F6-4A1E-BE74-D7C3A1AD1D40/data/Containers/Data/Application/20DE6878-D29E-431C-BAC1-78B4A85F51D3/Documents

20DE6878-D29E-431C-BAC1-78B4A85F51D3 這串字母數(shù)字

每次應(yīng)用啟動(dòng)都會(huì)變化,小心不要被先前的路徑誤導(dǎo)

  1. 打開Finder



    使用Finder打開路徑

    模擬器沙盒中的目錄

查看真機(jī)沙盒

打開Xcode設(shè)備管理器

選擇齒輪圖標(biāo)
選擇Show Container

顯示的真機(jī)沙盒

編程訪問各文件夾的方法

訪問Home

見上文 查看模擬器沙盒

訪問Document

NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0]; 
NSLog(@"The document's path:%@", documentPath);

這里返回的數(shù)組在iOS平臺上總是只有一個(gè)對象

更換以上NSDocumentDirectory的枚舉值,可獲得其它沙盒目錄路徑

NSLibraryDirectory //.../Library/
NSCachesDirectory //.../Library/Caches/
NSString *tempPath = NSTemporaryDirectory(); //.../tmp/
NSLog(@"tempPath:%@", tempPath);

獲得安裝包中的文件路徑

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];

突破沙盒

1. 在程序間共享文檔

可以通過UIDocumentInteractionController

將文件分享給其它應(yīng)用:

- (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(@"沒有程序可以打開要分享的文件"); 
    }
}

注冊自己能打開的文件:

這需要在程序的Info.plist文件中添加CFBundleDocumentTypes鍵, 它是一個(gè)dictionary數(shù)組且改,每個(gè)dictionary表示了一個(gè)指定的文檔類型验烧。
數(shù)組中的每個(gè) dictionary 可能包含以下鍵:

CFBundleTypeName
指定文檔類型名稱。

CFBundleTypeIconFiles
是一個(gè)數(shù)組又跛,包含多個(gè)圖片文件名噪窘,用于作為該文檔的圖標(biāo)。

LSItemContentTypes
是一個(gè)數(shù)組效扫,包含多個(gè)UTI類型的字符串倔监。UTI
類型是本文檔類型(組)所包含的文件類型。

LSHandlerRank
表示應(yīng)用程序是“擁有”還是僅僅是“打開”這種類型而已菌仁。

一個(gè)plist文件中的例子:

<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>

響應(yīng)其它應(yīng)用的打開文件請求:

實(shí)現(xiàn)application:didFinishLaunchingWithOptions:
方法中獲得該文件的信息浩习,而不是applicationDidFinishLaunching
如果你的應(yīng)用程序處于活躍狀態(tài),此時(shí)application:didFinishLaunchingWithOptions:
方法是不會(huì)被調(diào)用的济丘。需要實(shí)現(xiàn)application:openURL:options:
方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谱秽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摹迷,更是在濱河造成了極大的恐慌疟赊,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡碉,死亡現(xiàn)場離奇詭異近哟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鲫寄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門吉执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人地来,你說我怎么就攤上這事戳玫。” “怎么了未斑?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵咕宿,是天一觀的道長。 經(jīng)常有香客問我蜡秽,道長府阀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任载城,我火速辦了婚禮肌似,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诉瓦。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布睬澡。 她就那樣靜靜地躺著固额,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煞聪。 梳的紋絲不亂的頭發(fā)上斗躏,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音昔脯,去河邊找鬼啄糙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛云稚,可吹牛的內(nèi)容都是我干的隧饼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼静陈,長吁一口氣:“原來是場噩夢啊……” “哼燕雁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲸拥,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拐格,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后刑赶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏浊,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年撞叨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呛伴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谒所,死狀恐怖热康,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劣领,我是刑警寧澤姐军,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站尖淘,受9級特大地震影響奕锌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜村生,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一惊暴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁桃,春花似錦辽话、人聲如沸肄鸽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽典徘。三九已至,卻和暖如春益咬,著一層夾襖步出監(jiān)牢的瞬間逮诲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工幽告, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梅鹦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓冗锁,卻偏偏與公主長得像齐唆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蒿讥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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