我想在我的iOS应用程序中创建“Open in ..”功能。
有没有办法检查此设备上的任何应用是否与我要分享的文件扩展名相关联?
如果当前设备上没有任何应用程序打开文件的扩展名,那么点击“打开方式”按钮后将不会显示UIDocumentInteractionController
,但我不想要在这种情况下显示此按钮。
所以问题是:如何检查设备上的任何应用是否可以打开某个具有特定扩展名的文件?
更新
例如UIDocumentInteractionController
有NSArray
属性icons
。
它包含可以使用我的扩展程序打开文件的所有应用程序的图像。但是,如果没有应用程序,它会覆盖空应用程序的图像。
所以我不能使用docInteractionController.icons.count == 0
来检查它。我正在寻找其他技巧。'
提前谢谢。
答案 0 :(得分:5)
虽然UIDocumentInteractionController
无法提前发现 ,但是否有任何应用程序可以处理文档,-presentOpenInMenuFromRect:
将返回一个标志,指示是否有任何可以打开文档的应用程序。这要求您已经设置并显示控制器,这不是最佳的。
有一个解决方法,有点hacky但功能正常:在你调用“真正的”交互控制器之前,使用虚拟文档创建一个虚拟文档,并从窗口边界的矩形创建present
它。这可以保证它“出现”在屏幕外,因此您的用户将无法看到它。此时,您有-present
返回的标志,您可以立即关闭虚拟控制器,然后继续正确显示您的UI。
答案 1 :(得分:1)
在OSX上,您可以使用LSCopyAllRoleHandlersForContentType
获取能够处理特定内容类型的应用程序包标识符列表。但是在iOS上,我认为没有这种方式。
如果我发现,我会编辑我的答案。
考虑到您正在寻找其他技巧,您可以检查图标数组中的一个图像是否是通用文档图标。
如果是,那么您知道没有关联的应用程序来处理该文件类型。但是这种方法将取决于操作系统版本,因为通用文件图标可能会发生变化。
答案 2 :(得分:0)
来自官方文件:
要声明其对文件类型的支持,您的应用必须包含 CFBundleDocument在其Info.plistproperty列表文件中键入键。 (看到 “核心基础密钥”。)系统将此信息添加到 其他应用程序可以通过文档交互访问的注册表 控制器。
对我来说,这表明注册表只能通过UIDocumentInteractionController访问,所以不,你不能事先知道文件格式是否有任何可用的应用程序(这完全符合Apple的哲学原理)不让应用程序直接相互交互)。
<强>更新强> 如你所说,即使没有应用程序存在,icons属性也包含一个图像。我检查了控制器的所有其他方法和属性没有提供有关可能打开当前文件格式的应用程序的提示。 您说如果没有应用程序可以打开指定的文件格式,则会出现“空应用程序的图像”。也许您可以提取该图标,当数组图标只有一个图像时,检查提取的图像和图标是否相同?