对于我的 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>
它可以工作......但它很挑剔并且记录不充分,IMO。
经过大量实验才弄清楚。
在我的例子中,通过使用“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)