6

我希望用另一个应用程序打开一个文件(本地存储在我的应用程序中)。

目前,我正在使用 openURL(有一个专用的 url 方案),如果我使用托管在互联网上的文件,它可以正常工作,但我想使用本地文件:a)它可以离线工作 b)很多我的用户不在小区覆盖范围内或在国际漫游的时间

到目前为止我所尝试的:我没有任何运气告诉 openURL 使用本地文件,我尝试了一些方法,但它们都是这样的

      NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"ext"];
      NSURL *fileURL = [NSURL fileURLWithPath:filePath];
      [[UIApplication sharedApplication] openURL:fileURL];

      NSURL *fileURL = [[NSBundle mainBundle] URLForResource: @"test" withExtension:@"ext"];
      [[UIApplication sharedApplication] openURL:fileURL];

还手动使用具有 localhost/ 和 file:// 和 var/mobile 等路径的不同变体的字符串

没有任何效果(无论如何对我来说)

所以,我环顾四周,遇到了UIDocumentInteractionController

我可以使用 UIDocumentInteractionController 让用户使用其他应用程序打开我的本地文件 - 但是它总是提供其他应用程序的多个选项以供使用,例如,其他应用程序之一可以是“Dropbox”。

我不想让用户下载(或从技术上上传)我的文件的副本以供他们以其他方式使用。它包含我不希望如此容易获得的数据。

当我的预期应用程序(不是我制作的)打开文件时,它不允许任何形式的保存或访问原始数据。

我意识到,通过将文件包含在我的应用程序中,任何认真想要获得它的人都可以,我只是不想闪现一个大菜单,说“如果你想要自己的副本从中制作衍生作品,就在这里”

理想情况下,我可以使用 openURL 但我认为这是因为其他应用程序没有响应的“沙箱” - 在 Android 中,我使用 mode_world_readable 将文件声明为其他应用程序可读(因此将其放在沙箱之外,它不允许其他应用程序对其进行写入,只需读取)-iOS 是否也可以这样做?

否则,如果我可以强制 UIDocumentInteractionController 使用特定的应用程序而不显示菜单 - 那也很好。

前段时间问了类似的问题

抱歉,阅读时间长,任何帮助表示赞赏。

编辑:我刚刚收到 Apple 技术支持的答复,他们告诉我这目前是不可能的(就在 iOS 6 发布之后)

4

1 回答 1

0

是的,由于 iOS 上严格的沙盒,您受到了限制。这里有一些想法。

您可以通过继承 QLPreviewController 来覆盖 UIDocumentInteractionController 的功能。然后,您可以替换显示“打开方式”菜单的标准栏按钮项。看看这篇文章,了解一种将 QLPreviewController 子类化的解决方案:QLPreviewController remove or add UIBarButtonItems

当然,我相信应用程序间共享的工作方式很大程度上不在你的掌控之中。如果应用程序已注册为能够处理某种类型的文件,无论您是否愿意,它都会显示为“打开方式”列表中的选项之一。我不相信您可以过滤该列表中显示的应用程序。

以下是我想过但从未尝试过的两个实验性想法:

  • 您可以对您尝试传递的文件中的数据进行 base64 编码——它只是将二进制转换为文本——并将其作为用于启动其他应用程序的自定义 URL 的一部分传递。然后另一个应用程序可以 base64 将相同的数据解码回二进制文件。不利的一面是 URL 的长度有限制,这意味着您发送的“文件”必须非常小。

  • 接下来,我什至不知道这是否可能,但我想知道您是否可以使用一些隐写算法将文档数据嵌入图像中,然后将其交给相机胶卷。然后,另一个应用程序可以打开相机胶卷并将图像再次解码回数据。... 是的。我知道...晦涩难懂,但尝试实施可能会很有趣。;-)

不确定是否有任何帮助,但您确实说过“感谢任何帮助”。;-)

此致。

于 2012-09-22T06:15:59.047 回答