如何在 OS X 上写入本地应用程序支持目录

Posted

技术标签:

【中文标题】如何在 OS X 上写入本地应用程序支持目录【英文标题】:How to write to local Application Support directory on OS X 【发布时间】: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 上拥有安装了该应用程序的帐户的用户都可以访问此文件,因此本地域掩码的应用程序支持目录似乎更适合这种情况。

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

提前致谢!

【问题讨论】:

写入用户的应用程序支持文件夹或所有用户应用程序支持文件夹怎么样? 【参考方案1】:

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

$ ls -al /Library | grep Appl*

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

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

【讨论】:

感谢您的帮助。我们需要避免为此应用程序要求提升权限,所以我想我需要将此文件放在其他地方。看起来 Documents 文件夹可能是一个不错的选择。

以上是关于如何在 OS X 上写入本地应用程序支持目录的主要内容,如果未能解决你的问题,请参考以下文章

在本地部署 Swift OS X 应用程序?

使用 OS X 沙箱写入多个文件

在Fedora 26 OS中的VirtualHost上的YII 2应用程序 - Web进程无法写入该目录

Parallels desktop:从 OS X(主机)访问本地 IIS Web 应用程序

如何调试旧版Mac OS X的应用程序?

如何在 OS X 上获取正在读取文件的通知?