iOS 14.0 beta 沙盒緩存策略變化

一、問題描述
    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

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也是闊以的,畢竟實踐出真知。有問題請留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章