2017-02-23 27 views
1

我有一個沙盒應用程序。我希望用戶能夠將照片應用中的圖片拖到我的沙盒應用中。拖拽照片和沙盒應用程序

我編寫了所有用於處理照片中的「承諾文件」的代碼,當它與非沙盒應用程序一起使用時沒有問題。但用我的沙盒應用程序,照片告訴我,它無權將圖片文件寫入目標文件夾......這是我的沙盒應用程序中的臨時文件夾。

這種照片無法在我的沙盒中寫入,即使在臨時文件夾中也是如此。但由於我的應用程序無法訪問沙箱外,我如何才能將照片中的文件交換到我的應用程序?

編輯提供一些代碼作爲每個請求

NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] ; 
NSError *error = nil ; 
[[NSFileManager defaultManager] createDirectoryAtPath:tempPath 
          withIntermediateDirectories:NO 
              attributes:nil 
               error:&error] ; 
filenames = [sender namesOfPromisedFilesDroppedAtDestination:[NSURL fileURLWithPath:tempPath]] ; 

(文件名是全局變量的NSArray)

這照片顯示錯誤消息(對不起,畫面是法語,但這個信息並不是真正有用的,因爲它不能完全顯示,顯示的部分是「0 file(out of 1)」導出,不能將「image」移動到「folder」:這個文件夾不存在,或該文件夾不能被//切割//

我當然確認該文件夾確實存在。

enter image description here

編輯一些更多的信息

我想我找到了一個調查路徑:

  • 當我創建的臨時文件夾中唯一的文件夾,它得到了「檢疫「標誌。我檢查了使用終端和「ls -l」,在權限後可以看到「@」。現在,如果我不創建唯一文件夾,照片可以直接將文件放到臨時文件夾中。因此,問題是照片無法使用「隔離」文件夾。

  • 現在這還沒有幫助。無論如何,放置圖片文件也設置了隔離標誌,我的應用程序無法讀取它!

我發現沒有辦法擺脫那些隔離標誌。

最奇怪的是,如果我只是一步一步地用調試器,一切工作正常。

+0

你可以發佈代碼如何獲得臨時目錄嗎? –

+0

根據要求添加代碼 –

回答

1

好的,我發現有什麼問題。它與隔離區或應用程序被裝箱無關。

實際上,當調用namesOfPromisedFilesDroppedAtDestination:時,提供者應用程序(在我的示例中爲Photos)開始將文件寫入臨時文件夾。這可能需要一些時間。因此,我開始監視目標文件夾中的事件,並且僅在的第一個事件中對作出反應。 (檢查這個:How can my OS X app accept drag-and-drop of picture files from Photos.app?)。

的照片應用正在發送的幾個步驟中的文件。第一步創建一個臨時文件,稍後將其重命名爲「正確」的圖像文件。這個臨時文件的創建是我的應用程序捕獲的事件。然後,我的應用程序正在檢查圖像文件是否存在,但現在還沒有。

因此,解決方案是繼續檢查文件夾事件,直到承諾的文件確實存在。如果還沒有,請繼續等待。希望有希望的應用程序有朝一日能夠實現它的承諾。

感謝catlan推動我重新調查。

1

Sandbox將允許文件承諾提供程序應用程序寫入Document文件夾。

[[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL]; 
+0

謝謝。不幸的是,這並不能解決問題。我確實可以看到照片將承諾的文件傳遞到Document文件夾。但這張照片有「隔離」標誌設置。這似乎阻止我的應用程序閱讀它。這就是我在我的問題的最後編輯中試圖解釋的內容。我想我的問題現在應該是「我怎樣才能讀取被隔離的文件?」。 –

+0

你可以把一個示例應用程序放在一起,並把它放在github上? – catlan

+0

感謝您的關注。是的,我會盡力做到這一點。儘管不是在很短的時間內(可能在週末)。 –