uniapp通過webview調用第三方頁面 App 小程序

##更新於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(); // 顯示窗口

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章