如何写入OS X上的本地Application Support目录

时间:2018-01-10 18:09:18

标签: swift macos swift4

我正在为OS X编写一个Swift应用程序,其主要目的是从插入计算机的USB设备读取数据并将其上传到我们的服务层进行分析和存储。该应用程序适用于在其安装的Mac上拥有帐户的任何用户。

为了支持和进一步的分析目的,该应用还需要在每次上传时包含其安装ID ,这是在首次启动应用程序期间生成的UUID。这使我们的支持团队能够将我们的应用程序的安装实例与有权访问它的用户组相关联,从而使故障排除和数据收集更加准确和精确。

在我的应用中,我将安装ID 存储在一个文件中,并尝试将该文件存储在一个中央位置,即本地Application Application目录。

更具体地说,我想将它存储在以下位置:

  

Macintosh HD / Library / Application Support / MyApp / installId / installId.txt。

这是我尝试在Application Support目录中保存文件的方法:

var installId = String()
let fileManager = FileManager.default
var isDir: ObjCBool = false
if let appSupportDirectory = fileManager.urls(for: .applicationSupportDirectory, in: .localDomainMask).first {
    let installIdDirectory = appSupportDirectory.appendingPathComponent(Bundle.main.bundleIdentifier ?? "MyApp").appendingPathComponent("installId")
    let installIdFile = installIdDirectory.appendingPathComponent("installId.txt")
    do {
        if fileManager.fileExists(atPath: installIdFile.path, isDirectory: &isDir) {
            if !isDir.boolValue {
                let data = try String.init(contentsOf: installIdFile)
                installId = String(data.split(separator: ":")[1])installId))")
            }
            else {
                print("\nError: installId file appears to be a directory.")
            }
        }
        else {
            try fileManager.createDirectory(at: installIdDirectory, withIntermediateDirectories: true, attributes: nil)
            let pendingInstallId = "installId:\(UUID())"
            try pendingInstallId.write(to: installIdFile, atomically: false, encoding: String.Encoding.utf8)
            installId = pendingInstallId
        }
    } catch {
        print("\nError: \(error.localizedDescription)")
    }
}
else {
    print("\nError: Could not find Application Support Directory.")
}

当我运行我的应用时,收到以下错误:

  

您无权将文件“installId”保存在“MyApp”文件夹中。

不会发生错误;但是,如果我选择将我的文件存储在用户域掩码的Application Support目录中。创建包含安装ID 的文件,并将其存储在我的用户应用程序支持目录中名为 MyApp 的文件夹中。

我已经尝试过寻找解决问题的方法,但效果不是很好。一些帖子声称我正在尝试存储我的文件的目录是为具有管理员权限(source 1)的应用程序保留的,而其他人声称我应该使用用户域掩码中的应用程序支持目录来执行此类任务( source 2)。但是,我需要在安装了应用程序的Mac上拥有帐户的任何用户访问此文件,因此本地域掩码的“应用程序支持”目录似乎更适合此方案。

有人可以帮助我或指出我正确的方向吗?如何将数据保存到此目录?如果我不能这样做,是否有另一个中心位置,我可以做到这一点,用户不太可能冒险并删除该数据?

提前致谢!

1 个答案:

答案 0 :(得分:0)

目录/Library/Application Support/属于root。您可以通过输入以下内容在终端中看到:

$ ls -al /Library | grep Appl*

drwxr-xr-x   15 root  admin   480 Jan  4 16:10 Application Support

要写入该目录,您的App需要root权限。请参阅Apple Documentation以安全地实施此操作。 Apple文档提到了authopen,这在您首次运行应用程序时在支持文件夹中创建文件似乎是合理的。