1.前言:
每個iOS程序都有一個獨立的文件系統(存儲空間),而且只能在對應的文件系統中進行操作,此區域被稱為沙盒。應用必須待在自己的沙盒里,其他應用不能訪問該沙盒。所有的非代碼文件都要保存在此,例如屬性文件plist、文本文件、圖像、圖標、媒體資源等。如下圖:
沙盒中相關路徑
AppName.app 應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經過簽名,所以不能在運行時對這個目錄中的內容進行修改,否則會導致應用程序無法啟動。
Documents/ 保存應用程序的重要數據文件和用戶數據文件等。用戶數據基本上都放在這個位置(例如從網上下載的圖片或音樂文件),該文件夾在應用程序更新時會自動備份,在連接iTunes時也可以自動同步備份其中的數據。
Library:這個目錄下有兩個子目錄,可創建子文件夾。可以用來放置您希望被備份但不希望被用戶看到的數據。該路徑下的文件夾,除Caches以外,都會被iTunes備份.
Library/Caches: 保存應用程序使用時產生的支持文件和緩存文件(保存應用程序再次啟動過程中需要的信息),還有日志文件最好也放在這個目錄。iTunes 同步時不會備份該目錄并且可能被其他工具清理掉其中的數據。
Library/Preferences: 保存應用程序的偏好設置文件。NSUserDefaults類創建的數據和plist文件都放在這里。會被iTunes備份。
tmp/: 保存應用運行時所需要的臨時數據。不會被iTunes備份。iPhone重啟時,會被清空。
2.主題
因為每個app下的沙盒路徑都是封閉的,其他應用訪問不到,也就導致了文件不能共享。只能自己在代碼中維護本app內的文件。這給用戶帶來很多的不便。因此,蘋果除了一個系統的“文件”的app,用來管理app內的文件。但是系統的“文件”這個app不是可以管理全部的app下的文件,他只能管理對“文件”這個app開放權限的APP。
3.如何讓自己的app對“文件”app開放管理權限?
在你的 App 內的文件可以出現在 Files 里面之前,你必須保證你的 App 是支持 Files 中打開并且可以分享的。這需要你在你的 App 內的 Info.plist 中添加兩個鍵值對,第一個是 UIFileSharingEnabled,這個可以使 iTunes 分享你文件夾內的內容;第二個是 LSSupportsOpeningDocumentsInPlace ,它保證了你文件夾內本地文件的獲取權限,你需要將這兩個鍵值對的值設置為 YES ,如下:
Application supports iTunes file sharing YES
Supports opening documents in place YES
接著,再運行程序,打開系統中“文件”的app,就可以獲取就可以在 Files 里面 我的 iPhone 中看到以你項目名為文件夾名的文件夾(如果你在 Files 中看不到 我的 iPhone這一項,你只需要在照片中選中一張照片共享到 Files 里面,就可以看到這一項了)。
4.如何隱藏最終的文件
在 Files 里面的文件夾,會將沙盒內 Documents 文件夾內的所有文件都顯示出來,因此對一些私密的文件來說是不安全的,那么應該如何避免呢?
這個取決于它的重要性,如果它不是那么重要的,我們可以將它們存放在 cachesDirectory 或者是 temporaryDirectory 文件夾下面;如果它是重要的文件,大多數情況下,我們是需要將它們備份在 iCloud 上的,這樣的文件我們建議將它存放在 applicationSupportDirectory 目錄下。
5.app如何獲取到“文件”app下管理的文件到本app內?
一般我們用icould來實現文件的共享,但是icould的存儲空間只有5G,遠遠不夠。但是“文件”的app可以獲取到對“Files”開放權限的app的文件,那么我們可以通過 "UIDocumentPickerViewController"這個控制器來打開“文件”app的文件。使用步驟:
(1)集成2個代理:<UIDocumentPickerDelegate, UIDocumentInteractionControllerDelegate>
(2)在需要的控制器中,打開“UIDocumentPickerViewController”;
//打開文件管理的控制
- (void)presentDocumentCloud {
NSArray *documentTypes = @[@"public.text",
@"public.content",
@"public.source-code",
@"public.image",
@"public.audiovisual-content",
@"com.adobe.pdf",
@"com.apple.keynote.key",
@"com.microsoft.word.doc",
@"com.microsoft.excel.xls",
@"com.microsoft.powerpoint.ppt"];
UIDocumentPickerViewController *documentPickerViewController = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:documentTypes inMode:UIDocumentPickerModeImport];
documentPickerViewController.delegate = self;
[self presentViewController:documentPickerViewController animated:YES completion:nil];
}
(3)實現代理:
#pragma mark - UIDocumentPickerDelegate
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
NSArray *array = [[url absoluteString] componentsSeparatedByString:@"/"];
NSString *fileName = [array lastObject];
fileName = [fileName stringByRemovingPercentEncoding];
NSLog(@"--->>>>%@",fileName);
//在此已獲取到文件,可對文件進行需求上的操作
// if ([self iCloudEnable]) {
if (![NSData dataWithContentsOfURL:url]) {
[QMUITips showWithText:@"只能選擇本文件夾下的文件"];
return;
}
// }
}
- (BOOL)iCloudEnable {
NSFileManager *manager = [NSFileManager defaultManager];
NSURL *url = [manager URLForUbiquityContainerIdentifier:nil];
if (url != nil) {
return YES;
}
NSLog(@"iCloud 不可用");
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"icloud" message:@"iCloud 不可用, 不能選擇文件上傳" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alert show];
return NO;
}
其中需要注意的是,第二步中,documentController的Mode有4種類型:
目前,我只能用前兩種,前兩種是讀取和查看;后兩種,猜測是把本地文件放到“文件”下的路徑,也就是微信中,“存儲到"文件"”的類似操作,但是因為我在項目中,沒有配置icloud的證書,所以不能用后兩種。
6.如何把本地的文件存儲到“文件”app上?
待研究,估計是把documentController的Mode改成ExportToService上。但是需要配置icould,配置icoould的教程如下鏈接:
http://www.lxweimin.com/p/50348b35c986
配置iCloud
配置iCloud,首先你就先要有一個真實的蘋果開發者賬號,沒錯,就是一年688的那個。開通了之后,在Xcode中新建一個項目。然后在 TARGETS -> Capabilities -> iCloud中打開開關就可以了。
就像這樣,是不是很簡單啊。
誒,可是好像有什么地方不對,有些地方爆紅了。
這是因為我們還沒有給這個App ID 注冊,所以接下來我們去蘋果的 開發者官網 添加一個App ID,在添加的時候勾選 iCloud 服務就可以啦。
什么?你說你已經創建過App ID了???沒關系,在管理App ID這邊選擇 Edit,然后在勾選iCloud也是一樣的。
這時候回到Xcode中在看一下,應該就已經沒有爆紅了吧。
什么???還有爆紅??? 那你重啟一下XCode試試吧。再不行,你重啟一下電腦試試好了
原文鏈接:https://blog.csdn.net/lyz0925/article/details/104460366