日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

突破Android微信微博浏览器限制直接拉起应

發(fā)布時間:2025/3/8 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 突破Android微信微博浏览器限制直接拉起应 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言
眾所周知,微信微博等應(yīng)用為了防止用戶在使用過程當(dāng)中跳出程序本身,對瀏覽器里面的自定義協(xié)議打開做了限制。這個需求很正常,是個產(chǎn)品經(jīng)理都能想到。

但作為微博微信這種體量的應(yīng)用來說,我要多說幾句:“右上角使用瀏覽器打開”成了每個前端開發(fā)者的標配,可以說浪費了多少的人力和財力,亦可以說造就了多少的就業(yè)機會。APP做得越大,越應(yīng)該有社會責(zé)任感。這種簡單粗暴的方式讓千千萬萬的開發(fā)者感到心痛,無語。請把選擇權(quán)交還給用戶,既然用戶點開了瀏覽器,我們也理解你們?yōu)樽约篈PP操碎了心,是否可以做成彈框再讓用戶選擇:是否打開xx應(yīng)用?

現(xiàn)狀
H5頁面增加自定義協(xié)議拉起APP在移動端來講是個非常特色的交互,而且也可以極大提高用戶體驗,基本是每個應(yīng)用的標配。通過

<a href="orpheus://playlist/19850925" />

