Capacitor Filesystem.getUri 未在 IOS 上返回完整文件路径

Posted

技术标签:

【中文标题】Capacitor Filesystem.getUri 未在 IOS 上返回完整文件路径【英文标题】:Capacitor Filesystem.getUri not returning full file path on IOS 【发布时间】:2020-11-09 20:47:33 【问题描述】:

我正在使用电容器文件系统插件来在电容器移动应用程序中写入和读取文件。 在 ios 上,我在写入文件和文件夹时使用 FilesystemDirectory.Documents 作为目录参数。 当我调用 Filesystem.getUri( path: directoryPath, directory:FilesystemDirectory.Documents ) 时,它不是返回完整路径(file://...),而是返回 '/DOCUMENTS/...' 而我无法使用返回的 url 加载文件。

注意到它在 android 和电子应用程序上运行良好。 IOS有什么帮助吗?

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,原来是因为启用了App-Bound Domains。在这种情况下,它是在那里运行的网络版本。正如@jcesarmobile 在此comment 中提到的:

添加 WKAppBoundDomains 键会阻止 javascript 注入和其他 WKWebView 功能,除非将 limitsNavigationsToAppBoundDomains 设置为 true ... 如果没有 JavaScript 注入,原生插件将无法工作,而是使用 Web 版本。

Web 版本使用像 /DOCUMENTS/... 这样的相对 URI,因为文件存储在浏览器的 IndexedDb 中,无法获得它们的完整路径。 (至少在撰写本文时,请参阅相关的open issue)。

如果是这种情况,请删除该键并禁用 App-Bound Domains 或将 limitsNavigationsToAppBoundDomains 设置为 trueFilesystem.getUri(..) 将返回以 file:// 开头的路径。将其传递给Capacitor.convertFileSrc(..),您将获得一个与capacitor://localhost/_capacitor_file_/.. 相匹配的工作网址,您的DOM 可以使用该网址。

【讨论】:

您好,我遇到了同样的问题,但我的配置中没有任何关于应用绑定域的信息。我在本地开发中使用 livereload 在 iOS 上运行 Capacitor 2.4.6(它在 livereload 被禁用时工作)。知道为什么吗?【参考方案2】:

与在 IOS 中一样,您的应用程序在此处所述What is the documents directory (NSDocumentDirectory)? 的沙盒环境中运行,因此 IOS 将为每个应用程序创建一个单独的文件系统,其中一个目录为 /DOCUMENTS/,我们在这里拥有它,因此它是一个这是您获得的路径的正常行为。 (这里也有描述https://capacitorjs.com/docs/apis/filesystem#filesystemdirectory) 您能否具体说明您需要完整路径的具体内容,因为您的应用可以访问其自己的 /DOCUMENTS/ 目录,但不能访问其他应用 /DOCUMENTS/。

【讨论】:

我在documents目录下写了一些文件,我需要得到这些文件的完整路径,这样我就可以把它传递给插件,比如cordova fileopener或者Media plugin,...跨度>

以上是关于Capacitor Filesystem.getUri 未在 IOS 上返回完整文件路径的主要内容,如果未能解决你的问题,请参考以下文章

离子 5 / 电容器 @capacitor/motion 坚持 DeviceMotionEvent.requestPermission

在@capacitor-community/admob 中找不到广告的发布商数据

capacitor集成codepush

CocoaPods 找不到 pod“Capacitor”的兼容版本

从 Android 意图打开 Ionic (Capacitor) 应用程序中的特定页面

Angular + Capacitor:appStateChange 监听器不工作