一、問題描述
iOS 14.0 beta 暴露了開發者存儲在沙盒 Document 目錄下的所有緩存數據
二、如何安裝 iOS 14.0 beta 版本
2.1 安裝 Profile 文件
2.2 檢查更新
2.3 iOS 14 支持設備 6s 以上
三、如何重現問題
QQ音樂、CSDN客戶端的表現截圖
正常的 例如:新浪微博 截圖
四、如何解決問題
4.1 問題的產生
4.2 問題解決
一、問題描述
偶然間更新了 iOS 14.0 beta 版本,體驗了一把,發現了沙盒緩存發生了變化,系統會將開發者緩存在 Document 下的所有文件遞歸遍歷顯示給用戶,而且用戶可編輯刪除。這個問題就很嚴重,如果用戶不小心把核心文件數據刪除了,那 App就不可用了。如果僅是緩存一些網絡數據影響可能不大,如果是去中心的數據緩存在本地,那問題可想而知。QQ音樂、CSDN 等客戶端緩存數據都是在沙盒下的 Documnet 文件夾中。把這類數據暴露給用戶,用戶看着就很傻逼了。
二、如何安裝 iOS 14.0 beta 版本
2.1 安裝 Profile 文件
用 iPhone 的 Safari 打開 超鏈下載中心 , 登錄開發者賬號。
選擇 Operating Systems,往下拉找到 iOS 14 beta,點擊 install Profile
安裝此描述文件即可(設置->通用->描述文件)。
2.2 檢查更新
在檢查更新一欄,直接升級 14.0 beta 版本即可。
三、如何重現問題
打開 設置 -> 通用 -> iPhone 存儲空間 -> 右上角搜索 QQ音樂/CSDN
四、如何解決問題
4.1 問題的產生
QQ 音樂、CSDN 客戶端 將其緩存數據 存在沙盒目錄下 的 Document 目錄下
4.2 問題解決
將 Document 目錄下的文件夾 移動到 Library 目錄下自建文件夾裏即可。你應該會用到的文件操作代碼
// 將Document 目錄下所有文件轉移到 Library 目錄下的 testCache 文件夾下
- (void)documentFileMoveToLibrary
{
NSString *documentRootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSArray *subpaths = [fileManager subpathsAtPath:fromPath];
if(subpaths.count>0){
for (NSString *subpath in subpaths) {
NSString *fromFullPath = [documentRootPath stringByAppendingPathComponent:subpath];
NSString *toFullPath = [[self libraryCache] stringByAppendingPathComponent:subpath];
NSError *error = nil;
[fileManager moveItemAtPath:fromFullPath toPath:toFullPath error:&error];
if (!error) {
// NSLog(@"移動成功");
}
}
}
}
//建立 Library 目錄下的 testCache 文件夾並返回路徑
- (NSString*)libraryCache
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *LibraryRootPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [NSString stringWithFormat:@"%@/testCache",LibraryRootPath];
if (![fileManager fileExistsAtPath:filePath]) {
NSError *error;
[fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error];
}
return [NSString stringWithFormat:@"%@/testCache/",LibraryRootPath];
}
至於沙盒 Documents、 Library 、tmp 分別的作用,不知道的自行百度,資料非常多。驗證上面的問題也很簡單,更新系統,安裝上面截圖的 App。自己有時間寫個demo也是闊以的,畢竟實踐出真知。有問題請留言。