沙盒Mac应用程序在哪里可以保存文件?

时间:2012-08-03 22:51:33

标签: objective-c macos cocoa

我的Mac应用程序是沙箱,我需要保存文件。我在哪里保存这个文件?我似乎无法在不使用开放式面板的情况下找到允许的具体位置。这就是我在iOS上的表现:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

Mac上的沙盒目录的等价物是什么?

4 个答案:

答案 0 :(得分:24)

无论您的应用程序是否为沙盒,该代码段都可在Mac上运行。

在非沙盒的Mac应用中,path会引用您家中的“文档”文件夹:例如/Users/username/Documents

在沙盒应用中,它指的是应用沙箱中的文件夹:例如/Users/username/Library/Containers/com.yourcompany.YourApp/Documents

有关详细信息,请参阅the docs

答案 1 :(得分:9)

Apple的沙盒指南非常有用,找到here

你基本上有一个专门用于你的应用的文件夹,正如业余程序员回答我的问题here所描述的那样。

  

〜/库/容器/ com.yourcompany.yourappname /

这是我到目前为止所做的,我稍后会改进它:

//Create App directory if not exists:
NSFileManager* fileManager = [[NSFileManager alloc] init];
NSString* bundleID = [[NSBundle mainBundle] bundleIdentifier];
NSArray* urlPaths = [fileManager URLsForDirectory:NSApplicationSupportDirectory 
                                        inDomains:NSUserDomainMask];

NSURL* appDirectory = [[urlPaths objectAtIndex:0] URLByAppendingPathComponent:bundleID isDirectory:YES];

//TODO: handle the error
if (![fileManager fileExistsAtPath:[appDirectory path]]) {
    [fileManager createDirectoryAtURL:appDirectory withIntermediateDirectories:NO attributes:nil error:nil];
}

答案 2 :(得分:2)

将@Mazyod的答案转换为 Swift(5.1)

var appPath: URL? {
    //Create App directory if not exists:
    let fileManager = FileManager()
    let urlPaths = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if let bundleID = Bundle.main.bundleIdentifier, let appDirectory = urlPaths.first?.appendingPathComponent(bundleID,isDirectory: true) {
        var objCTrue: ObjCBool = true
        let path = appDirectory.path
        if !fileManager.fileExists(atPath: path,isDirectory: &objCTrue) {
            do {
                try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)
            } catch {
                return nil
            }
        }
        return appDirectory
    }
    return nil
}

但是,目录已更改,由于路径为

,我不确定是否需要捆绑ID的附加重复。
"/Users/**user name**/Library/Containers/**bundleID**/Data/Library/Application Support/**bundleID**". 

但这似乎可行。

答案 3 :(得分:0)

更容易。对于macOS上的沙盒应用程序,功能NSHomeDirectory为您提供了具有读写访问权限的路径,并可以保存所有文件。这将是一条这样的道路

/Users/username/Library/Containers/com.yourcompany.YourApp