我正在开发一个电话间隙应用程序,我们最近添加了对 Windows 8.1 平台的支持。该应用程序使用 Cordova FileSystem API 下载/创建保存到设备的文件。
我已使用如下所示的 URL 成功将文件保存到设备
ms-appdata:///local/file.png
我已经在我的电脑上进行了检查,并且可以在应用程序根文件夹下的 LocalState 文件夹中查看该文件。但是,当我尝试使用 inAppBrowser 打开此文件时,没有任何反应;没有报告错误消息,也没有触发任何 inAppBrowser 默认事件。
function empty() { alert('here'); } //never fires
var absoluteUrl = "ms-appdata:///local/file.png";
cordova.InAppBrowser.open(absoluteURL, "_blank", "location=no", { loadstart: empty, loadstop: empty, loaderror: empty });
我已通过在 url 上调用以下内置 JavaScript 来验证该 url 是否有效
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done(function (file) {
debugger; //the file object contains the correct path to the file; C:\...etc.
});
此外,添加 url 作为 img 标记的 src 也可以按预期工作。
我还尝试使用 addEventListener("loadstart") 等附加 inAppBrowser 处理程序,但它们都没有触发。但是,当我尝试打开“http://www.google.com ”时,事件确实会触发,并且 inAppBrowser 会在屏幕上弹出。
检查 dom 后,我可以看到已添加 inAppBrowser 元素,但它似乎没有设置源属性
<div class="inAppBrowserWrap">
<x-ms-webview style="border-width: 0px; width: 100%; height: 100%;"></x-ms-webview>
</div>
我查看了其他问题,例如 this one但无济于事。我已经验证了
a) InAppBrowser 已安装
b) deviceReady 已触发
我还尝试将目标更改为“_self”(同一问题)和“_system”(弹出窗口说您需要一个新应用程序来打开 msappdata://类型的文件),但我已经没有主意了。有人遇到过类似的问题吗?
最佳答案
我也遇到了类似的问题。我的 cordova 应用下载文件,然后使用 native 浏览器打开它(以便正确处理图像、PDF 文件等)。
最后我不得不修改 InAppBrowserProxy.js
类(Windows 平台的 InAppBrowser 插件的一部分)。
这是打开文件的代码(纯 JavaScript):
// This value comes from somewhere, I write it here as an example
var path = 'ms-appdata:///local//myfile.jpg';
// Open file in InAppBrowser
window.open(path, '_system', 'location=no');
然后,我更新了 InAppBrowserProxy.js 文件(在 platforms\windows\www\plugins\cordova-plugin-inappbrowser\src\windows
下)。我替换了这个代码片段:
if (target === "_system") {
url = new Windows.Foundation.Uri(strUrl);
Windows.System.Launcher.launchUriAsync(url);
}
通过这个:
if (target === "_system") {
if (strUrl.indexOf('ms-appdata:///local//') == 0) {
var fileName = decodeURI(strUrl.substr(String(strUrl).lastIndexOf("/") + 1));
var localFolder = Windows.Storage.ApplicationData.current.localFolder;
localFolder.getFileAsync(fileName).then(function (file) {
Windows.System.Launcher.launchFileAsync(file);
}, function (error) {
console.log("Error getting file '" + fileName + "': " + error);
});
} else {
url = new Windows.Foundation.Uri(strUrl);
Windows.System.Launcher.launchUriAsync(url);
}
}
这是一个非常临时的黑客,但它对我有用,并且可以改进、扩展,甚至标准化。
无论如何,可能还有其他方法可以实现这一目标,只是这对我有用......
关于windows-8.1 - 无法在Windows 8.1平台上使用cordova inappbrowser打开本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751851/