應(yīng)用程序沙盒(App Sandbox,也稱沙箱)
- 沙盒應(yīng)用程序是通過將應(yīng)用程序的特權(quán)限制在其預(yù)期功能來保護(hù)系統(tǒng)和用戶的好方法舆瘪,從而增加惡意軟件危及用戶系統(tǒng)的難度浙垫。
- 應(yīng)用程序?yàn)槭裁葱枰敲炊嗟氖跈?quán)(以下使用了google翻譯)?蘋果這樣說
屏幕快照 2017-07-31 16.34.27.png
- 如果使用相同的代碼簽名和標(biāo)志符即可重復(fù)使用應(yīng)用程序的容器,而iOS容器還包含了應(yīng)用程序本身
所以我們只要bundleId一致, 就會(huì)直接覆蓋那個(gè)App
- 對(duì)于每個(gè)用戶,首次運(yùn)行應(yīng)用程序時(shí),自動(dòng)會(huì)創(chuàng)建一個(gè)沙盒
- 蘋果對(duì)沙箱深度描述:
屏幕快照 2017-07-31 16.40.03.png
- 一個(gè)特殊的權(quán)利啟用應(yīng)用程序沙箱 - 打開應(yīng)用程序沙箱流酬。啟用沙箱時(shí)奔脐,Xcode會(huì)創(chuàng)建一個(gè).entitlements 屬性列表文件,并在項(xiàng)目導(dǎo)航器中顯示該文件驴剔。
現(xiàn)在還疑惑項(xiàng)目下多了一個(gè):項(xiàng)目名+.entiliements文件嗎?
沙盒下的目錄
- 在AppDelegate中使用NSHomeDirectory打印,注意在模擬器下打印,真機(jī)同樣有沙盒,只是在電腦上我們看不到(或者說不好看,可以在Devices中查看):
NSString *path = NSHomeDirectory();
NSLog(@"path = %@", path);
- 打印結(jié)果:
屏幕快照 2017-07-31 16.51.37.png
- 復(fù)制path的路徑,在mac首頁點(diǎn)擊前往->前往文件夾->黏貼該路徑并且點(diǎn)擊前往即可看到沙盒下的目錄:
屏幕快照 2017-07-31 16.53.36.png
Documents疑問和測(cè)試
- 為什么說Documents的數(shù)據(jù)在App升級(jí)的時(shí)候會(huì)跟隨遷移,卸載的時(shí)候就不會(huì)存在?
- 我們新建一個(gè)App,并且使用歸檔的方式將數(shù)據(jù)存在Documents下:
_responseObject = [NSMutableDictionary dictionary];
for (NSInteger i = 0; i < 100; i++) {
[_responseObject setObject:[NSString stringWithFormat:@"test %ld",i] forKey:[NSString stringWithFormat:@"test %ld",i] ];
}
// 是路徑也是存儲(chǔ)的鍵
NSString *filePath = @"responseObject";
// 存儲(chǔ)數(shù)據(jù)
[LXKArchiverTool archiverObject:_responseObject key:filePath filePath:filePath];
- 如果對(duì)以上代碼有疑問可以參考我的歸檔(NSKeyedArchiver)與解歸檔(NSKeyUnarchiver)封裝和使用時(shí)間測(cè)試
- 可以看到我們歸檔成功在Documents路徑下了:
屏幕快照 2017-07-31 17.16.17.png
- 根據(jù)蘋果官網(wǎng)介紹,那么我們重新建一個(gè)App,并且使用相同的BundleId,是否能夠獲取到responseObject數(shù)據(jù)?
- 同樣在AppDelegate下打印家目錄,對(duì)比得出目錄是不一致的,但是responseObject數(shù)據(jù)是存在的,并且可以直接讀取
// 是路徑也是存儲(chǔ)的鍵
NSString *filePath = @"responseObject";
// 存儲(chǔ)數(shù)據(jù)
// [LXKArchiverTool archiverObject:_responseObject key:filePath filePath:filePath];
// 讀取數(shù)據(jù)
id object = [LXKArchiverTool unarchiverPath:filePath key:filePath];
屏幕快照 2017-07-31 17.18.34.png
- 如果我們刪除App后重新運(yùn)行則數(shù)據(jù)不會(huì)再存在了
Library
preference
- Library/preference,用戶的偏好設(shè)置,我們可以使用上面的方法在一個(gè)App使用NSUserDefaults來測(cè)試是否存在這里和是否會(huì)刪除;
- 存儲(chǔ)代碼:
NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
[userDef setObject:@"test" forKey:@"test"];
[userDef synchronize];
- 根據(jù)目錄我們可以看到是NSUserdefaults是以plist格式存儲(chǔ)在preference里面的:
屏幕快照 2017-07-31 17.36.38.png
- 再次在另一個(gè)App獲取發(fā)現(xiàn)依然可以讀取數(shù)據(jù),并且刪除一樣不存在,所以preference跟隨沙盒數(shù)據(jù)在遷移,App升級(jí)的時(shí)候preference的plist一樣會(huì)存在
caches
- 當(dāng)遇到這個(gè)時(shí)候我不知道怎么做,不過在蘋果官網(wǎng)看到:
屏幕快照 2017-07-31 17.54.53.png
- 一下在連tmp都不用測(cè)試了....
幾個(gè)目錄獲取
- 沙盒路徑:
// 沙盒路徑
NSString * path = NSHomeDirectory()
- Documents:
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- Library:
NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
- caches:
NSArray *paths2 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- preference
preference
-tmp:
//temp路徑
NSString * tmpDir = NSTemporaryDirectory();
總結(jié)
- Documents是用于存儲(chǔ)用戶生成的內(nèi)容,該目錄的內(nèi)容共享提供給用戶,此目錄只能包含想用戶公開的文件,并且跟隨App的升級(jí)一樣存在,如果刪除將不存在
- Library中可以創(chuàng)建自定義子目錄哦(當(dāng)我們有需求可以在這這兒創(chuàng)建),Library存儲(chǔ)的是不想想用戶公開的文件的子目錄,跟隨App升級(jí)都存在,除了caches子目錄存在
- tem文件就是系統(tǒng)每一次重新啟動(dòng)都可能被清除,更不用說備份了
- 由此,基本可以說我們存儲(chǔ)的數(shù)據(jù)都會(huì)跟隨App升級(jí)存在,但是刪除App就不會(huì)存在了,會(huì)重新創(chuàng)建一個(gè)新的沙盒(keychian刪除也會(huì)存在,不過最好慎用).