【发布时间】:2018-01-10 18:09:17
【问题描述】:
我正在为 OS X 编写一个 Swift 应用程序,其主要目的是从插入计算机的 USB 设备读取数据并将其上传到我们的服务层进行分析和存储。该应用程序旨在供任何在其安装的 Mac 上拥有帐户的用户使用。
出于支持和进一步分析的目的,应用还需要在每次上传时包含其安装 ID,这是在应用首次启动期间生成的 UUID。这使我们的支持团队能够将我们应用的安装实例与有权访问它的用户集相关联,以便更准确、更准确地进行故障排除和数据收集。
在我的应用程序中,我将 安装 ID 存储在一个文件中,并尝试将该文件存储在一个中心位置,即本地应用程序支持目录。
更具体地说,我想将它存储在以下位置:
Macintosh HD/Library/Application Support/MyApp/installId/installId.txt。
这是我尝试在应用程序支持目录中保存文件的方式:
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”中。
错误没有发生;但是,如果我选择将我的文件存储在用户域掩码的应用程序支持目录中。包含 install id 的文件被创建并存储在我的用户应用程序支持目录中名为 MyApp 的文件夹中。
我已尝试寻找解决问题的方法,但效果并不理想。一些帖子声称我试图存储我的文件的目录是为具有管理员权限的应用程序保留的 (source 1) 而其他人声称我应该使用用户域掩码中的应用程序支持目录来执行此类任务 (@987654322 @)。但是,我需要任何在 Mac 上拥有安装了该应用程序的帐户的用户都可以访问此文件,因此本地域掩码的应用程序支持目录似乎更适合这种情况。
有人可以帮助我或指出正确的方向吗?如何将数据保存到此目录?如果我无法做到这一点,我是否可以在另一个中心位置执行此操作,用户不太可能冒险进入并删除该数据?
提前致谢!
【问题讨论】:
-
写入用户的应用程序支持文件夹或所有用户应用程序支持文件夹怎么样?