我的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
会指向你主目录下的文档文件夹:例如/Users/username/Documents
。
而在沙盒化的应用中,它指向应用沙盒内的一个文件夹:例如/Users/username/Library/Containers/com.yourcompany.YourApp/Documents
。
详细信息请参见文档。
苹果公司的沙盒指南非常有用,可以在这里找到。
基本上,你需要为你的应用程序创建一个专门的文件夹,具体描述可参考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**".
但它似乎能够正常工作。
NSHomeDirectory
可以提供您拥有读写权限并可以保存所有文件的路径。它将是这样一个路径:/Users/username/Library/Containers/com.yourcompany.YourApp