识别 iOS 文件包(在 Simulator 和 Finder 中)

Posted

技术标签:

【中文标题】识别 iOS 文件包(在 Simulator 和 Finder 中)【英文标题】:Recognizing iOS file packages (in Simulator and Finder) 【发布时间】:2012-10-23 21:04:37 【问题描述】:

我正在尝试将文件包用于定义 UTI 类型的 ios 应用程序。在谷歌搜索并查看 Xcode.plist 中的条目后,我尝试了一些方法,但一直遇到问题。我的应用创建了一些测试文档,然后尝试使用我的自定义 UTI 读取这些文件。

如果我没有指定“LSItemContentTypes”,那么 finder 会正确地将它们视为包。但随后 mdls 将“dyn.longstring”作为 kMDItemContentType 返回。

如果我确实指定了“LSItemContentTypes”,那么 kMDItemContentType 是正确的。但 finder 将其视为一个文件夹。

在这两种情况下,我通过

获得的 UTI
[url getResourceValue:&UTI
forKey:NSURLTypeIdentifierKey
error:nil];

不正确。它要么返回“dyn.longstring”,要么返回“public.folder”。由于不正确的 UTI,我的应用程序不会加载这些文件。我可以重写这个,但想用 UTI 的正确方式来做。

我将 iOS 文件包定义为文档类型并导出 UTI 类型,如下所示。我在看什么?

<?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">
<array>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>tdp</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>MyFilePackage</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>reverse.dns.ios.package</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>Default</string>
        <key>LSIsAppleDefaultForType</key>
        <true/>
        <key>LSTypeIsPackage</key>
        <true/>
    </dict>
</array>
</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">
<array>
    <dict>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename.extension</key>
            <array>
                <string>tdp</string>
            </array>
        </dict>
        <key>UTTypeIdentifier</key>
        <string>reverse.dns.ios.package</string>
        <key>UTTypeConformsTo</key>
        <array>
            <string>com.apple.package</string>
            <string>public.composite-content</string>
        </array>
    </dict>
</array>
</plist>

【问题讨论】:

【参考方案1】:

遇到了类似的问题,包括 UTI 显示为“dyn.longstring”。似乎修复是删除 CFBundleTypeExtensions 属性(已弃用)。 info.plist 中的这种组合对我有用:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>My App Name</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>my.content.type</string>
        </array>
        <key>LSTypeIsPackage</key>
        <true/>
    </dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>com.apple.package</string>
            <string>public.composite-​content</string>
        </array>
        <key>UTTypeDescription</key>
        <string>My App Name</string>
        <key>UTTypeIdentifier</key>
        <string>my.content.type</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>myextension</string>
        </dict>
    </dict>
</array>

【讨论】:

以上是关于识别 iOS 文件包(在 Simulator 和 Finder 中)的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发-47怎样下载iOS 7.1 Simulator 以及iOS 8离线的Documentation这些文件?

iOS Simulator 自定义 City Run 在 Xcode 之外

Simulator 8.0 在哪里存储文件

Flutter - google_sign_in 为 iOS Simulator-x86_64 构建,但尝试链接为 iOS Simulator-arm64 构建的文件 [重复]

找不到目标“x86_64-apple-ios-simulator”的模块“XXXX”;在 Swift 项目中找到:arm64、arm64-apple-ios-simulator?

iOS:处理 TARGET_IPHONE_SIMULATOR 宏