2013-04-26 54 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