2013-04-26 58 views
0

我想構建一個應用程序,很容易從一個文件格式轉換爲另一個。 (在同一目錄)的想法是你的源文件拖到碼頭瓷磚和在源文件一起創建的輸出文件OSX相關的文件創建

閱讀文檔後,我有正確安裝的一切 - 我想...但它不起作用。

我的Info.plist包含以下內容:

<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeExtensions</key> 
     <array> 
      my_src_type 
     </array> 
     <key>CFBundleTypeRole</key> 
     <string>Viewer</string> 
     [...] 
    </dict> 
    <dict> 
     <key>CFBundleTypeExtensions</key> 
     <array> 
      my_dest_type 
     </array> 
     <key>CFBundleTypeRole</key> 
     <string>Editor</string> 
     <key>NSIsRelatedItemType</key> 
     <true/> 
     [...] 
    </dict> 
</array> 

如果我正確地閱讀文檔,這應該讓我的應用程序通過在相同的my_dest_type拖放和輸出文件接受my_src_type文件目錄作爲輸入文件,當然我會讓沙箱知道它。

爲此,我有一個SimpleFilePresenter,看起來像這樣:

@interface SimpleFilePresenter : NSObject<NSFilePresenter> 
@property (atomic, strong) NSURL *presentedItemURL; 
@property (atomic, strong) NSURL *primaryPresentedItemURL; 
@end 

@implementation SimpleFilePresenter 
- (NSOperationQueue *)presentedItemOperationQueue { 
     return [NSOperationQueue mainQueue]; 
} 
@end 

只要我使用addFilePresenter:請求權限創建我的輸出文件,我得到了在控制檯下面的錯誤。

2013-04-26 6:33:52.741 PM my_app[27639]: NSFileSandboxingRequestRelatedItemExtension: an error was received from pboxd instead of a token. Domain: NSPOSIXErrorDomain, code: 1 
2013-04-26 6:33:52.741 PM my_app[27639]: +[NSFileCoordinator addFilePresenter:] could not get a sandbox extension. primaryPresentedItemURL: file://[...]/file.my_src_type, presentedItemURL: file://[...]/file.my_dest_type 
+0

不是一個答案,但是...我發現這個東西使用顯式'NSOpenPanel' /'NSSavePanel',而不是其他公開的機制,像拖動到碼頭的時候要更易於調試。當你做錯事情時,你會得到更多的日誌記錄,更難以搜索的問題,當然你的應用程序和Powerbox之間的轉換也更加明顯。 – abarnert 2013-04-26 23:44:25

+0

此外,有兩件事看起來很愚蠢,不應該在這裏相關,但是......您是否嘗試將_both_類型標記爲'NSIsRelatedItemType',和/或將您的主類型從Viewer更改爲Editor? – abarnert 2013-04-26 23:49:05

+0

我只是嘗試了兩個「愚蠢」的想法......不幸的是它沒有奏效。我需要使用NSOpenPanel代替拖放操作來代替我的代碼。希望這會有所幫助。 – Tim 2013-04-27 02:23:30

回答

1

原來addFilePresenter:同步或瞬時的。 我所要做的只是在addFilePresenter:之後撥打電子郵件[NSFileCoordinator filePresenters],這似乎具有阻止效果,直到所有文件演示者都準備好了。

此外,我使用Qt,所以我很驚喜,這一切都可以工作,而不需要從更可怕的NSFileCoordinator方法中特別創建NSURL對象。

+1

'[NSFileCoordinator filePresenters]'使用看起來像是「偶然」起作用的東西。一種更安全的方式可能是協調寫作:使用'[NSFileCoordinator initWithFilePresenter]'創建一個協調器並調用它的'coordinateWritingItemAtURL:options:error:byAccessor:'來寫入文件。即使沒有首先調用'filePresenters',它也可以工作。 – 2014-03-30 09:29:12

+0

好主意,我會嘗試。 – Tim 2014-03-30 23:13:11

0

此錯誤的另一個原因可能是項目信息文件中的UTI定義不正確或缺失。

甲UTI必須定義爲文檔類型和它應該是相同的UTI定義導入/導出尿路感染部分(如果它不是一個內置的UTI)。

+0

UTI可以在info.plist中使用,還是應該在那裏使用擴展名? – 2013-09-04 19:34:53