使用 Cordova 3.7 (file://) 从 iOS 8 上的 www 文件夹加载资产

Posted

技术标签:

【中文标题】使用 Cordova 3.7 (file://) 从 iOS 8 上的 www 文件夹加载资产【英文标题】:Load assets from www folder on iOS 8 with Cordova 3.7 (file://) 【发布时间】:2015-01-12 15:58:28 【问题描述】:

我有一个使用 Cordova 3.7 和 jQuery Mobile 1.3.2 在 ios 7 上完美运行的混合应用

我正在 iOS 8 上对其进行测试,但它已损坏。 我使用file:// 协议使用绝对路径请求我的应用程序的每个页面(视图),例如:

file:///var/mobile/Applications/<UUID>/MyApp.app/www/views/add-project.html

但我得到了错误:

Failed to load resource: The requested URL was not found on this server.

我读到了this bug,是这个问题吗?

另外,在 iOS 8 上,www 文件夹的位置与 iOS 7 有点不同,它解析为:

file:///var/mobile/Containers/Data/Application/<UUID>/MYApp.app/www/views/add-project.html

这对吗?

我尝试了 toURL() 和 toInternalURL() 方法来获得绝对路径,例如:

cdvfile://localhost/root/var/mobile/Containers/Bundle/Application/<UUID>/MyApp.app/ 但我总是遇到同样的错误。 有什么建议吗?

谢谢

【问题讨论】:

为什么要使用绝对路径?据我所知,这个bug只影响WKWebView,不影响UIWebView,如果你使用cordova,它使用UIWebView 我无法加载任何文件。我使用的是绝对路径,因为应用程序是动态的,有很多动态创建的视图,并且导航与相对 url 有点混乱。 我解决了,这是Cordova中的一个错误,看我的回答 【参考方案1】:

对于那些可能觉得这很有用的人,我终于设法解决了这个问题。

ios 8+ 上www 文件夹的完整路径是:

file:///private/var/mobile/Containers/Bundle/Application/<UUID>/<your_app>.app/www/

但是当您使用 Cordova 请求应用程序目录时,这样做:

window.resolveLocalFileSystemURL(cordova.file.applicationDirectory, onSuccess, onError);

它会给你一个错误的路径(iOS 8.1.2 上的 Cordova 3.7),例如:

file:////var/mobile/Containers/Bundle/Application/<UUID>/<your_app>.app/

使用文档中建议的 toURL() 方法

因此您需要手动进行一些调整

var path = fileSystem.toURL();//given by the success callback 

IOS_ASSETS_ABS_PATH = path.replace("file:////", "file:///private/");

IOS_ASSETS_ABS_PATH += "www/";

还有宾果游戏!

【讨论】:

为什么要投反对票?请添加原因:/ 通过使用 Cordova Media Plugin 录制音频文件,我看到的文件路径是 file:///var/mobile/Containers/Data/Application/DFE05760-5582-4224-88BA-3BE034C553CF/tmp/myrecording.wav。你的调整不起作用。 正确的路径应该是什么?谢谢。 录制音频时,它保存在缓存文件夹中,而不是www。查看https://github.com/apache/cordova-plugin-file 上的文件路径。我的调整是使用绝对 url 加载 html 页面,而不是文件。 www 文件夹是只读的 file://private/var/ 这个 pat 无法触发 webview 方法 - webView:shouldStartLoadWithRequest:navigationType: 我该如何解决?【参考方案2】:

我遇到了同样的问题,我设法解决了它。就我而言,我的问题是每次更新应用程序时,新应用程序的 id 都与上一个不同。例如,旧应用的路径是:

file:///var/mobile/Containers/Data/Application/7A3590E8-C78A-4F45-B5B9-51FD0BAFE524/Library/files/file.pdf

还有新的:

file:///var/mobile/Containers/Data/Application/1BC5FS-7B3B-90E8-C7C8-1B7C1984C2A71/Library/files/file.pdf

因此,即使我的 pdf 文件仍在应用程序数据存储中,但由于应用程序创建了一个新的应用程序 ID,因此我使用了错误的路径。我通过创建一个新函数来解决这个问题,该函数每次有更新时都会更新我的路径。我通过以下方式找到应用程序 ID:

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);

function onFileSystemSuccess(fileSystem) 
    // Do what you need here

文件系统是一个在根目录中包含 nativeURL 的对象。

希望对你有帮助!

【讨论】:

【参考方案3】:

遇到了类似的问题,添加 WWW 成功了!

pic.style.backgroundImage = "url('../www/images/" + id + ".jpg')";

【讨论】:

以上是关于使用 Cordova 3.7 (file://) 从 iOS 8 上的 www 文件夹加载资产的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 10 中使用 cordova-plugin-file 复制 SQLite 数据库 cordova-sqlite-storage

Cordova/Cordova.h file not found的解决方法

生成 apk 时出现 Cordova-plugin-file 错误

cordova打开文件系统插件的使用: cordova-plugin-file-opener2

如何在 file:/// 协议 (Cordova/Phonegap) 下使用来自 dojo 的自定义构建

使用 cordova-plugin-file 在 Ponegap 中保存 PDF 文件