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也是阔以的,毕竟实践出真知。有问题请留言。

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