2014-12-03 91 views
0

我正在編寫一個OS X沙盒應用程序。它接收@ 3x和@ 2x圖像文件,並將它們轉換爲較低分辨率的圖像。我通過將文件拖入應用程序窗口或使用NSOpenPanel選擇目錄來獲取圖像URL。使用OS X沙箱編寫多個文件

一旦圖像被拖動或選擇的文件夾,我運行一個for循環和使用該方法

-(BOOL)writeImage:(NSImage*)image toFile:(NSString*)file withRepresentation:(NSString*)extension{ 

CGImageRef cgRef = [image CGImageForProposedRect:NULL 
             context:nil 
              hints:nil]; 
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:cgRef]; 
[newRep setSize:[image size]]; 
NSData *pngData = [newRep representationUsingType:[self getRepresentationType:extension] properties:nil]; 
return [pngData writeToFile:[file stringByAppendingString:[NSString stringWithFormat:@".%@",extension]] atomically:YES]; 

這破壞了沙箱模型調整每個圖像。我讀過我應該使用NSSavePanel,但這需要我爲每個保存的圖像指定最終的文件路徑/文件名,這會破壞用戶體驗。

有什麼辦法可以讓沙盒應用程序permision寫入某個目錄,而不是要求寫入每個文件的權限?

+0

向搜索引擎詢問有關安全範圍的書籤。 – 2014-12-03 01:09:32

+0

也許你有這樣做的其他原因,但你可以使用automator做批量圖像調整大小... – Fonix 2014-12-03 01:46:01

回答

2

是的,你可以很容易地要求寫入某個目錄的權限。

您已經知道如何使用NSOpenPanel來允許用戶選擇一個目錄 - 「或使用NSOpenPanel選擇的目錄」。當用戶執行,你得到讀的目錄/寫權限,這樣你就可以讀取文件[email protected]寫一個名爲[email protected]

現在除了是能夠使用NSOpenPanel選擇一個目錄,你還可以:

  1. 指定委託方法來確定哪些項目應啓用用戶選擇,並確定如果用戶選擇的項目是可以接受的;

  2. 設置打開NSOpenPanel對話框時首先顯示的目錄;和

  3. NSOpenPanel對話框中設置提示消息和按鈕標籤。

結合這些功能,你可以提出詢問用戶確認進入一個特定的目錄對話框:

  1. 提示設置爲類似「請確認訪問目錄」;

  2. 將「打開」按鈕上的標籤設置爲「確認」之類的內容;

  3. 將初始目錄設置爲您所在目錄的;和

  4. 使用委託方法只允許用戶選擇要取消的目錄。

捆綁起來,比方說MyConfirmDirectoryPanel

現在,當用戶向您提供一個文件:

  1. 確定該文件的目錄

  2. 檢查你是否有使用access()系統調用該目錄的寫訪問 - 見第2的「Unix」手冊(只需在Xcode的文檔中搜索access)。如果你有寫訪問權限(4)。

  3. 如果您沒有訪問權限,請使用您的MyConfirmDirectoryPanel讓用戶選擇目錄,從而授予您訪問權限。

  4. 您現在擁有該目錄的寫入權限,請繼續並創建縮放的圖像文件。

以這種方式獲得將持續爲您的應用程序的剩餘執行訪問;因此,例如,如果您的用戶在同一個目錄中選擇了另一個文件,則不必再次請求許可。如果你想保留你的應用程序執行之間的訪問,你也可以這樣做。你這個使用安全範圍的書籤,查閱那些文檔。使用該機制,您可以創建一個已保存書籤的緩存 - 將它們存儲爲用戶默認值 - 您可以根據需要激活這些緩存,以重新獲得用戶先前授予您的目錄的訪問權限。如果你隨着時間的推移這麼做,你不得不明確要求用戶許可的次數將會減少,你的用戶將獲得他們期望的UI體驗 - 拖動一個文件,在其旁邊創建的文件大小調整到相同的目錄中。

HTH