3

好的,所以这是交易:

  • 我有一个新的应用程序,我想将它与一个新的文件类型相关联——比如说.xyz
  • .xyz文件 - 如果这很重要 - 是一个文件。

现在,我的文件类型特定部分info.plist如下所示:

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

但是,.xyz包文件仍显示为文件夹,而不是单个文件(“包”)。我究竟做错了什么?


提示:我过去曾设法做到这一点,但我根本不记得我是否遗漏了什么。也许必须重新启动系统?我不知道...

4

4 回答 4

4

如果您发现此 stackoverflow 页面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.
于 2017-01-11T20:05:58.233 回答
2

您需要导出您的类型。

UTExportedTypeDeclarations = (
  {
    UTTypeDescription = "Your File Type Description";
    UTTypeIconFile = "xyz-icon";
    UTTypeIdentifier = "your.uti.xyz"
    UTTypeTagSpecification = {
      public.filename-extension = ("xyz")
    }
  }

免责声明:我习惯了 XML plist 语法,所以上面可能有语法错误,但它应该基本上是正确的结构。

于 2015-07-02T16:27:05.680 回答
1

我认为您必须设置“包位”,也称为“捆绑位”,以向操作系统发出该文件夹是一个包的信号。

于 2013-02-14T08:22:37.030 回答
1

如果您安装您的应用程序,我相信您导出的类型(来自您的 Info.plist)会让系统知道您的包。

在开发过程中,您可能希望设置 Walt 提到的“包位”,例如:

    if !directoryURL.setResourceValue(true, forKey: NSURLIsPackageKey, error: &error) {
        println("Soft warning: cannot set package bit for \(directoryURL)")
    }

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

于 2015-03-29T06:38:44.497 回答