2012-06-05 224 views
5

我正在開發一個沙盒的Mac App Store應用程序,該應用程序詢問用戶在何處保存從其他地方下載的文件。我有這樣的代碼來獲取用戶的文件夾(剔除一些錯誤檢查):startAccessingSecurityScopedResource永遠不會返回成功

NSOpenPanel* openPanel = [NSOpenPanel openPanel]; 
[openPanel setAllowsMultipleSelection:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setResolvesAliases:YES]; 
NSInteger result = [openPanel runModal]; 
NSArray* urls = [openPanel URLs]; 
NSURL* folderURL = [urls objectAtIndex:0]; 
NSError* error; 
NSData* bookmakeData = [folderURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
          includingResourceValuesForKeys:nil 
              relativeToURL:nil 
                error:&error]; 
_saveFolderBookmark = bookmakeData; 

,當談到時間將文件移動到這個文件夾,我有這樣的代碼:

BOOL isStale; 
NSError* error; 
NSURL* saveFolder = [NSURL URLByResolvingBookmarkData:_saveFolderBookmark 
               options:NSURLBookmarkCreationWithSecurityScope 
             relativeToURL:nil 
            bookmarkDataIsStale:&isStale 
               error:&error]; 
BOOL success = [saveFolder startAccessingSecurityScopedResource]; 

// Move the file somewhere else 
NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; 
NSInteger operationTag; 
BOOL copied = [workspace performFileOperation:NSWorkspaceMoveOperation 
             source:[[self getDocumentsFolder] path] 
            destination:[saveFolder path] 
             files:[NSArray arrayWithObject:filename] 
              tag:&operationTag]; 
[saveFolder stopAccessingSecurityScopedResource]; 

這是很多代碼列出來說,startAccessingSecurityScopedResource永遠不會爲我返回成功,要麼從NSOpenPanel獲取ULR後立即返回,要麼在稍後的運行中將書籤數據保存在NSUserDefaults中。

在權利文件,除其他項目,我有:

<key>com.apple.security.files.bookmarks.app-scope</key> 
<true/> 

有什麼不對的代碼?

+0

你看到任何控制檯消息?此外,仔細檢查代碼簽名以確保配置正確。 – gaige

+0

在您的示例中,在打開面板完成後,「urls」數組來自哪裏並不清楚。 – gaige

+0

當我刪除錯誤檢查時,我設法編輯出網址以獲取網址。我又把它放回去了。在調用startAccessingSecurityScopedResource的行的控制檯中沒有消息。 –

回答

8

這一個很容易。您正在使用NSURLBookmarkCreationWithSecurityScope而不是NSURLBookmarkResolutionWithSecurityScope解決。只要改變這一行,它應該工作。

(它可能不是你創建書籤在同一會話期間的工作,當你已經可以訪問網址,因爲你不應該把它叫在這種情況下要。但在以後運行,當然應該, ,因爲這是整點。)

+0

現在非常明顯,它被指出。讓你想知道爲什麼有兩個不同的常量。謝謝! –

+2

如果你看歷史,這是有道理的。原始的BookmarkCreation和BookmarkResolution標誌在10.6中沒有任何很好的匹配對,所以它們是完全獨立的位掩碼值集合,並且在例如NSURLBookmarkCreationMinimalBookmark和NSURLBookmarkResolutionWithoutUI之間沒有混淆的可能性。但是,如果他們爲編譯器添加了一些方法來警告你這件事,那會很好,不是嗎? – abarnert

0

上面已經給出了正確的解決方案,但我想我會爲那些有相同症狀的人添加另一種可能性(startAccessingSecurityScopedResource永不返回YES)。確保您使用的是Powerbox返回的實際URL,它可能(可能會)與您試圖訪問的實際資源的URL不同。例如,Powerbox會將URL返回到一個路徑,您將使用該路徑與startAccessingSecurityScopedResource訪問該目錄下的特定文件。

相關問題