【问题标题】:OSX related file creationOSX 相关文件创建
【发布时间】:2013-04-26 22:50:51
【问题描述】:

我正在尝试构建一个可以轻松从一种文件格式转换为另一种文件格式的应用程序。这个想法是将源文件拖到停靠图块上,然后在源文件旁边(在同一目录中)创建输出文件。

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

我的 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

【问题讨论】:

  • 不是一个答案,但是……我发现当使用显式 NSOpenPanel/NSSavePanel 而不是其他开放机制(如拖动到停靠栏)时,这些东西更容易调试。当你做错事时,你会得到更多的日志记录,更神秘的问题要搜索,当然还有你的应用程序和 Powerbox 之间更明显的过渡。
  • 另外,有两件事可能看起来很愚蠢,不应该在这里相关,但是……您是否尝试过将 both 类型标记为NSIsRelatedItemType,和/或更改您的从查看器到编辑器的主要类型?
  • 我刚刚尝试了两个“愚蠢”的想法......不幸的是它没有奏效。我需要稍微修改一下我的代码才能使用 NSOpenPanel 而不是拖放。希望这会有所帮助。
  • 使用 NSOpenPanel 的时间比预期的要短,但在日志中根本没有改变。

标签: objective-c macos sandbox nsfilecoordinator


【解决方案1】:

原来addFilePresenter: 不是同步的或瞬时的。 我所要做的就是在addFilePresenter: 之后调用[NSFileCoordinator filePresenters],这似乎具有阻塞的效果,直到所有文件演示者都准备就绪。

另外,我使用的是 Qt,所以我很惊讶这一切都可以正常工作,而无需从看起来更可怕的 NSFileCoordinator 方法中获取专门创建的 NSURL 对象。

【讨论】:

  • [NSFileCoordinator filePresenters] 的使用似乎是“偶然”起作用的东西。一个更安全的方法可能是协调写入:使用[NSFileCoordinator initWithFilePresenter] 创建一个协调器并调用它的coordinateWritingItemAtURL:options:error:byAccessor: 来写入文件。即使不先调用filePresenters 也可以。
  • 好主意,我试试看。
【解决方案2】:

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

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

【讨论】:

  • 可以在 info.plist 中使用 UTI,还是应该在那里使用扩展?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2018-01-06
  • 1970-01-01
  • 2021-08-10
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多