设备没有存储空间时的处理方式

关注我,每天分享一个关于 iOS 的新知识

前言

对于手机硬盘的存储空间,最早的 iPhone 存储空间已经从 4 GB 闪存增长到现在最高 1TB 的 SSD。如果再加上 iCloud 等技术,我们的存储存储空间会更大,但尽管如此,随着应用的不断增大和存储需求日益增长,存储空间不足的情况还是时有发生。

当用户的存储空间不足时,进行 IO 操作会导致 App 异常甚至闪退,今天来探讨下,如何检测存储空间不足的情况,以及应该如何处理这种情况。

我的 App 是否需要考虑硬盘空间不足的情况?

在开始之前,请思考这个问题,如果你的 App 不会往磁盘存储数据,比如只是展示一些 JSON 数据,那么就不需要考虑磁盘空间不足的问题,因为这种情况在你的 App 下不太可能发生。

相反,如果你的 App 在某些情况下会将数据写入磁盘(比如下载数据到磁盘),则可能需要考虑存储空间不足的情况。

用模拟器模拟磁盘内存不足的情况

要想在手机上测试这种情况比较难,因为现在大多数手机磁盘空间都很大,即使是可以随便造的测试机,也不太容易达成这种条件。

其实 Xcode 的模拟器可以用来模拟磁盘空间不足的情况,首先创建一个空项目,随便找一个模拟器运行,执行以下代码找到当前模拟器所属的文件夹位置:

swift 复制代码
print("当前模拟器的文件存储位置为:", NSHomeDirectory())

关于访问模拟器的文件位置也可以看之前的这两篇文章。

在 iOS 模拟器上访问 App 文件

iOS 16 开始,获取系统文件夹的 API

然后在电脑文件中找到这个文件夹,可以看到这个文件夹中默认有四个文件夹:

我们以 Documents 这个文件夹为例来演示这个问题,首先打开终端执行命令:

javascript 复制代码
hdiutil create -size 1m -fs HFS+ /tmp/ios-new-test.dmg

这行命令利用 hdiutil 命令创建一个 1 MB 空间的磁盘映像,当然大小你可以自己来定。

然后在本地打开 /tmp 文件夹,将会看到这个磁盘镜像已经创建成功了:

通过鼠标右键,显示简介,也可以看到更详细的信息:

接下来,使用以下命令把这个镜像挂载到模拟器的 Documents 文件夹:

arduino 复制代码
hdiutil attach /tmp/ios-new-test.dmg -mountpoint /Users/{你的电脑名}/Library/Developer/CoreSimulator/Devices/4497475B-92C8-474B-8A6E-2157DD42ACD3/data/Containers/Data/Application/D7EBCFE3-EA89-47E5-9138-6A6C4B903FA0/Documents

注意,执行这个命令时,你的镜像是不能打开的,否则可能报 资源暂时不可用 这个错误。

最后,我们就可以尝试往这个文件夹下写文件来重现磁盘空间不足的错误了:

swift 复制代码
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let path = Bundle.main.path(forResource: "1", ofType: "mp4")!
        let data = try! Data(contentsOf: URL(fileURLWithPath: path))
        let targetFilePath = "\(NSHomeDirectory())/Documents/1.mp4"
        do {
            try data.write(to: URL(filePath: targetFilePath))
        } catch {
            print("写入文件失败:\(error.localizedDescription)")
        }
    }
}

我这里是找了一个大于 1 MB 的视频文件,先根据本地路径,把视频转为 Data 数据,再尝试把 Data 数据存储到 Documents 文件夹下,最终结果会打印报错:

然后可以根据报错来给用户提供更友好的提示。

清理自定义磁盘

修复问题之后,最好把刚刚挂载在模拟器上的磁盘镜像恢复掉,首先执行命令获取当前的镜像列表:

然后找到只有 1 MB 空间的那个,就是我们刚刚创建的:

然后执行以下命令分离镜像:

在模拟器上也可以直接删除 App 重新安装来恢复磁盘空间。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
与火星的孩子对话11 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
恋猫de小郭1 天前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
万少2 天前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
点金石游戏出海2 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
旷世奇才李先生2 天前
Swift 安装使用教程
开发语言·ios·swift
90后的晨仔2 天前
Xcode16报错: SDK does not contain 'libarclite' at the path '/Applicati
ios
finger244802 天前
谈一谈iOS线程管理
ios·objective-c
Digitally2 天前
如何将大型视频文件从 iPhone 传输到 PC
ios·iphone
梅名智2 天前
IOS 蓝牙连接
macos·ios·cocoa
美狐美颜sdk2 天前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk