如果您的應用沙盒,你想訪問運行之間的文件/目錄,那麼你需要一個安全範圍的書籤存放的目錄,而不是目錄本身。
這意味着您需要將設置爲YES
的布爾值屬性com.apple.security.files.bookmarks.app-scope
添加到應用程序的權限以及com.apple.security.files.user-selected.read-write
以允許選擇文件。
當您選擇的目錄,你需要做一個書籤吧:
NSOpenPanel *panel = [[NSOpenPanel alloc] init];
panel.canChooseDirectories = YES;
NSInteger ret = [panel runModal];
if (ret == NSFileHandlingPanelOKButton) {
NSURL *anUrl = [[panel URLs] lastObject];
NSError *err;
NSData *data = [anUrl bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&err];
if (!data) {
NSLog(@"%@", err);
return NO;
}
現在你已經得到了書籤,你需要堅持例如它這樣做:
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setObject:data forKey:@"bookmark"];
[def synchronize];
在應用程序的重新啓動,你需要的書籤從NSData
轉換回一個網址,這是從實踐中來完成:
BOOL stale = NO;
NSError *anError;
NSURL *url = [NSURL URLByResolvingBookmarkData:data
options:NSURLBookmarkResolutionWithSecurityScope
relativeToURL:nil
bookmarkDataIsStale:&stale
error:&anError];
if (url && !stale) {
[anURL startAccessingSecurityScopedResource];
// Do something with URL
[anURL stopAccessingSecurityScopedResource];
} else if (anError) {
NSLog(@"%@", anError);
return NO;
}
,如果你已經使用了默認的持久性的書籤數據,您可以使用:
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSData *data = [def objectForKey:@"bookmark"];
從userdefaults恢復書籤數據。
如果您的應用程序是沙盒,那麼您必須保存書籤,而不僅僅是目錄名稱。請參閱[有關安全範圍書籤的文檔](https://developer.apple.com/library/mac/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3 -SW16) – Petesh 2014-10-22 10:38:03