拦截Webview窗口的URL请求 - overrideUrlLoading
背景
uniapp webview中的下载链接在app中点击后没有拉起系统下载, 并且下载完成后也不知道下载到哪里去了
原因
没查到, 猜测可能是uniapp自带webview限制或者安全策略导致, 纯H5中是正常的, 在打包成APP后出现问题
解决方式1 (拉起系统浏览器下载)
plus.runtime.openURL(url)直接调用系统的打开, 测试为拉起浏览器的下载
解决方式2 (app内下载, 下载完需自己处理, 否则也无下载记录)
拦截apk后使用plus.downloader.createDownload处理, 代码中为下载完成后安装, 请根据实际情况处理
代码
var wv;
onReady() {
// #ifdef APP-PLUS
var currentWebview = this.$scope.$getAppWebview();
if (uni.getSystemInfoSync().platform == "android") {
setTimeout(function() {
wv = currentWebview.children()[0]
// 拦截所有页面跳转,可使用参数拦截.apk的跳转
wv.overrideUrlLoading({
mode: 'reject',
match: '.*\.apk.*'
}, function(e) {
console.log('下载地址', e.url)
// 方式1
plus.runtime.openURL(url)
// 方式2
var dtask = plus.downloader.createDownload(
e.url, {},
function(d, status) {
//下载完成
if (status == 200) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d
.filename), {}, {}, function(error) {
uni.showToast({
title: '安装失败',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '下载失败',
mask: false,
duration: 1500
});
}
});
try {
dtask.start(); // 开启下载的任务
var prg = 0;
var showLoading = plus.nativeUI.showWaiting("正在下载");
dtask.addEventListener('statechanged', function(
task,
status
) {
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
showLoading.setTitle("正在下载");
break;
case 2:
showLoading.setTitle("已连接到服务器");
break;
case 3:
prg = parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
);
showLoading.setTitle("正在下载" + prg + "% ");
break;
case 4:
plus.nativeUI.closeWaiting();
//下载完成
break;
}
});
} catch (err) {
plus.nativeUI.closeWaiting();
uni.showToast({
title: '下载失败-03',
mask: false,
duration: 1500
});
}
});
}, 1000); //如果是页面初始化调用时,需要延时一下
}
// #endif
},