##更新於2019-07-12
最近在把App代碼轉換到小程序上,之前寫的webview的東西放到小程序上無法使用,而且支付寶小程序居然是如此的坑。
所以我們換一種方法使用,這個方法放到App上一樣兼容,可以放心使用。如果有需要App頁面的,可以參考我之前的寫法。
首先新建一個webview.vue界面(src對應的地址html,需要你自己定義,可以通過傳參)
login.vue組件跳轉到webview
uni.navigatTo({
url:"/pages/webview?path=https://www.baidu.com"//https://www.baidu.com,這個是自定義的第三方頁面,你可千萬別當真,下面會具體說明這個頁面的寫法
})
<template>
<view class="content">
<web-view :src="path">//這個是自定義頁面(htmlA)
</web-view>
</view>
</template>
<script>
export default {
data() {
return {
path:''
}
},
onLoad:function(e){
this.path=e.path;
},
methods: {
},
}
</script>
然後新建你的地址頁面,就是第三方頁面。最好嚴格按照我寫的來(www.baidu.com//這個頁面是假的路徑)
##2019/11/1更新, PS:雖然上面說了按照我的代碼來,還是有部分網友不是的,把微信sdk放到uni SDK下面。然後始終無法調通,害得我也懷疑自己代碼的問題,直接把下面的代碼從上到下拷出來改一下就可以了。不然的確很難受。
<!DOCTYPE html>
<html>
<head>
<title>跳轉</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>正在跳轉中,請稍後</div>
<!-- 微信 JS-SDK 如果不需要兼容微信小程序,則無需引用此 JS 文件。 -->
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
<!-- 支付寶的 JS-SDK 防止 404 需要動態加載,如果不需要兼容支付寶小程序,則無需引用此 JS 文件。 -->
<script type="text/javascript">
if (navigator.userAgent.indexOf('AlipayClient') > -1) {
document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');
}
</script>
<!-- uni 的 SDK -->
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.1.js"></script>
<script type="text/javascript">
document.addEventListener('UniAppJSBridgeReady', function() {
let str = window.location.search;
uni.postMessage({
data: {
str: str
}
});
uni.reLaunch({
url: '/pages/index/index?str=' + str,//這個路徑就是你自己項目需要回調的頁面,str是你的傳參 animationType: 'none',
animationDuration: 0
});//網頁嚮應用 postMessage 時,會在特定時機(後退、組件銷燬、分享)觸發並收到消息。所以這段代碼是必須的
});
</script>
</body>
</html>
這個就是這樣了,撒喲娜拉,自從寫了小程序,可以光明正大的玩手機了,哈哈哈
###這是我之前#寫法---
最近在用uniapp在寫一個App。不得不說可以作爲一個三端開發的框架,還是不錯的。不過有些東西還是需要繼續改進。
業務需求是,調用第三方登錄頁面(htmlA),登錄成功後,將唯一標識符傳給一個頁面(htmlB),然後(htmlB-這個頁面可以自定義)將一個唯一標識符,回調傳給app.
琢磨了半天,發現uniapp有個webview組件,(htmlB)只要根據固定的寫法將唯一標識發送回來即可
(htmlB)根據文檔引入<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.1.js"></script>,然後
<html>
<head>
<title>測試頁面</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- uni 的 SDK -->
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.1.js"></script>
</head>
<body>
<button style="height: 50px; width: 100px;" onclick="login()">login</button>
</body>
<script type="text/javascript">
document.addEventListener('UniAppJSBridgeReady', function() {
console.log("加載完成,可以使用uni相關接口");
});
function login() {//點擊login發送數據。不過一般都是頁面一加載的時候調用,這只是個demo
uni.postMessage({
data: {
action: 'postMessage',
userInfo: {
openId: 222
}
}
})
uni.navigateBack();//網頁嚮應用 postMessage 時,會在特定時機(後退、組件銷燬、分享)觸發並收到消息。所以這段代碼是必須的
}
</script>
</html>
然後uniapp新建一個webview頁面去調用此頁面
<template>
<view class="content">
<web-view
src="www.baidu.com?appId=000999&redirectUri=https://www.baidu.com/ias/app/login/token&responseType=code"//這個是登錄頁面(htmlA)
@message="handleMessage">
</web-view>
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
handleMessage(evt) {
this.log('接收到的消息:' + JSON.stringify(evt.detail));
},
}
}
</script>
寫了這段代碼以爲完成了需求,結果發現一個致命bug,就是webview只有自己手動返回時,纔可以關閉,這就比較無敵了,頁面登錄完後,數據返回後需要手動後退,才能結束登錄頁面進入首頁。。。uniapp沒有發現解決辦法只能去其他地方去找了,那就是h5+ Api
具體的思路爲(htmlA)將唯一標識符放在一個定義的url傳給(htmlB),
uniapp通過overrideUrlLoading監聽這個地址,一旦發現匹配的地址,攔截頁面跳轉,將那個url傳給Uniapp,然後uniapp解析字符串、
var w = plus.webview.create('www.baidu.com?appId=000999&redirectUri=https://www.baidu.com/ias/app/login/token&responseType=code');
// 攔截所有頁面跳轉,可使用參數攔截weibo.com域名之外的跳轉({mode:'allow',match:'.*weibo\.com/.*'})
w.overrideUrlLoading({mode:'reject',match:'http://localhost/.*'}, (e)=>{
// this.log('reject url: '+e.url);
var ceTokenId=e.url.split('?')[1].split('&')[2].split('=')[1];//獲取tokenId後續可作調整
plus.webview.close(w);//關閉webview
});
w.show(); // 顯示窗口