记住用户选择的文件夹并在 Sandbox 下通过 NSOpenPanel 重新打开它

Posted

技术标签:

【中文标题】记住用户选择的文件夹并在 Sandbox 下通过 NSOpenPanel 重新打开它【英文标题】:remember user selected folder and reopen it by NSOpenPanel under Sandbox 【发布时间】:2012-12-05 18:28:48 【问题描述】:

Apple 审核要求我的应用记住用户上次选择的文件夹。但我无法在沙盒下制作它。 -setDirectoryURL 似乎在沙盒下不起作用。 我该怎么办?感谢您的帮助!

// read string saveFolder from NSUserDefaults
NSOpenPanel * myPanel = [NSOpenPanel openPanel];
[myPanel setTitle:@"Select Output Folder"];
[myPanel setCanChooseDirectories:YES];
[myPanel setCanCreateDirectories:YES];
[myPanel setAllowsMultipleSelection:NO];
[myPanel setCanChooseFiles:NO];

NSLog(@"before openpanel:folder=%@",saveFolder); // <== return normal
[myPanel setDirectoryURL:[NSURL URLWithString:saveFolder.stringValue]];
NSLog(@"readback:folder=%@",[[myPanel URL] path]); // <== return nil here

if ([myPanel runModal] == NSOKButton)

    //  
    saveFolder = [[myPanel URL] path]];
    // then save the saveFolder string to NSUserDefaults
    //

【问题讨论】:

【参考方案1】:

看来我们应该添加并使用此权利:

com.apple.security.files.bookmarks.app-scope

保存网址:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSError *error = nil;
NSData *bookmarkData = [[myPanel URL] bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&error];
if (!error)

    [defaults setObject:bookmarkData forKey:@"iData"];
    [defaults synchronize];

回读:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
bookmarkFileURL = nil;
NSData *bookmarkData = [defaults objectForKey:@"iData"];
if (bookmarkData != nil)

    NSError *error=nil;
    bookmarkFileURL = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:nil error:&error];
    if (error != nil) bookmarkFileURL = nil;

if (bookmarkFileURL)

    [bookmarkFileURL startAccessingSecurityScopedResource];

//
//
[bookmarkFileURL stopAccessingSecurityScopedResource];

【讨论】:

刚遇到这个问题,我就这样试试。感谢您回答您自己的问题! 也可以使用这个类来结束持久化重新访问文件。 github.com/leighmcculloch/AppSandboxFileAccess

以上是关于记住用户选择的文件夹并在 Sandbox 下通过 NSOpenPanel 重新打开它的主要内容,如果未能解决你的问题,请参考以下文章

在没有用户交互的情况下从我的 Sandbox 应用程序将文件写入磁盘的何处?

Oracle PBCS - Sandbox

如何在启用 Mac App Sandbox 的情况下运行 Shell 脚本?

如何在不注册的情况下记住用户

SandBox(沙盒)

关于App Sandbox