iOS中每一個(gè)應(yīng)用程序都有自己的沙盒, 并且處于安全考慮, 每個(gè)應(yīng)用程序只能訪問當(dāng)前沙盒路徑下和其他文件(特殊情況除外, 比如手機(jī)通訊錄可以在用戶授權(quán)的情況下被其他應(yīng)用程序訪問)
沙盒中的目錄
每一個(gè)沙盒目錄都基本一致包含以個(gè)目錄:
1. app.app
①該目錄包含了應(yīng)用程序本身的數(shù)據(jù)渊鞋,包含資源文件和可執(zhí)行文件等呛牲。程序啟動(dòng)以后帜矾,會(huì)根據(jù)需要從該目錄中動(dòng)態(tài)加載代碼或資源到內(nèi)存
②整個(gè)目錄是只讀的
為了防止被篡改,應(yīng)用在安裝的時(shí)候會(huì)將該目錄簽名歉眷。非越獄情況下,該目錄中內(nèi)容是無法更改的;在越獄設(shè)備上如果更改了目錄內(nèi)容,對應(yīng)的簽名就會(huì)被改變
③是否會(huì)被iTunes同步
否
2命辖、Documents
①存放內(nèi)容我們可以將應(yīng)用程序的數(shù)據(jù)文件保存在該目錄下。不過這些數(shù)據(jù)類型僅限于不可再生的數(shù)據(jù)分蓖,可再生的數(shù)據(jù)文件應(yīng)該存放在Library/Cache目錄下尔艇。
②是否會(huì)被iTunes同步
是
3、Documents/Inbox
①存放內(nèi)容該目錄用來保存由外部應(yīng)用請求當(dāng)前應(yīng)用程序打開的文件么鹤。比如我們在應(yīng)用A终娃,向系統(tǒng)注冊了幾種可打開的文件格式,B應(yīng)用有一個(gè)A支持的格式的文件F蒸甜,并且申請調(diào)用A打開F棠耕。由于F當(dāng)前是在B應(yīng)用的沙盒中,我們知道柠新,沙盒機(jī)制是不允許A訪問B沙盒中的文件昧辽,因此蘋果的解決方案是將F拷貝一份到A應(yīng)用的Documents/Inbox目錄下,再讓A打開F登颓。
②是否會(huì)被iTunes同步
是
4搅荞、Library
①存放內(nèi)容蘋果建議用來存放默認(rèn)設(shè)置或其它狀態(tài)信息。
②是否會(huì)被iTunes同步
是(但是要除了Caches子目錄外)
5、Library/Caches
①存放內(nèi)容主要是緩存文件咕痛,用戶使用過程中緩存都可以保存在這個(gè)目錄中痢甘。。前面說過茉贡,Documents目錄用于保存不可再生的文件塞栅,那么這個(gè)目錄就用于保存那些可再生的文件,比如網(wǎng)絡(luò)請求的數(shù)據(jù)腔丧。鑒于此放椰,應(yīng)用程序通常還需要負(fù)責(zé)刪除這些文件。
②是否會(huì)被iTunes同步
否
6愉粤、Library/Preferences
①存放內(nèi)容應(yīng)用程序的偏好設(shè)置文件砾医。我們使用NSUserDefaults寫的設(shè)置數(shù)據(jù)都會(huì)保存到該目錄下的一個(gè)plist文件中,這就是所謂的寫到plist中
②是否會(huì)被iTunes同步
是
7衣厘、tmp
①存放內(nèi)容各種臨時(shí)文件如蚜,保存應(yīng)用再次啟動(dòng)時(shí)不需要的文件。而且影暴,當(dāng)應(yīng)用不再需要這些文件時(shí)應(yīng)該主動(dòng)將其刪除错邦,因?yàn)樵撃夸浵碌臇|西隨時(shí)有可能被系統(tǒng)清理掉,目前已知的一種可能清理的原因是系統(tǒng)磁盤存儲(chǔ)空間不足的時(shí)候型宙。
②是否會(huì)被iTunes同步
否
#import <UIKit/UIKit.h>
@interface Sandbox : NSObject
+ (NSString *)appPath; // 程序目錄撬呢,不能存任何東西
+ (NSString *)docPath; // 文檔目錄,需要ITUNES同步備份的數(shù)據(jù)存這里
+ (NSString *)libPath; // libary目錄
+ (NSString *)libPrefPath; // 配置目錄妆兑,配置文件存這里
+ (NSString *)libCachePath; // 緩存目錄魂拦,系統(tǒng)永遠(yuǎn)不會(huì)刪除這里的文件,ITUNES會(huì)刪除
+ (NSString *)tmpPath; // 緩存目錄箭跳,APP退出后晨另,系統(tǒng)可能會(huì)刪除這里的內(nèi)容
@implementation Sandbox
+ (NSString *)appPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}
+ (NSString *)docPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}
+ (NSString *)libPath
{
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
}
+ (NSString *)libPrefPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
return [Sandbox createPathWithParentPath:[paths objectAtIndex:0] pathName:@"Preference"];
}
+ (NSString *)libCachePath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
return [Sandbox createPathWithParentPath:[paths objectAtIndex:0] pathName:@"Caches"];
}
+ (NSString *)tmpPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
return [Sandbox createPathWithParentPath:[paths objectAtIndex:0] pathName:@"tmp"];
}
+(NSString *)createPathWithParentPath:(NSString *)aParentPath pathName:(NSString *)aPathName
{
if (!aParentPath || aParentPath.length <= 0) {
returnnil;
}
NSString *path = [aParentPath stringByAppendingPathComponent:aPathName];
if (![[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:NULL]) {
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
}
return path;
}