通过文件扩展名注册新的OS X文件类型并与Cocoa应用程序关联

4

好的,以下是相关内容:

  • 我有一个新的应用程序,我希望将其与一个新的文件类型关联起来 - 假设是 .xyz
  • .xyz 文件 - 如果这很重要的话 - 是一个文件。

现在,这是我的info.plist中特定于文件类型的部分:

CFBundleDocumentTypes = (
        {   
            CFBundleTypeExtensions = ( "xyz" );
            CFBundleTypeIconFile = "xyz-icon";
            CFBundleTypeName = "XYZ file";
            CFBundleTypeRole = "Viewer";
            LSTypeIsPackage = "1";
        }
    );

然而,.xyz包文件仍然显示为文件夹,而不是单个文件(“package”)。我做错了什么?
提示:我过去曾经做到过这一点,但我只是不记得我是否漏掉了什么。也许系统需要重新启动?我不知道...

你实际上使用的是什么类型?你确认没有其他应用程序可以处理系统上的 .xyz 类型,这些应用程序可能会在没有使用“LSTypeIsPackage”的情况下声明它吗? - Peter Hosey
@PeterHosey 是的,我百分之百确定。这是一个仅由我的应用程序使用的独特的7个字母的扩展名。 - Dr.Kameleon
4个回答

7
如果你发现LSTypeIsPackage无法正常工作,可能是因为你使用了LSItemContentTypes来声明文档类型。使用LSItemContentTypes会使系统忽略LSTypeIsPackage(但这不是此stackoverflow问题的情况)。
如果你正在使用LSItemContentTypes,你需要使你导出的类型符合com.apple.package。例如:
CFBundleDocumentTypes
  LSItemContentTypes
    Item 0 = com.example.xyz
  CFBundleTypeExtensions
    Item 0 = xyz
  CFBundleTypeRole = Editor
  etc.

UTExportedTypeDeclarations
  Item 0
    UTTypeIdentifier = com.example.xyz
    UTTypeConformsTo
      Item 0 = public.data // or whatever
      Item 1 = com.apple.package          <-------------
    UTTypeDescription = XYZ Document
    etc.

如果使用了LSItemContentTypes,则设置UTTypeConformsTo是必要的。 - Zhigang An

2
你需要导出你的类型。
UTExportedTypeDeclarations = (
  {
    UTTypeDescription = "Your File Type Description";
    UTTypeIconFile = "xyz-icon";
    UTTypeIdentifier = "your.uti.xyz"
    UTTypeTagSpecification = {
      public.filename-extension = ("xyz")
    }
  }

免责声明:我习惯使用XML plist语法,因此以上可能存在语法错误,但基本上应该是正确的结构。


1
如果您安装了应用程序,我相信您导出的类型(从Info.plist中)将让系统了解您的软件包。
在开发过程中,您可能希望设置“包位”,例如:
    if !directoryURL.setResourceValue(true, forKey: NSURLIsPackageKey, error: &error) {
        println("Soft warning: cannot set package bit for \(directoryURL)")
    }

因为我认为Finder不会在您的开发目录中查找新的通用类型。

“Finder” 在整个系统中搜索 UTI,即使在垃圾箱中也是如此。实际上,执行此操作的不是 Finder,而是一个名为 LaunchServices 的服务。 - Radu Simionescu
是的,我见过很多情况下,LaunchServices不能及时正确地更新其缓存——在我的经验中它不是确定性的,所以我不依赖它。 - Wil Shipley

1

我认为你需要设置“Package bit”,也称为“Bundle bit”,以向操作系统发出信号,表明该文件夹是一个包。


沃特,谢谢!看起来我在SO上发布了正确的代码,但是我在原始的info.plist中错过了LSTypeIsPackage =“1”这一部分。有趣...哈哈 - Dr.Kameleon
如果“文件夹”符合文档类型字典中给定的文件名扩展名之一,并且相同的类型字典设置了“LSTypeIsPackage”键,则不需要这样做。 - Peter Hosey
@PeterHosey 我明白你的意思。然而,添加 LSTypeIsPackage 确实 解决了它。所以... - Dr.Kameleon
@Dr.Kameleon:这正是我所期望的。然而,这并不是Walt Sellers所建议的,他的答案就是我所说的不必要的。 - Peter Hosey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接