OSX相关文件创建

时间:2013-04-26 22:50:52

标签: objective-c macos sandbox nsfilecoordinator

我正在尝试构建一个可以轻松地从一种文件格式转换为另一种文件格式的应用程序。我们的想法是将源文件拖到停靠区磁贴上,输出文件与源文件一起创建(在同一目录中)。

阅读完文档后,我已正确设置所有内容 - 我认为......但它不起作用。

我的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_src_type的文件,并在与输入文件相同的目录中输出my_dest_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

2 个答案:

答案 0 :(得分:1)

结果addFilePresenter: 同步或即时。 我所要做的只是在[NSFileCoordinator filePresenters]之后调用addFilePresenter:,这似乎具有阻止效果,直到所有文件演示者都准备好去。

此外,我正在使用Qt,所以我惊喜地发现这一切都有效,而无需从更可怕的NSURL方法中获取特别创建的NSFileCoordinator个对象。

答案 1 :(得分:0)

此错误的另一个原因可能是项目信息文件中的UTI定义不正确或缺失。

必须为文档类型定义UTI,它应该与UTI定义的导入/导出UTI部分相同(如果它不是内置UTI)。