我还需要做什么才能通过点击附件打开我的 iOS 应用程序?

问题描述 投票:0回答:1

对于我的 iOS 16.x 应用程序,我在 Info.plist 中定义了一个自定义 UTI。

它的表现没有达到预期。例如,我点击具有新扩展名的文件链接或附件,但仅显示(简单 JSON)内容的视图。

奇怪的是,当我将具有 .custom 扩展名的文件作为附件拖到 Mac 上的消息线程中时,它会将其识别为一种应用程序名称文档(Mac 似乎将其与我的 iOS 应用程序正确关联)我在 Mac 上使用 Xcode 构建并在真正的 iPhone 上运行)。

但是,无论我在文件应用程序、消息、电子邮件、浏览 iCloud 驱动器的 http://iCloud.com 中单击或点击并按住,它都不会向我显示打开应用程序的选项它只显示内容(简单的 JSON)。

我在 AppDelegate.swift 中实现了 open url delegate 方法,并在 SceneDelegate.swift 中实现了相应的方法。

    <key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeIdentifier</key>
            <string>llc.company.App-Name-document</string>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.json</string>
            </array>
            <key>UTTypeDescription</key>
            <string>App Name Document</string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <array>
                    <string>custom</string>
                </array>
            </dict>
        </dict>
    </array>
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>App Name Document</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>llc.company.App-Name-document</string>
            </array>
            <key>LSHandlerRank</key>
            <string>Owner</string>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
        </dict>
    </array>
ios attachment launch uti info-plist
1个回答
0
投票

它可以工作......但它很挑剔并且记录不充分,IMO。

经过大量实验才弄清楚。


首先,关于上面评论中与@HangerRash的对话:虽然你*可以*使用像`public.data`这样的通用UTI,但它不知道如何显示数据(因为public.data仅仅表明它是一个通用字节流)。因此,它不会在查看器中打开文件,iOS 设备上的“消息”和“文件”应用程序会在查看器中显示共享菜单 [↑] 图标,该图标可让您与应用程序共享附件。

在我的例子中,通过使用“public.json”从基本 UTI 继承,它可以工作。我确信任何 UTI 能够弄清楚如何向用户显示附件的内容都会起作用(至少在消息和文件应用程序中),而邮件应用程序则更宽容一些,可以让您共享

public.data 
附件。

从 iOS 16 以及实现 SceneDelegate 的任何版本(我认为是 iOS 13+)开始,它都会通过 SceneDelegate 将附件的 URL 发送到应用程序:

 func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)

在另一个问题的答案中(我尚未验证,因为我需要实现更多代码才能测试它),有人提到,如果共享附件时应用程序尚未运行,则此委托方法将被调用,其中附件 URL 将通过选项参数传递:

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
© www.soinside.com 2019 - 2024. All rights reserved.