首页 > 解决方案 > 如何在 iOS 中获得不会过期的缓存?

问题描述

我在我的应用程序中使用缓存框架进行缓存。缓存框架可以提供带有过期选项的混合存储。我已经.never为两种存储(磁盘和内存)设置了,但缓存仍然可以过期。

在我的应用程序中,我需要Data()永久缓存一些,并在必要时更新它(但不经常)。获取此缓存的速度不是必需的。

可以使用这个框架吗?我可以用 justDiskStorage代替Storage吗?我认为它可能会过期,因为它一直保存到系统内存(我认为是 RAM)中,所以 iOS 可以在需要时清理它,但 iOS 可以清理磁盘存储吗?

标签: iosswiftcaching

解决方案


所以,我在 Apple 指南中找到了一些关于此的内容:

使用“不备份”属性指定应保留在设备上的文件,即使在存储空间不足的情况下也是如此。将此属性用于可以重新创建但即使在存储空间不足的情况下也需要保留的数据,以便您的应用程序正常运行,或者因为客户希望它在离线使用期间可用。此属性适用于标记的文件,无论它们位于哪个目录,包括 Documents 目录。这些文件不会被清除,也不会包含在用户的 iCloud 或 iTunes 备份中。由于这些文件确实使用设备上的存储空间,因此您的应用程序负责定期监控和清除这些文件。

我为此编写了简单的函数:

func setExludedFromBackup() {
    var url = try? FileManager.default.url(
        for: .documentDirectory,
        in: .userDomainMask,
        appropriateFor: nil,
        create: true).appendingPathComponent("MyFolder")
    var resuorceValues = URLResourceValues()
    resuorceValues.isExcludedFromBackup = true
    try? url?.setResourceValues(resuorceValues)
 // print(try? url?.resourceValues(forKeys: [.isExcludedFromBackupKey]).isExcludedFromBackup)
 // you can check if your directory excluded from backup (it excluded if "Optional(Optional(true))" printed)
}

是的,它是 Documents 文件夹,因为其他文件夹仍在继续被清除。

您只需在某处调用此函数(我使用过 AppDelegate),并在调用它之前检查目录是否已从备份中排除。如果 iOS 内存不足,可以保护 Documents 目录中的“MyFolder”不被删除!因此,只要我愿意,我的数据就可以使用。但是你也必须包括事后删除机制,因为这些数据永远不会被自动删除,设备上的内存空间也不会被释放。就我而言,我只是使用了缓存框架的expiry属性

PS我不确定Apple会如何对此做出反应,同时检查您的AppStore,因此请告诉他们您的应用程序中的离线使用以及您对文档文件夹所做的事情,不要忘记描述您的删除机制。我希望这不会违反 Apple 准则,并且应用程序不会被拒绝。


推荐阅读