【发布时间】:2018-11-29 11:07:48
【问题描述】:
我有一个应用程序使用一些已知的大文件格式,并且从 iOS4 天开始就支持 iOS 的“Open In...”功能。
直到最近一直运行良好,某些应用程序,例如 iOS 内置的邮件应用程序,会通过在我的应用程序内的 ~/Documents/Inbox 目录中复制来打开应用程序,并且生活很好。
我最近意识到“打开方式...”不再适用于我的应用程序,至少当文件通过 iOS11+ 内置文件应用程序来自 iCloud/Dropbox/GoogleDrive 时,我我想知道我是否遗漏了什么。
检查代码后,我开始认为我一定遗漏了一些非常明显的东西,因为代码似乎是正确的,不打开文件,因为给定的路径无效或我的应用程序没有读取它们的必要权限。
这是我的代码:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)urlToOpen sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if([urlToOpen isFileURL]) // <<< this goes through
{
if([[NSFileManager defaultManager] isReadableFileAtPath:urlToOpen.path])
{
// <<< this doesn't
}
}
}
示例工作路径:
/private/var/mobile/Containers/Data/Application/F99A3EA4-457C-4043-AEB3-A9D961184360/Documents/plane.obj
/private/var/mobile/Containers/Data/Application/F99A3EA4-457C-4043-AEB3-A9D961184360/Documents/Inbox/cube.obj
不起作用的路径示例:
/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/somedir/somefile.ext
/private/var/mobile/Containers/Shared/AppGroup/A7FA40A0-2C7D-4FC1-BF21-A8E88B106FF9/File Provider Storage/7791941/local-storage/L3dzX3JhZmFfemFiYWxhL2Jhc2VvcmNfbWVzaC5vYmo=/somefile.ext
如您所见,两个正常工作的文件都将其数据复制到设备中我的本地应用程序目录中。
如何打开这些文件?请注意,我提到该应用程序使用大文件,因为它确实如此,所以我无法获得它们的内存副本,这不会有太大帮助,我需要获取文件路径以便我可以进行内存映射并在正确的时间加载所需的内容。
我已经阅读了一些关于 open in place 等的信息,但它不适用于我正在开发的应用程序类型,因为它不能在单个“元素”上运行,我提到的大文件只是其中之一可能的来源以及我所看到的关于就地开放的内容不适用于我的案例。
有没有办法让应用程序能够直接访问这些文件,或者至少将它们复制到我的应用程序沙盒临时目录中,以便我可以直接对它们进行内存映射?
干杯!
【问题讨论】:
-
我遇到了同样的问题,我解决了这个问题:stackoverflow.com/questions/47430244/…
-
是的,对不起,就是这样,我就此事联系了 Apple,忘记留下回复以供将来参考,我会贴出我最终得到的代码并关闭它。
标签: ios objective-c file-io ios11 icloud