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

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

相关推荐
Unlimitedz12 小时前
iOS内存管理中的强引用问题
macos·ios·cocoa
雨夜赶路人13 小时前
iOS开发--接入ADMob广告失败
ios
旭日猎鹰14 小时前
iOS崩溃堆栈分析
ios
SY.ZHOU15 小时前
Flutter 与原生通信
android·flutter·ios
鸿蒙布道师17 小时前
鸿蒙NEXT开发文件预览工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师17 小时前
鸿蒙NEXT开发全局上下文管理类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
树獭非懒18 小时前
ContentProvider存在的意义:从Android沙箱机制看安全数据共享的设计哲学
android·客户端
归辞...18 小时前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(二)
笔记·ios·cocoa
码客前端19 小时前
ios接入穿山甲【Swift】
macos·ios·cocoa
键盘敲没电20 小时前
【iOS】UITableView性能优化
ios·性能优化·ipad