我在 Mac OS X 上有一个 Cocoa 应用程序“PDFHistory”,它使用 NSDocument 架构来保存和加载专门为我的应用程序内部格式化的 PDF 文件。我想这样做,每当我从 PDFHistory 保存文件(例如,“mydoc.pdf”),然后双击 mydoc.pdf 将自动在 PDFHistory.app 中打开它。但是,我不想让它在 PDFHistory 中自动打开所有 .pdf 文件,而是使用系统默认值(可能是 Preview.app)。但是,.pdf 后缀是一项要求,因为我需要用户能够通过电子邮件将文件发送给其他可以在默认 PDF 查看器中查看文件的用户。
问题是,如果我将 LSHandlerRank 设置为“所有者”,那么所有.pdf 文件都将使用 PDFHistory 打开,这很糟糕(因为我只了解 PDFHistory 写出的 .pdf 文件的内部结构)。但是如果我将 LSHandlerRank 设置为“Alternate”,那么所有 .pdf 文件都将打开到系统默认应用程序 (Preview.app),这对于刚刚使用我的应用程序创建文件的用户来说会感到困惑。
曾几何时,“创建者代码”可用于实现此类功能,但在 Snow Leopard 中启动服务开始忽略它们(请参阅http://tidbits.com/article/10537)。UTI 不是提供此功能的替代品(请参阅http://boredzo.org/blog/archives/2009-09-22/how-not-to-use-utis)。
使用 Finder 获取有关文件的信息允许用户指定用于打开特定文件的特定应用程序。这应该通过在文件的资源中设置“usro”属性来工作。有一些开源代码可以模仿这种行为(https://github.com/AlanQuatermain/SetAppAffinity),但它使用了已弃用的函数,因此会导致 Apple 拒绝 App Store 中的应用程序。同样,人们发布了 AppleScript 来设置此属性 ( https://discussions.apple.com/thread/2597365 ),但沙盒会阻止我调用它。
尽管 .pdf 后缀是能够将文件发送给其他系统/平台上的用户的要求,但我考虑尝试将后缀注册为“.phistory.pdf”,这将允许“file.pdf”两个扩展名。 phistory.pdf”将在 PDFHistory 中打开,但“file.pdf”将在默认 PDF 查看器中打开。但是,这根本行不通:似乎最终后缀是启动服务唯一使用的后缀,并且之前的所有内容都被忽略了。
那么有没有办法让我的应用程序成为打开它自己创建的文件的默认应用程序?