ios swift App 沙盒文件,ios 存储最佳体验
查了很多ios 沙盒存储,都是比较老的,不符合现在的情况,看了篇国外的文章感觉还可以,做下记录同时分享给大家,共同讨论下;From @lizh荔枝
原文地址:https://swiftlyanand.medium.com/ios-storage-best-practices-294fca83ad9
看图说明
1_TsHakh.png
-
1.Documents 文件夹
✅Store only those files in here which should be visible to the user.Contents of this folder is visible in the “Files” application provided it supports “Open in place” and “File sharing” is enabled.Content of the directory is persisted and included in the iCloud and iTunes backups. Disk space used in this directory is reported in the storage settings UI under your app’s “Documents and Data” total.
✅Few benefit of exposing the “Document directory” are files become visible in “Files” application and user can find their files in spotlight.
✅You can store files at the top level or you can create sub-directories. If you choose to create a sub-directory then keep in mind that not all names are allowed for directory name. I guess few directory names are reserved by Apple as I was not able to create an “Inbox” directory but rest all names that I tried worked.
✅ 只存储那些文件在这里,应该是可见的用户。这个文件夹的内容在“文件”应用程序中可见,前提是它支持“就地打开”和“文件共享”功能。目录的内容被持久化并包含在iCloud和iTunes备份中。该目录中使用的磁盘空间在应用程序的“文档和数据”总数下的存储设置UI中报告。
✅ 公开“文档目录”的好处是文件可以在“文件”应用程序中看到,用户可以在聚光灯下找到他们的文件。
✅您可以在顶层存储文件,也可以创建子目录。如果您选择创建子目录,那么请记住,不是所有的名称都允许作为目录名。我猜苹果保留了一些目录名,因为我不能创建一个“收件箱”目录,但我尝试过的所有名称都是有效的。
❗️❗️❗️注意 -要启用“就地打开”,在Info中添加“应用程序支持iTunes文件共享”或“UIFileSharingEnabled”键,值为“YES”。在Info.plist中添加“LSSupportsOpeningDocumentsInPlace”或“支持就地打开文档”键,值为“YES”,以启用“文件共享”。
2.png
-
2. Library / Application Support 文件夹
数据库可以放在此文件夹
✅ Store files in here that are required for your app but should never be visible to the user like your app’s database file.You can store files in here at the top level or create sub-directories.Content of the directory is persisted and included in the iCloud and iTunes backups.You can opt files out if they don’t need to be backed-up.Disk space used in the application support directory is reported in the storage settings UI under your app’s “Documents and Data” total.
✅ 在这里存储你的应用程序需要的文件,但不应该对用户可见,比如你的应用程序的数据库文件。您可以在这里的顶层存储文件或创建子目录。目录的内容被持久化并包含在iCloud和iTunes备份中。如果文件不需要备份,你可以选择退出。应用程序支持目录中使用的磁盘空间在应用程序的“文档和数据”总数下的存储设置UI中报告。
❗️❗️❗️Note — Unlike other directories mentioned here, “Application support” directory is not present by default in you application’s “Data container” and you need to create it first.
注意:不像这里提到的其他目录,“应用程序支持”目录在应用程序的“数据容器”中默认不存在,你需要首先创建它。
-
3. Library / Cache
缓存文件
✅Stores files in here that can be discarded when the space is low.This is a good location for any content that can be re-downloaded when needed.Contents of this directory is not included in the backups.When the device is low on disk space then iOS can help by clearing caches.Files will never be removed from your cache if your application is running and OS will start by clearing caches from apps that haven’t been used in a while.Files stored on the caches directory is not reported in the storage settings UI under your app’s “Documents and Data” total.
✅在这里存储可以在空间不足时丢弃的文件。对于任何可以在需要时重新下载的内容,这都是一个很好的位置。备份文件中不包含此目录的内容。当设备的磁盘空间不足时,iOS可以帮助清理缓存。如果你的应用程序正在运行,文件将永远不会从你的缓存中删除,操作系统将从一段时间没有使用过的应用程序中清除缓存。存储在缓存目录下的文件在你的应用程序的“文档和数据”总数下的存储设置UI中没有报告。
-
4. tmp —
关闭APP后,系统会自动删除
✅Put files in here that your won’t be needing for extended period of time.Even though operating system will periodically remove these files when your app is not running, it’s best to remove them when you are done with them.Like the cache directory, tmp directory is not backed up and is not reported in your apps “Documents and Data” total.
✅把你以后不需要的文件放在这里。尽管操作系统会在应用程序不运行时定期删除这些文件,但最好是在使用完它们后删除它们。和缓存目录一样,tmp目录没有备份,也没有在你的应用程序“文档和数据”总数中报告。
其他附加说明👇🔻
未命名文件(1).jpg-
/MyApp.app
1.程序包目录.
2.储存程序运行必须用到的数据资源(音频/视频/图片/编译好的代码/Nib等).
3.只能读取(程序安装时会对程序包进行签名,如程序运行时修改程序包数据,签名会失效,导致程序无法运行).
4.iTunes/iCloud同步不会备份此目录. -
/Documents
1.用户文件目录.
2.储存程序运行中生成的用户数据资源(如从网上下载的图片/音乐等).
3.可以通过系统自带的文件App,访问此路径资源.
4.iTunes/iCloud同步会备份此目录和所有子目录. -
/Documents/Inbox
1.收件箱目录.
2.储存由其他程序请求当前程序打开的文件(其他程序中的某个文件需要用此程序打开,会把那个文件复制一份到此目录).
3.可读取,可删除,不能新建和编辑. -
/Library
1.系统文件目录.
2.储存程序运行中生成的系统数据资源(如文本文件/系统缓存文件等).
3.可创建子文件夹,此目录中的资源不会公开给用户,也不要储存用户相关的数据.
4.iTunes/iCloud同步会备份此目录和所有子目录(Caches子目录除外). -
/Library/Caches
1.系统缓存目录.
2.储存程序再次启动时需要的支持文件/缓存文件和日志文件. -
/Library/Preferences
保存应用程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这里创建文件,而是需要通过NSUserDefault这个类来访问应用程序的偏好设置。
iTunes会自动备份该文件目录下的内容。
比如说:是否允许访问图片,是否允许访问地理位置......
1.系统偏好目录.
2.储存程序的偏好设置数据资源(Plist文件).
-
/Library/SplashBoard
1.系统启动图目录.
2.储存程序启动图缓存数据资源.
3.更新启动图后还是显示旧启动图可尝试清空此目录数据. -
/Library/Application Support
1.系统支持目录.
2.储存除用户相关的数据以外所有的数据资源(如游戏新关卡等).
3.苹果建议此目录中所有数据放在自定义子目录中,子目录名称以程序Bundle Identifier或公司名命名. -
/Temp
1.临时文件目录.
2.储存程序本次运行时所需要的临时数据资源(如调用系统相机拍摄的照片/视频等).
3.iPhone重启时,会自动清除该目录下所有文件,所以照片/视频要及时保存到系统相册中.
4.苹果建议编程人员应该在数据长时间不使用时主动删除该目录下的文件.
4.iTunes/iCloud同步不会备份此目录. -
获取对应目录路径
NSSearchPathForDirectoriesInDomains();
1.查找文件路径函数
2.返回值:是一个数组,只有一个NSString元素,即查找的路径
3.参数1:NSDocumentDirectory 表示需要查找的目录
4.参数2:NSUserDomainMask 表示在用户的主目录中查找
5.参数3:YES 表示返回路径展开
// 沙盒根目录
NSString *homePath = NSHomeDirectory();
// Documents目录
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
// Library目录
NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject;
// Caches目录
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
// Preferences目录
NSString *preferencesPath = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES).firstObject;
// Application Support目录
NSString *applicationSupportPath = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES).firstObject;
// Temp目录
NSString *tempPath = NSTemporaryDirectory();
注:此处列出常用的几种获取目录路径的函数方法,更多详细内容可参看[iOS数据持久化]系列的NSBundle/NSFileManager等.