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