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

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

相关推荐
游戏开发爱好者87 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
黑码哥8 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
2501_915106329 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106329 小时前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
熊猫钓鱼>_>10 小时前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
徐同保1 天前
通过ip访问nginx的服务时,被第一个server重定向了,通过设置default_server解决这个问题
ios·iphone
2501_915918411 天前
在 iOS 环境下查看 App 详细信息与文件目录
android·ios·小程序·https·uni-app·iphone·webview
2501_916007471 天前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview
夏幻灵2 天前
HTTPS全面解析:原理、加密机制与证书体
ios·iphone
TheNextByte12 天前
如何在iPhone上恢复已删除的笔记的综合指南
笔记·ios·iphone