Cordova + cordova-ios 6.1.0 - 加载本地图像
Cordova + cordova-ios 6.1.0 - load local image
我有一个 cordova 应用程序,在使用 cordova-ios 6.x.
之前运行良好
此应用程序将几张图片下载到 cordova.file.dataDirectory 以供离线访问....到目前为止,除了使用本地网络服务器插件外,我还没有找到显示此图片的方法。
是否有任何其他内置方式允许从 cdvfile 方案中提供内容? [我需要设置一个 img src] 因为可能有很多图像,转换为 base64 对我来说不是一个选项。
感谢任何帮助
致所有像我一样挣扎的人。有一个解决方案,不需要对代码进行重大更改。
需要 2 个步骤:
首先使用以下
更新您的config.xml
<platform name="ios">
<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />
</platform>
然后使用未记录的方法转换您的 file:// link
window.WkWebView.convertFilePath(filePath)
此方法执行转换为虚拟本地主机 link,使文件可访问并绕过 WkWebView 限制。稍微长一点的样本是这样的
let localFile = cordova.file.dataDirectory + 'logo.png';
let convertedPath = window.WkWebView.convertFilePath(localFile);
document.getElementById("myImg").src = convertedPath;
在与它斗争了几天之后,我找到的解决方案是不使用 cdvfile://
来为 iOS 上的文件提供服务。 WkWebView 真的不好用。
但是,WkWebView 非常适合从本机 file://
协议加载资产,因此您可以使用以下方法将 cdvfile://
转换为:
const resolveIosPath = (path) => new Promise((resolve, reject) => {
window.resolveLocalFileSystemURL(path, entry => {
resolve(window.WkWebView.convertFilePath(entry.toURL())
},
reject
)
要使用它,只需 运行 您通过该方法的路径并将结果应用到 src
属性:
// With async/await
const img = document.createElement("img")
img.src = await resolveIosPath("cdvfile://images/logo.png")
document.body.appendChild(img)
// With Promise chain
resolveIosPath("cdvfile://images/logo.png").then((src) => {
const img = document.createElement("img")
img.src = src
document.body.appendChild(img)
})
// With synchronous img mount, but src added asynchronously
const img = document.createElement("img")
document.body.appendChild(img)
resolveIosPath("cdvfile://images/logo.png").then((src) => {
img.src = src
})
如果您不喜欢异步执行所有这些操作,您可以在应用程序初始化期间的某个时间保存根目录:
// Storing on `window` just as an example, the point is to make it globally available
window.cacheRoot = await resolveIosPath("cdvfile://")
...然后你可以像这样同步使用它:
const img = document.createElement("img")
img.src = window.cacheRoot + "logo.png"
document.body.appendChild(img)
我有一个 cordova 应用程序,在使用 cordova-ios 6.x.
之前运行良好此应用程序将几张图片下载到 cordova.file.dataDirectory 以供离线访问....到目前为止,除了使用本地网络服务器插件外,我还没有找到显示此图片的方法。
是否有任何其他内置方式允许从 cdvfile 方案中提供内容? [我需要设置一个 img src] 因为可能有很多图像,转换为 base64 对我来说不是一个选项。
感谢任何帮助
致所有像我一样挣扎的人。有一个解决方案,不需要对代码进行重大更改。
需要 2 个步骤:
首先使用以下
更新您的config.xml<platform name="ios">
<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />
</platform>
然后使用未记录的方法转换您的 file:// link
window.WkWebView.convertFilePath(filePath)
此方法执行转换为虚拟本地主机 link,使文件可访问并绕过 WkWebView 限制。稍微长一点的样本是这样的
let localFile = cordova.file.dataDirectory + 'logo.png';
let convertedPath = window.WkWebView.convertFilePath(localFile);
document.getElementById("myImg").src = convertedPath;
在与它斗争了几天之后,我找到的解决方案是不使用 cdvfile://
来为 iOS 上的文件提供服务。 WkWebView 真的不好用。
但是,WkWebView 非常适合从本机 file://
协议加载资产,因此您可以使用以下方法将 cdvfile://
转换为:
const resolveIosPath = (path) => new Promise((resolve, reject) => {
window.resolveLocalFileSystemURL(path, entry => {
resolve(window.WkWebView.convertFilePath(entry.toURL())
},
reject
)
要使用它,只需 运行 您通过该方法的路径并将结果应用到 src
属性:
// With async/await
const img = document.createElement("img")
img.src = await resolveIosPath("cdvfile://images/logo.png")
document.body.appendChild(img)
// With Promise chain
resolveIosPath("cdvfile://images/logo.png").then((src) => {
const img = document.createElement("img")
img.src = src
document.body.appendChild(img)
})
// With synchronous img mount, but src added asynchronously
const img = document.createElement("img")
document.body.appendChild(img)
resolveIosPath("cdvfile://images/logo.png").then((src) => {
img.src = src
})
如果您不喜欢异步执行所有这些操作,您可以在应用程序初始化期间的某个时间保存根目录:
// Storing on `window` just as an example, the point is to make it globally available
window.cacheRoot = await resolveIosPath("cdvfile://")
...然后你可以像这样同步使用它:
const img = document.createElement("img")
img.src = window.cacheRoot + "logo.png"
document.body.appendChild(img)