iOS 中使用 Swift 的库目录

Posted

技术标签:

【中文标题】iOS 中使用 Swift 的库目录【英文标题】:Library directory in iOS using Swift 【发布时间】:2017-05-12 13:53:58 【问题描述】:

我很困惑。我想存储一些用户文件,但不是文档。我正在使用:

static var directory: URL 
    get  
       return FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0].appendingPathComponent("Caches").appendingPathComponent("OnlineFiles") 
    

总是一样。每次我启动应用程序时,我都会得到不同的 URL。 难道我做错了什么?项目文件中是否有一些我需要设置的魔法开关?

一旦是这样的:

file:///var/mobile/Containers/Data/Application/4547EF22-EB33-4B65-9772-67ED7870E3E9/Library/Caches/OnlineFiles

其他时间是:

file:///var/mobile/Containers/Data/Application/83C8CDD7-B4D0-48B2-8A8E-9BD48C5D1754/Library/Caches/OnlineFiles

/Application/ 和 /Library/ 之间的这个字符串似乎是随机的。以后第二次打开应用可以访问文件时,如何将文件存储在一个位置?

[编辑]:如何获取每次更新应用时都不会更改的路径?

【问题讨论】:

你的代码没问题。这按预期工作。为什么会出现这个问题? 每次更新应用程序时(当您从 Xcode 重新安装应用程序时也会发生这种情况),它会被放入不同的目录中。只是不要使用绝对 URL。 “/Application/ 和 /Library/ 之间的字符串”是应用程序 UID 编辑 - 你为什么关心它是否改变?它应该改变。与其问如何避免某些正常工作的事情,不如解释一下您实际上遇到了什么问题。 【参考方案1】:

这是苹果的安全机制。每次重启APP时,苹果对APP的沙箱路径进行加密,防止其他程序访问。APP里面的加密密钥。所以在程序结束之前,不管在哪里访问APP沙盒,返回路径都是一样的。想了解更多,可以看一下苹果的沙盒机制。

【讨论】:

这是很好的解释,但不是答案。 Sulthan 在评论中提供了答案:“不要使用绝对 URL”,始终使用:currentLibraryDirectory.appendingPathComponent(relativePath)

以上是关于iOS 中使用 Swift 的库目录的主要内容,如果未能解决你的问题,请参考以下文章

在ObjC中使用Swift库

使用 Swift 删除 iOS 目录中的文件

如何在swift ios中减小图像的大小[重复]

在Realm swift中重命名类的最佳方法

在iOS(Swift)中生成后获取RSA密钥对作为字符串?

Swift3、XCode8、iOS10 的 Swifty JSON 性能下降