当我尝试通过 Bundle.main 访问它时,我的 plist 返回 nil,但我知道它在那里
Posted
技术标签:
【中文标题】当我尝试通过 Bundle.main 访问它时,我的 plist 返回 nil,但我知道它在那里【英文标题】:My plist returns nil when I try to access it through the Bundle.main, but I know it's there 【发布时间】:2021-07-02 18:15:45 【问题描述】:我在代码中创建了一个名为 Configuration.plist
的 .plist 文件。运行应用程序一次后,我可以在文件系统中(使用模拟器)看到它确实存在。
我
我正在学习 ios 开发。在互联网上搜索“如何从我自己的 plist 中读取”的答案后,我不断看到一些教程告诉我要像这样阅读这个文件:
if let path = Bundle.main.path(forResource: K.files.config, ofType: "plist"),
let xml = FileManager.default.contents(atPath: path),
let config = try? PropertyListDecoder().decode(Configuration.self, from: xml)
print("We have a config: \(config.mainTitle)")
return config
else
print("No config ☹️")
return nil
在上面的例子中,K.files.config 只是一个字符串常量,Configuration 类符合 Codable 协议。 K.file.config 的值为“配置”。然而,在上面的例子中,path 总是返回 nil。但我知道这个文件存在!!
事实上,当我像这样访问这个文件时,我实际上可以得到路径:
let fileName = K.files.config + ".plist"
var filePath = ""
let dirs: [String] = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true)
if dirs.count > 0
let dir = dirs[0]
filePath = dir.appendingFormat("/" + fileName)
print("Local path: \(filePath)")
else
print("Could not find local directory for Configuration.plist")
return nil
if let xml = FileManager.default.contents(atPath: filePath),
let config = try? PropertyListDecoder().decode(Configuration.self, from: xml)
print("got a config: \(config.mainTitle)")
else
print("didn't get the xml")
这更加冗长和丑陋。为什么第一种方法不起作用?
【问题讨论】:
【参考方案1】:当您创建 Configuration.plist
时,您会将其保存到 Documents 文件夹中...
该文件夹在您的应用程序包之外。
因此,在您的第一个代码块中,您尝试从包中加载它,但失败了。
您的第二个代码块正确地从 Documents 文件夹中查找并加载文件。
【讨论】:
太棒了!谢谢!所以,为了确定,文档文件夹仍然在我的应用程序的沙箱中,但不是主包?然后,我是否将我的配置 plist 保存在一般配置的好地方.....(我不希望它在设置包中) @JoMomma - 如果您要保存“常规配置”信息,那么 Documents 文件夹就可以了。您可能想快速了解其他文件夹以及何时/为何使用它们。在 Google 上快速搜索ios storage best practices
会发现大量信息。
感谢您为我指明正确的方向!我发现这两篇文章对任何偶然发现此线程的人都非常有帮助:medium.com/@anandin02/ios-storage-best-practices-294fca83ad9swiftbysundell.com/articles/…以上是关于当我尝试通过 Bundle.main 访问它时,我的 plist 返回 nil,但我知道它在那里的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试通过 OpenCv 访问网络摄像头时,Xcode 引发隐私错误
当我尝试在javascript(Nodejs)中的另一个类中访问它时,类变成一个空对象[重复]
当我尝试通过OpenCv访问网络摄像头时,Xcode会引发隐私错误