关注我,每天分享一个关于 iOS 的新知识
前言
对于手机硬盘的存储空间,最早的 iPhone 存储空间已经从 4 GB 闪存增长到现在最高 1TB 的 SSD。如果再加上 iCloud 等技术,我们的存储存储空间会更大,但尽管如此,随着应用的不断增大和存储需求日益增长,存储空间不足的情况还是时有发生。
当用户的存储空间不足时,进行 IO 操作会导致 App 异常甚至闪退,今天来探讨下,如何检测存储空间不足的情况,以及应该如何处理这种情况。
我的 App 是否需要考虑硬盘空间不足的情况?
在开始之前,请思考这个问题,如果你的 App 不会往磁盘存储数据,比如只是展示一些 JSON 数据,那么就不需要考虑磁盘空间不足的问题,因为这种情况在你的 App 下不太可能发生。
相反,如果你的 App 在某些情况下会将数据写入磁盘(比如下载数据到磁盘),则可能需要考虑存储空间不足的情况。
用模拟器模拟磁盘内存不足的情况
要想在手机上测试这种情况比较难,因为现在大多数手机磁盘空间都很大,即使是可以随便造的测试机,也不太容易达成这种条件。
其实 Xcode 的模拟器可以用来模拟磁盘空间不足的情况,首先创建一个空项目,随便找一个模拟器运行,执行以下代码找到当前模拟器所属的文件夹位置:
swift
print("当前模拟器的文件存储位置为:", NSHomeDirectory())
关于访问模拟器的文件位置也可以看之前的这两篇文章。
然后在电脑文件中找到这个文件夹,可以看到这个文件夹中默认有四个文件夹:

我们以 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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!