当我尝试通过 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会引发隐私错误

无法访问 ios 捆绑资源

Requirejs:当我尝试通过requirejs获取它时,函数未定义

如何访问某个 info.plist?