如何读取从iOS文件应用程序共享的文件

问题描述 投票:0回答:1

我有一个应用程序,允许我导出(和导入)其内容。 在努力替换已弃用的“unarchiveTopLevelObjectWithData”unarchiveTopLevelObjectWithData(仍在进行中)时,我遇到了一些测试问题。 我的测试是,我之前已导出到“文件”应用程序,然后使用共享表将其发送到我的应用程序。这不起作用。 过去,我从 WhatsApp 等应用程序导入文件,效果很好。

经过一些故障排除后,我发现由于某种原因,从“文件”应用程序(而不仅仅是 iCloud Drive)共享时,我获得的文件 URL 与从其他应用程序获得的文件 URL 不同。 如果“文件”应用程序中的文件位于 iCloud Drive 中,我会得到以下路径:

/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs

当我将文件移动到“在我的 iPhone 上”位置并从那里共享时,我得到:

/private/var/mobile/Containers/Shared/AppGroup/***/File Provider Storage/Files

我的应用程序的构建目的是,当非文件应用程序共享文件时,它会被放入文档文件夹的“收件箱”子文件夹中。所以我的应用程序当前所做的就是检查该位置。 现在我已经修改了应用程序以从“application:openURL:options:”方法获取 URL。但是当我使用该 URL 使用“FileManager.default.fileExists”检查文件是否存在时,它找不到它。

所以我的第一个问题是,为什么“文件”应用程序在共享文件的方式方面与其他应用程序不同?

第二个问题是我需要做什么才能允许我的应用程序访问文件应用程序生成的网址?

ios swift ios-sharesheet files-app
1个回答
0
投票

我发现这篇文章给了我一个可行的解决方案。 所需要的是,您需要将 URL 视为“SecurityScopedResource”,并且必须启动和停止访问它。修改上述文章中的代码片段:

guard url.startAccessingSecurityScopedResource() else {
   throw ImportError.accessDenied // Or return
}
do { 
   //Process your URL as usual
   url.stopAccessingSecurityScopedResource() 
}

通过使用此功能,可以从“文件”应用程序打开文件,并且通过扩展,AirDropping 文件也将起作用。 需要注意的一件事是,以这种方式共享文件确实会从“文件”应用程序中删除该文件。这就是我想要的,但如果您不希望这种情况发生,似乎需要注意。

© www.soinside.com 2019 - 2024. All rights reserved.