2015-11-03 17 views
2

我的OS X應用程序(當前未安裝沙箱)訪問用戶設置的目錄中包含的文件(一個選擇NSOpenPanel的路徑,並且在整個執行過程中保留對此路徑的引用)。文件列表通過NSDirectoryEnumerator生成,然後我分別使用AVAssettaglib(在帶有橋接頭的C++中)讀取和寫入這些文件。OS X應用程序沙盒和任意文件訪問 - 更新爲基於文檔?

正如預期的那樣,讓沙箱在Xcode提供的應用程序也沒用,通過NSDirectoryEnumerator給出的文件列表是空的,即使不是這樣,我將無法讀取和寫入文件。我需要採取哪些步驟來使我的應用程序兼容沙箱?

我的應用程序是否需要基於文檔?我的應用程序真的可以「基於文檔」,因爲我沒有真正的文檔(例如:我沒有每個文件的窗口,它似乎不符合標準的基於文檔的應用程序模型)?我的應用程序基本上只是一個表格視圖,其中文件引用爲行。 另一個重要的觀點:如果我的應用程序是基於文檔的,我仍然可以使用taglib寫入我的文件嗎?我需要將taglib作爲字符串指針傳遞給我的文件以使其工作。

非常感謝,這個話題目前相當混亂。

回答

2

您不必將應用程序轉換爲基於文檔以訪問用戶選擇的文件和安全範圍的書籤。

我能想到的2個原因,爲什麼你當前的代碼並不在沙盒環境中工作:

  • 你沒有「用戶所選文件訪問」能力集(的Xcode>目標>能力>應用沙盒>文件訪問)
  • 您正在使用目錄枚舉器的基於路徑/ NSString的API而不是基於URL的NSURL。

啓用了沙盒香草Xcode項目和用戶選擇的功能設置文件,應該枚舉通過NSOpenPanel獲得的任何路徑:如果你想存儲從沙盒訪問特定文件夾的能力

NSOpenPanel* panel =[NSOpenPanel openPanel]; 
panel.canChooseDirectories = YES; 
[panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) { 
    NSFileManager *fileManager = [[NSFileManager alloc] init]; 
    NSURL *directoryURL = panel.URL; 
    NSDirectoryEnumerator *enumerator = [fileManager 
             enumeratorAtURL:directoryURL 
             includingPropertiesForKeys:nil 
             options:0 
             errorHandler:nil]; 
    for (NSURL *url in enumerator) { 
     NSLog(@"url:%@", url); 
    } 
}]; 

跨應用程序啓動/退出循環,您需要存儲安全範圍的書籤。 此文章包含持續用戶選擇的文件/目錄通過應用程序範圍書籤訪問的信息: Trouble creating Security-Scoped Bookmark

+0

謝謝你,我設法解決我的問題,允許讀/寫訪問Xcode沙盒設置中的「用戶選擇的文件」 – beeb

1

這聽起來像當前的功能將轉換爲沙盒就好了。

  1. 用戶選擇經由NSOpenPanel的目錄(其將調用一些所謂Powerbox在沙箱環境)。
  2. 此目錄現在可寫,因爲用戶明確選擇了它。
  3. 您甚至可以保持對此目錄的寫入權限,方法是創建一個安全範圍書籤並將其存儲在會話之間。

這與以文檔爲基礎沒有任何關係;這是一個與沙盒無關的內部設計。

+0

哦,我明白了。實際上,我注意到當打開沙盒時我甚至無法打開一個'NSOpenPanel'。點擊通常打開面板的按鈕不會引發異常:「NSInternalInconsistencyException ...失敗的授權檢查」。 – beeb

+0

@beeb好吧,聽起來像你沒有設置屬性(從項目的角度來看)。 – trojanfoe

+0

沒關係,我忘記了允許用戶在沙箱參數中選擇文件的讀/寫權限! – beeb