我的 Mac 应用程序是沙盒的,我需要保存一个文件。我在哪里保存这个文件?如果不使用打开的面板,我似乎无法找到允许这样做的特定位置。这就是我在 iOS 上的做法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
Mac 上沙盒目录的等价物是什么?
我的 Mac 应用程序是沙盒的,我需要保存一个文件。我在哪里保存这个文件?如果不使用打开的面板,我似乎无法找到允许这样做的特定位置。这就是我在 iOS 上的做法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
Mac 上沙盒目录的等价物是什么?
无论您的应用程序是否被沙盒化,该代码片段都可以在 Mac 上运行。
在非沙盒 Mac 应用程序中,path
将引用您家中的 Documents 文件夹:例如/Users/username/Documents
.
在沙盒应用中,它指的是应用沙盒中的一个文件夹:例如/Users/username/Library/Containers/com.yourcompany.YourApp/Documents
有关详细信息,请参阅文档。
Apple 的沙盒指南非常有用,可在此处找到。
正如 theAmateurProgrammer 在此处回答我的问题时所述,您基本上有一个专用于您的应用程序的文件夹。
~/Library/Container/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];
}
将@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**".
但它似乎工作。
是更容易。对于 macOS 上的沙盒应用程序,该功能NSHomeDirectory
为您提供了具有读写访问权限并可以保存所有文件的路径。这将是一条这样的道路
/Users/username/Library/Containers/com.yourcompany.YourApp