7

我想在我的 iOS 应用程序中创建“打开方式”功能。

有什么方法可以检查此设备上的任何应用程序是否与我要共享的文件扩展名相关联?

如果当前设备上没有应用程序可以打开具有此类扩展名的文件,则单击“打开方式”UIDocumentInteractionController按钮后将不会显示,但在这种情况下我不想显示此按钮。

所以问题是:如何检查设备上的任何应用程序是否可以打开某些具有特定扩展名的文件?


更新:

例如有财产。UIDocumentInteractionController_NSArrayicons

它包含可以使用我的扩展名打开文件的所有应用程序的图像。但如果没有应用程序,它包含空应用程序的图像。

所以我不能用docInteractionController.icons.count == 0例如检查它。我正在寻找其他技巧。

提前致谢。

4

3 回答 3

5

虽然UIDocumentInteractionController不提供预先发现是否有任何应用程序可以处理文档的方法,但-presentOpenInMenuFromRect: 返回一个标志,指示是否有任何应用程序可以打开文档。这要求您已经设置并展示了控制器,这不是最佳的。

有一个解决方法,有点笨拙但很实用:在调用“真实”交互控制器之前,使用虚拟文档创建一个虚拟控制器,并present从窗口边界的矩形中创建一个虚拟控制器。这保证了它会“出现”在屏幕外,因此您的用户不会看到它。此时,您已从 中返回标志-present,您可以立即关闭虚拟控制器,然后继续适当地显示您的 UI。

于 2013-03-14T14:51:15.180 回答
1

在 OSX 上,您可以获得能够处理特定内容类型的应用程序包标识符列表,使用LSCopyAllRoleHandlersForContentType. 但是在iOS上,我认为没有这样的方法。

如果我找到,我会编辑我的答案。

考虑到您正在寻找其他技巧,您可以检查图标数组中的一个图像是否是通用文档图标。

如果是,那么您知道没有关联的应用程序来处理该文件类型。但是这种方法将取决于操作系统版本,因为通用文件图标可能会改变。

于 2013-03-14T14:43:58.290 回答
0

来自官方文档:

要声明其对文件类型的支持,您的应用程序必须在其 Info.plistproperty 列表文件中包含 CFBundleDocumentTypes 键。(请参阅“核心基础密钥”。)系统将此信息添加到其他应用程序可以通过文档交互控制器访问的注册表中。

对我来说,这表明注册表只能通过 UIDocumentInteractionController 访问,所以不,您无法提前知道文件格式是否有任何可用的应用程序(这完全符合 Apple 不让应用程序直接互动)。

更新: 正如您所说,即使没有应用程序,icons 属性也包含图像。我检查了控制器的所有其他方法和属性并没有提示可能打开当前文件格式的应用程序。您说如果没有应用程序可以打开指定的文件格式,则会出现“空应用程序的图像”。也许您可以提取该图标,当数组图标只有一个图像时,检查提取的图像和图标是否相同?

于 2013-03-14T14:07:12.970 回答