就可以在點擊的時候觸發(fā)拉起應(yīng)用(前提是系統(tǒng)已經(jīng)安裝支持這個協(xié)議的應(yīng)用,這個例子里面叫orpheus。

微信微博瀏覽器如何封禁自定義協(xié)議呢?

public boolean shouldOverrideUrlLoading(WebView view, String url)

Android的WebView控件有個叫shouldOverrideUrlLoading的回調(diào),任何鏈接的打開(包括http和各種自定義協(xié)議)都會先走這個回調(diào),交給應(yīng)用本身來判斷是否要接手處理,return true表示接手,WebView就不再處理,否則WebView就繼續(xù)處理。
處理自定義協(xié)議其實不是WebView自帶的功能,而是需要開發(fā)者在這個回調(diào)里面去實現(xiàn)。比如類似這樣:

Intent intent = new Intent(Intent.ACTION_VIEW, uri); if (intent.resolveActivity(getPackageManager()) != null) {startActivity(intent); }

那微信微博與其說攔截,倒不如說他們只判斷了自己白名單的協(xié)議然后放行。

方法
除了苦逼的前端開發(fā)者實現(xiàn)個右上角用瀏覽器打開功能,還有一些思路可以參考。
1.偽裝成白名單協(xié)議
我們知道微信有白名單,比如合作的京東就可以直接打開,所以我們可以把我們的應(yīng)用做成京東的協(xié)議名稱,這樣如果用戶手機上面沒有安裝京東,就能直接拉起你的應(yīng)用。如果安裝了京東,則會跳出彈框讓用戶選用哪個打開(這個是系統(tǒng)行為)。這個方案有點猥瑣。
2.用右上角瀏覽器打開的時候可以把自己應(yīng)用置頂。我們知道右上角用瀏覽器打開其實也是微信調(diào)用了上述那段代碼,只不過協(xié)議固定是http或者https。當(dāng)然微信還是做過修改的,第一個位置固定放QQ瀏覽器(即使沒有安裝)。除了第一個位置剩余是按系統(tǒng)讀取的順序排列的。因為Intent其實是有優(yōu)先級的,那如何利用系統(tǒng)Intent優(yōu)先級來讓自己的應(yīng)用在這個彈框里面排在第二位呢?

首先應(yīng)用當(dāng)然要實現(xiàn)支持http/https協(xié)議,不然你都不會出現(xiàn)在這個頁面里面。然后給Intent配置域名信息,如下:
這樣在自己域名匹配上面排列就會靠前。甚至你可以在這個協(xié)議實現(xiàn)上面,直接將http/https的url轉(zhuǎn)換成native參數(shù),直接打開native頁面,省去中間webview跳轉(zhuǎn)。
如果url轉(zhuǎn)成native參數(shù)有點麻煩,你可以在分享鏈接的時候帶上Intent.toUri作為參數(shù),這樣后續(xù)收到url之后直接Intent.parseUri得到Intent,跳轉(zhuǎn)到指定頁面就簡單了。當(dāng)然這種做法有限制,比如參數(shù)不能缺失,也不能支持其他平臺分享過來的鏈接。如果應(yīng)用的不同平臺能統(tǒng)一跳轉(zhuǎn)協(xié)議也是很不錯的。

突破
還能再做點什么嗎?答案是肯定的。這個突破不是絕對的,而必須要求程序在后臺有個活著的進程。如果你感興趣請繼續(xù)往下看。

首先我們知道系統(tǒng)的很多彈框都是用Activity實現(xiàn)的,他可以彈出在任何應(yīng)用的任意一個界面上面,說到底這個彈框也是屬于系統(tǒng)的某個應(yīng)用,比如手機管家等等。那為什么一個APP在后臺能啟動的一個Activity可以在任意另外一個APP上面呢?
秘密就在于Intent.FLAG_ACTIVITY_NEW_TASK這個flag,我們知道如果context.startActivity里面的context不是Activity,是必須要加這個flag才能啟動成功。
第一個問題解決了,在android上面是有可能讓我們的一個頁面呈現(xiàn)在微信之上。那如何觸發(fā)調(diào)用呢?聰明的你可能想到了,對,就是在H5頁面上面給自己應(yīng)用發(fā)請求。
在自己應(yīng)用里面實現(xiàn)一個非常簡單的HttpServer,接聽來自本機的請求,一旦收到請求則直接使用Intent.FLAG_ACTIVITY_NEW_TASK拉起Activity。

可惜是當(dāng)你去嘗試在H5頁面里面給127.0.0.1或者localhost發(fā)請求的時候發(fā)現(xiàn)根本收不到,因為狡猾的微信微博瀏覽器限制了這兩個本機地址,限制方式也很簡單,還是剛才的shouldOverrideUrlLoading判斷下url的host是不是這2個就可以了。于是聰明的你肯定又想到了繞過的方式。沒錯隨便弄個域名解析到127.0.0.1上面。

于是整個鏈路快要完成了,剩下就是一些額外的工作,比如客戶端和H5頁面約定一串端口,按照約定順序依次遍歷直到請求得到響應(yīng)。因為端口有可能被占用。然后再約定一個加解密方式以防止被惡意攻擊。

這種方式有沒有可能被微信微博封禁呢?因為原理都是系統(tǒng)實現(xiàn),唯一的可能點就是對域名進行解析發(fā)現(xiàn)還是127.0.0.1的話繼續(xù)攔截。但這個做法有點代價,首先shouldOverrideUrlLoading不能阻塞調(diào)用,這樣就影響正常使用了。如果做成異步的就需要新增一個dns查詢服務(wù),這個完全看xx產(chǎn)品經(jīng)理的意思。可能原來不會考慮,這篇文章發(fā)出去了用的人多了估計會考慮了。。。請給開發(fā)者留一條活路。

寫到這里我猜你肯定在想,程序活著這個條件是個硬傷,雖然多邁出了一步但還是受限不少。于是又引出了一個古老的話題:如何程序保活。這不是本篇文章的范疇,我也不推薦你去研究和花費心思,這也不是一個正確的方向。
最后給一個提示:你的公司有沒有兄弟產(chǎn)品,亦或是有沒有使用一個公共的SDK呢?

更多細節(jié)請參考我給的例子,點擊這里鏈接可以參看。有任何問題歡迎留言討論,喜歡就點贊,請支持原創(chuàng)。

更多文章請關(guān)注微信公眾號:安卓之美

總結(jié)

以上是生活随笔為你收集整理的突破Android微信微博浏览器限制直接拉起应的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。