iOS:无法将NSData保存到库/应用程序支持

时间:2019-07-17 17:24:56

标签: ios swift nsdata

我无法将带有write(to:options :)的NSData对象保存到“库\应用程序支持”文件夹中。

我在模拟器和真实设备上尝试过。错误消息略有不同(请参见下文)。我还尝试了一个具有相同结果的子文件夹。

当我在Documents文件夹中尝试时,它确实起作用了。但是,我不想将此数据保存在用户可以看到的文件夹中。

guard let appSupportDirURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else {
    return false
}

let fileName = "test.tst"
let appSupportDirWithFileNameURL = appSupportDirURL .appendingPathComponent(fileName, isDirectory: false)

do {
    try persistentData.write(to: appSupportDirWithFileNameURL, options: .atomic)
} catch {
    print(error)
}

真实设备上的错误:

  

Error Domain = NSCocoaErrorDomain代码= 4“文件夹“ test.tst”不存在。” UserInfo = {NSURL = file:///var/mobile/Containers/Data/Application/EBFD7DCC-78F6-43FB-BE7C-BEBDA263AC41/Library/Application%20Support/test.tst,NSUserStringVariant = Folder,NSUnderlyingError = 0x281b4dc50 {Error Domain = NSPOSIXErrorDomain代码= 2“没有这样的文件或目录”}}   零

模拟器错误:

  

Error Domain = NSCocoaErrorDomain代码= 512“文件“ test.tst”无法保存在文件夹“ Application Support”中。” UserInfo = {NSFilePath = / Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / E5BA9579-BC2C-4EE6-A263-0B7F2D878529 / Library / Application Support /test.tst,NSUnderlyingError=0x6000017a4a50 {Error Domain = NSPOSIXErrorDomain Code = 20“ Not a directory”}}


有关重复问题的更新

我了解到duplicate link的论点是,默认情况下,应用程序的沙箱中不存在“应用程序支持”文件夹,但是当我在 application(_:didFinishLaunchingWithOptions :)中执行以下代码时从打印输出中可以看到该文件夹​​存在,因为我之前创建过该文件夹。

if let libraryDirURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first {
    let libraryDirContent = try? FileManager.default.contentsOfDirectory(at: libraryDirURL, includingPropertiesForKeys: nil, options: [])
    print(libraryDirURL)
    print(libraryDirContent)
}
  

file:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /   可选([file:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /首选项/,文件:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /缓存/])   文件:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /应用程序%20Support /

错误仍然相同。

  

Error Domain = NSCocoaErrorDomain代码= 4“文件夹“ test.tst”不存在。” UserInfo = {NSFilePath = / Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / 74CA2A5C-B49A-47E1-9C99-6890C6CFBBF0 / Library / Support / test,NSUserStringVariant =文件夹,NSUnderlyingError = 0x600003db7990 {Error Domain = NSPOSIXErrorDomain Code = 2“没有这样的文件或目录”}}


应用程序中的简单示例(_:didFinishLaunchingWithOptions:)

为了进行进一步的测试,我将其简化为直接在 application(_:didFinishLaunchingWithOptions:)中将字符串写入文件夹。如果有人可以告诉我到底是什么不起作用,将不胜感激。我先创建文件夹,然后再要求写入文件。错误是相同的。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    if let libraryDirURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first {
        let libraryDirContent = try? FileManager.default.contentsOfDirectory(at: libraryDirURL, includingPropertiesForKeys: nil, options: [])
        print(libraryDirURL)
        print(libraryDirContent)
        print()

        do {
            let f = "Appication Support"
            let d = libraryDirURL.appendingPathComponent(f, isDirectory: true)
            try FileManager.default.createDirectory(at: d, withIntermediateDirectories: true, attributes: nil)
        } catch {
            print("error")
        }

        let str = "test test test test"
        let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
        let filename = paths.appendingPathComponent("output.txt")

        do {
            try str.write(to: filename, atomically: true, encoding: String.Encoding.utf8)
            print("YAY")
        } catch {
            print(error)
        }
    }
}

0 个答案:

没有答案