iOS 应用程序如何在点击“文件”或“消息”中的文档而不是仅通过“打开方式”时直接启动?

How do iOS apps directly launch on tapping a document in Files or Messages instead of just with Open In?

我的基于 SwiftUI 场景的应用程序已 .onOpenURL() 实现,我可以成功打开与其“共享”的自定义文件类型。但是,由于我是我的自定义文件的唯一应用程序,我希望我的应用程序在点击该文件时启动。这不是“基于文档的应用程序”

如果您在“文件”中有一个 .xlsx 甚至是通用的 .csv 文档并且安装了 Excel 应用程序,则点击文档会直接切换到完整的 Excel 应用程序,而“文件”不会显示空白占位符然后需要按分享按钮。

这是我的相关 info.plist:

<key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>My App Document</string>
            <key>LSHandlerRank</key>
            <string>Owner</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>com.myappname.tc-document</string>
            </array>
        </dict>
    </array>

和自定义导出的 UTI:

<key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.data</string>
            </array>
            <key>UTTypeDescription</key>
            <string>My App Document (tc)</string>
            <key>UTTypeIconFiles</key>
            <array/>
            <key>UTTypeIdentifier</key>
            <string>com.myappname.tc-document</string>
            <key>UTTypeReferenceURL</key>
            <string></string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <array>
                    <string>tc</string>
                    <string>TC</string>
                </array>
            </dict>
        </dict>
    </array>

到目前为止,我已尝试添加到 CFBundleDocumentTypes:

            <key>CFBundleTypeRole</key>
            <string>Editor</string>

但这似乎并没有改变什么,然后我得到了一个

The application supports opening files, but doesn't declare whether it supports opening them in place. You can add an LSSupportsOpeningDocumentsInPlace entry or an UISupportsDocumentBrowser entry to your Info.plist to declare support.

来自编译器的警告。

同样有趣的是,我可以从邮件附件中使用 Open-In,但如果我将文件作为 iMessage 发送,我什至无法启动 Open-In,因此无法从 Messages 中对其执行任何操作。

实现 iOS 上的所有功能:

  1. 不用CFBundleTypeRole键,好像是for Mac apps.

  2. <key>LSSupportsOpeningDocumentsInPlace</key> <true/> 键添加到 info.plist 中的主字典,这将使您点击的文件直接在应用程序中打开以及常规的打开方式。

  3. 要添加对打开文档的支持,请实现 UIDocument 的子类。至少添加 init(url: URL)override func load(fromContents contents: Any, ofType typeName: String?)。 UIDocument 将处理 url 是否在安全范围内,因此无需自己调用 .startAccessingSecurityScopedResource()。 UIDocument 还将处理异步等待 iCloud Drive 文件下载。

  4. .onOpenURL { url in } 或其他地方调用您的 UIDocumentSubclass(url: url).open(completionHandler:)