我有一个带有应用内功能的 iOS 应用程序,可以让用户从相册中选择照片或使用相机拍照。我还想允许用户导入他们在手机上其他任何地方找到的照片:邮件、Safari、照片...任何允许用户长按图像并查看“共享...”菜单的应用程序。
我已经为此奋斗了大约两周。我相信我完全遵循了文档,但到目前为止,“唯一”我可以让我的应用程序出现的地方是当用户从“照片”应用程序共享一张照片时。如果在“照片”中选择多个图像,它不会显示,如果在 Safari 或“邮件”中选择图像,它也不会显示。 现在,我知道这是可能的,因为任何此类图像的共享表中都会出现数十个其他第三方应用程序(在我的设备上:Instagram、OmniFocus、Instapaper、Obsidian、ChatGPT,仅举几例) .
这些也不是共享表扩展 - 几乎所有这些都会完全打开目标应用程序并将焦点从源应用程序转移开。
我必须继续的主要主要来源是这个
Apple TechNote(“如何让我的应用程序显示在“打开方式...”菜单中。”)。我启动了一个新的 Xcode 项目,进行了本文档中建议的更改,并且...就像我的实际应用程序一样,我看到此图标的唯一位置是 Photos.app 中的单张照片。 我尝试了
LSHandlerRank
和
CFBundleTypeRole
的不同排列;我尝试过有或没有CFBundleTypeIconFiles
;有和没有LSSupportsOpeningDocumentsInPlace
;我已经从一般尿路感染(如 public.data
和 public.content
)发展到中间尿路感染(如 public.image
)和特定尿路感染(如 public.jpeg
)。 没有一个对我有用。我尝试通过Apple开发人员支持打开代码级案例,但仍在等待答案。 (我使用这些包罗万象的 UTI 是因为具有此功能的其他应用程序似乎出现在每个共享表中,设备上的任何地方_ 我确实看到我的应用程序图标一次
出现在共享表中,但当我再次尝试时,它没有发生。似乎我的 CFBundleDocumentTypes
被操作系统缓存并不可预测地刷新。我无法回到导致它的状态。
下面是我从新的 Xcode 项目中获取不工作的
CFBundleDocumentTypes
配置的步骤。请注意,我已经尝试了很多不同的组合,所以请不要只是建议我尝试随机的新组合 - 我想听到的是一个
实际上有效的配置,因为它对于我来说似乎是微不足道的所有这些其他应用程序都需要实施。 创建一个新的 Xcode 项目。
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Image</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>public.data</string>
<string>public.content</string>
<string>public.item</string>
</array>
</dict>
</array>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
SceneDelegate
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
for context in URLContexts {
let url = context.url
if let data = try? Data(contentsOf: url),
let image = UIImage(data: data) {
let alert = UIAlertController()
alert.title = "Loaded an image"
alert.message = "Size is \(image.size)"
window?.rootViewController?.present(alert, animated: true, completion: nil)
}
}
}
注意:您可以尝试使用或不使用
LSSupportsOpeningDocumentsInPlace
- 这对我来说没有什么区别。
图像。这对我来说效果很好,当用户点击邮件消息或消息消息中的图像文件(以及照片中的单个图像)然后要求共享时,使我的应用程序显示在列表中:
<key>CFBundleTypeName</key>
<string>Image</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>LSItemContentTypes</key>
<array>
<string>public.image</string>
</array>
我不知道有哪个应用程序可以使用照片中的多个图像来完成此操作;当照片中有多个选择时,出现在共享表中的应用程序正在使用共享扩展。您无法在邮件消息中选择并共享多个图像文件,因此不会出现多个图像文件的问题。