【问题标题】:Errors when writing to Application Support directory写入应用程序支持目录时出错
【发布时间】:2019-10-08 03:46:16
【问题描述】:

我已经看到这个问题在这里问了十几次,但解决方案似乎无法解决我的情况。

我有一些内容需要存储在“应用程序支持”目录中,但尝试在那里写入时仍然收到错误消息。

func assetFilesDirectory(asset: Asset, shouldCreate: Bool) -> URL? {
        do {
            let applicationSupportFolderURL = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
            let folder = applicationSupportFolderURL.appendingPathComponent("\(asset)")
            if !FileManager.default.fileExists(atPath: folder.path) {
                if shouldCreate {
                    try FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil)
                } else {
                    return nil
                }
            }

            return folder
        } catch {
            print(error)
            return nil
        }
    }

当这段代码运行时,我不断收到以下错误:

“您无权将文件“asset-backgrounds”保存在“Application Support”文件夹中。”

我尝试在下一行中切换 create 参数的值,但我也遇到了同样的错误,只是引用了 Application Support 目录和图书馆

let applicationSupportFolderURL = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

我没有看到任何理由说明这会对 API 产生任何影响,但作为信息,我在 tvOS 平台(物理设备)上运行此代码。没有任何信息表明 Application Support 应该在 tvOS 上受到权限限制。

【问题讨论】:

  • 如果我尝试在“应用程序支持”中创建文件夹,此行会引发错误 - 尝试 FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil)
  • 哦,当然,我明白了。对于那个很抱歉。但这太令人困惑了:asset 怎么可能是path 组件?这里需要的是一个字符串。
  • 对不起,不清楚 - 资产是字符串类型的枚举
  • 好吧,我尝试了一个字符串,它对我来说效果很好。会不会是因为有了 Asset 让你感到困惑?
  • 我会在几个小时后尝试这个,当我回到那台机器上时 - 谢谢!

标签: ios swift tvos nsfilemanager


【解决方案1】:

我用字符串替换了您的资产(无论是什么),它工作正常:

func assetFilesDirectory(name: String, shouldCreate: Bool) -> URL? {
    do {
        let applicationSupportFolderURL = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let folder = applicationSupportFolderURL.appendingPathComponent(name)
        if !FileManager.default.fileExists(atPath: folder.path) {
            if shouldCreate {
                try FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil)
                print("ok")
            } else {
                return nil
            }
        }

        return folder
    } catch {
        print(error)
        return nil
    }
}

我打过电话

let url = self.assetFilesDirectory(name: "test", shouldCreate: true)
print(url)

我得到了"ok" 和 URL file:///blahblahblah/Library/Application%20Support/test,这正是人们所期望的。

【讨论】:

  • 我已经复制了这段代码,但它仍然为我返回相同的错误。该函数返回 nil 并且不打印“ok”。我开始怀疑“应用程序支持”是否实际上在 tvOS 上受到限制,尽管没有这样记录。您可以在什么平台上运行此代码?
  • 我在 tvOS 模拟器上测试过。我没有真正的 Apple TV。 :(
  • 感谢您的所有支持 - 看起来这是一个 Apple 错误。在模拟器上运行您的代码后,它会立即完美运行。但是,我尝试在多台物理 Apple TV 上运行它,并且始终抛出相同的异常。我已经向 Apple 提交了一份错误报告来解决这个问题。
  • 好的,但是请给我一台 Apple TV,这样我就可以自己测试了 :)))))))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多