如何让macos将文档包视为文件?

Posted

技术标签:

【中文标题】如何让macos将文档包视为文件?【英文标题】:How to get macos to treat document package as a file? 【发布时间】:2017-09-23 17:49:10 【问题描述】:

我正在尝试使用它自己的图标创建一个文档包,macOS 将其视为文件,并且您必须选择“显示包内容”才能将其作为文件夹打开。我添加了一个文档类型,当传递与 UTI 匹配的 ofType:"Family Diagram" 时,NSDocument::initWithContentsOfURL 会正确打开它。

但该图标未设置在扩展名为 .fd 的文件夹上,macOS 仍将它们视为文件夹。我将 LSTypeIsPackage 设置为 true。

这是我的 info.plist:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>BuildMachineOSBuild</key>
        <string>17A362a</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleDocumentTypes</key>
        <array>
            <dict>
                <key>CFBundleTypeExtensions</key>
                <array>
                    <string>fd</string>
                </array>
                <key>CFBundleTypeIconFile</key>
                <string>PKDiagram-Document</string>
                <key>CFBundleTypeMIMETypes</key>
                <array>
                    <string>application/x-fd</string>
                </array>
                <key>CFBundleTypeName</key>
                <string>Family Diagram</string>
                <key>CFBundleTypeOSTypes</key>
                <array>
                    <string>FD</string>
                </array>
                <key>CFBundleTypeRole</key>
                <string>Editor</string>
                <key>LSHandlerRank</key>
                <string>Default</string>
                <key>LSTypeIsPackage</key>
                <true/>
                <key>NSDocumentClass</key>
                <string>DiagramDocument</string>
            </dict>
        </array>
        <key>CFBundleExecutable</key>
        <string>Family Diagram</string>
        <key>CFBundleGetInfoString</key>
        <string>Created by Vedanā Media</string>
        <key>CFBundleIconFile</key>
        <string>PKDiagram-Filled.icns</string>
        <key>CFBundleIdentifier</key>
        <string>com.vedanamedia.familydiagrammac</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleSupportedPlatforms</key>
        <array>
            <string>MacOSX</string>
        </array>
        <key>DTCompiler</key>
        <string>com.apple.compilers.llvm.clang.1_0</string>
        <key>DTPlatformBuild</key>
        <string>9A235</string>
        <key>DTPlatformVersion</key>
        <string>GM</string>
        <key>DTSDKBuild</key>
        <string>17A360</string>
        <key>DTSDKName</key>
        <string>macosx10.13</string>
        <key>DTXcode</key>
        <string>0900</string>
        <key>DTXcodeBuild</key>
        <string>9A235</string>
        <key>LSApplicationCategoryType</key>
        <string>public.app-category.healthcare-fitness</string>
        <key>NSHighResolutionCapable</key>
        <true/>
        <key>NSPrincipalClass</key>
        <string>NSApplication</string>
    </dict>
    </plist>

这里是 Xcode 中 UTI 的截图,注意图标被识别:

【问题讨论】:

【参考方案1】:

事实证明,您还必须将它添加到导出的类型中,并且它必须符合 com.apple.package。然后,您必须在 Info.plist 中添加 CBundleVersion 编号,以使系统重新读取 UTI 设置。这将可靠地启用和禁用您的 UTI 包被视为文件而不是目录。

注意:这也会改变 NSMetadataQuery 处理文件的方式,因此如果您依赖 NSMetadataQuery 的递归结果,则应该通过在 NSDocument 中实现 fileWrapperOfType 和 readFromFileWrapper 来替换它。

我不记得在 Apple 文档的任何地方都看到过这一点。

【讨论】:

以上是关于如何让macos将文档包视为文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Coffeescript 2 视为 JSX? (网络包/通天塔)

MAKEFILE:将目标视为已更新而不修改文件

如何破解sublime text 2 mac

【软件】终于能修改macOS系统只读文件了!

如何让 Matlab 知道“NaN”应该被视为 NaN?

R文本文件和文本挖掘...如何加载数据