麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > HTML5 > 正文

html5喚醒APP小記

2024-09-05 07:22:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近遇到一個(gè)需求,需要在從APP分享出去的H5頁(yè)面中,帶有一個(gè)立即打開(kāi)的按鈕,如果本地安裝了app,那么就直接喚起本地的app,如果沒(méi)有安裝,則跳轉(zhuǎn)到下載。這是一個(gè)很正常的推廣和導(dǎo)流量的策略。前端小白從來(lái)沒(méi)有做過(guò)這個(gè)需求,只能開(kāi)始哼唧哼唧地開(kāi)啟自己的度娘和谷歌之旅。

經(jīng)過(guò)一段時(shí)間的探索之旅發(fā)現(xiàn)里面的學(xué)問(wèn)很多,要做一個(gè)兼容性很好的方案,就需要考慮各種情況,在不同的情況適配不同的方案,比方說(shuō)用戶是在手機(jī)瀏覽器打開(kāi)還是微信中打開(kāi),或者是在pc中打開(kāi),universal騰訊應(yīng)用寶直接打開(kāi) APP link是否被關(guān)閉等,這就使代碼實(shí)現(xiàn)變得復(fù)雜,且容易出錯(cuò),且還有安卓平臺(tái)機(jī)型眾多、瀏覽器眾多等導(dǎo)致的兼容問(wèn)題。由于時(shí)間有限,這次主要先介紹一個(gè)比較普遍的使用URL Scheme進(jìn)行App跳轉(zhuǎn)的方法。

URL Scheme —— 喚端媒介

來(lái)源

一般來(lái)說(shuō),我們使用的智能設(shè)備上有許多我們的個(gè)人信息。比如:聯(lián)系方式、銀行卡/信用卡信息、支付寶/Paypal/各大商城的賬戶密碼、照片甚至行程與位置信息等。

如果說(shuō),你設(shè)備上的每一個(gè)應(yīng)用,不管是官方的還是你從任何商城安裝的應(yīng)用都可以隨意地獲取這些信息,那么你輕則收到騷擾信息和郵件、重則后果不堪設(shè)想。如何讓這些信息不被其它應(yīng)用隨意使用,或者說(shuō),如何讓這些信息僅在設(shè)備所有者本人知情并允許的情況下被使用,是所有智能設(shè)備與操作系統(tǒng)所要在乎的核心安全問(wèn)題。針對(duì)這個(gè)問(wèn)題,蘋果使用了名為「沙盒」的機(jī)制:應(yīng)用只能訪問(wèn)它聲明可能訪問(wèn)的資源。一切提交到 App Store 的應(yīng)用都必須遵守這個(gè)機(jī)制。

在安全方面沙盒是個(gè)很好的解決辦法,但是有些矯枉過(guò)正。敏感的個(gè)人信息我們不愿意透露,卻不代表所有的信息我們都不想與其它應(yīng)用共享。因此,我們急需要一個(gè)輔助工具來(lái)幫助我們實(shí)現(xiàn)應(yīng)用通信, URL Schemes 就是這個(gè)工具。

URL Schemes是什么

[scheme]://[host]/[path]?[query]

我們拿 https://www.baidu.com 來(lái)舉例,scheme 自然就是 https 了,后面拼接的是傳遞的參數(shù)。URL Schemes 沒(méi)有特別嚴(yán)格的規(guī)范,所以后面參數(shù)的具體定義是app開(kāi)發(fā)者去自定義。

就像給服務(wù)器資源分配一個(gè) URL,以便我們?nèi)ピL問(wèn)它一樣,我們同樣也可以給手機(jī)APP分配一個(gè)特殊格式的 URL,用來(lái)訪問(wèn)這個(gè)APP或者這個(gè)APP中的某個(gè)功能(來(lái)實(shí)現(xiàn)通信)。APP得有一個(gè)標(biāo)識(shí),好讓我們可以定位到它,它就是 URL 的 Scheme 部分。

但是,兩者還有幾個(gè)重要的區(qū)別:

  • 所有網(wǎng)頁(yè)都一定有網(wǎng)址,不管是首頁(yè)還是子頁(yè)。但未必所有的應(yīng)用都有自己的 URL Schemes,更不是每個(gè)應(yīng)用的每個(gè)功能都有相應(yīng)的 URL Schemes。幾乎沒(méi)有所有功能都有對(duì)應(yīng) URL 的應(yīng)用。一個(gè) App 是否支持 URL Schemes 要看那個(gè) App 的作者是否在自己的作品里添加了 URL Schemes 相關(guān)的代碼。
  • 一個(gè)網(wǎng)址只對(duì)應(yīng)一個(gè)網(wǎng)頁(yè),但并非每個(gè) URL Schemes 都只對(duì)應(yīng)一款應(yīng)用。這點(diǎn)是因?yàn)樘O果沒(méi)有對(duì) URL Schemes 有不允許重復(fù)的硬性要求,所以曾經(jīng)出現(xiàn)過(guò)有 App 使用支付寶的 URL Schemes 攔截支付帳號(hào)和密碼的事件。
  •  一般網(wǎng)頁(yè)的 URL 比較好預(yù)測(cè),而URL Scheme 因?yàn)闆](méi)有統(tǒng)一標(biāo)準(zhǔn),所以非常難猜,通過(guò)猜來(lái)獲取 應(yīng)用的 URL Schemes 是不現(xiàn)實(shí)的。

前面普及了一下URL Schemes的相關(guān)知識(shí),作為個(gè)前端開(kāi)發(fā)者,就不去深究其中的原理,都交給app開(kāi)發(fā)者吧。接下來(lái)開(kāi)始我們的正題。首先當(dāng)然是要客戶端提供App的Url Schemes。

用瀏覽器去打開(kāi)scheme

在瀏覽器中打開(kāi) scheme 就像打開(kāi)一個(gè)不同的http地址一樣。可以在一個(gè) a 標(biāo)簽中打開(kāi)。

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>打開(kāi)App</title></head><body><a href="luwei://" id="open">打開(kāi)應(yīng)用</a></body></html>

點(diǎn)擊上面的H5頁(yè)面中的鏈接將會(huì)嘗試喚醒對(duì)應(yīng)app,在一些瀏覽器中,可能會(huì)彈出一個(gè)提示框,詢問(wèn)用戶是否允許打開(kāi)應(yīng)用。

如果打開(kāi)的 scheme 在本地沒(méi)有對(duì)應(yīng)的 app,則點(diǎn)擊不會(huì)反應(yīng)。

當(dāng)然還可以使用 JavaScript 代碼打開(kāi),只需要添加相應(yīng)的事件觸發(fā)和處理即可。

在JavaScript代碼中打開(kāi)連接有以下幾種方式:

  • 新建一個(gè)隱藏的 iframe ,地址指向需要打開(kāi)的url
  • 使用 window.location 或者 window.location.href 刷新當(dāng)前頁(yè)面
  • 新建一個(gè)隱藏的 a 標(biāo)簽,地址指向打開(kāi)的url,并觸發(fā)打開(kāi)鏈接事件
  • 動(dòng)態(tài)創(chuàng)建一個(gè)script腳本,在這個(gè)腳本中新建一個(gè)a標(biāo)簽并打開(kāi)
// 打開(kāi)url的方式var urlOpen = {  // 在ios支持不好    'iframe' : function(url) {        var iframe = document.createElement('iframe');        iframe.style.display = 'none';        iframe.src = url;        document.body.appendChild(iframe);    },    'location' : function(url) {        window.location.href = url;    },    'href' : function(url) {        var a = document.createElement('a');        a.style.display = 'none';        a.href = url;        document.body.appendChild(a);        a.click();    },    'script' : function(url) {        var script = document.createElement('script');        script.setAttribute('type', 'test/javascript');        script.innerHTML = '(function(){' +            'var a = document.createElement("a");' +            'a.style.display = "none";' +            'a.href = "' + url.replace(/"/g, '//"') + '";' +            'document.body.appendChild(a);' +            'a.click();' +            '})()';        document.body.appendChild(script);    },    'open' : function(url) {        window.open(url);    }};

以上方法是只是解決了在已安裝App設(shè)備喚醒App的功能,并不能判斷是否已安裝App,沒(méi)有安裝即跳轉(zhuǎn)至下載鏈接。

瀏覽器判斷是否安裝應(yīng)用

在瀏覽器實(shí)際上是沒(méi)有能力判斷手機(jī)里是否安裝了某個(gè)App的,所以只能夠采取一種投機(jī)取巧的方式。

在JavaScript中判斷頁(yè)面是否進(jìn)入后臺(tái)來(lái)判斷打開(kāi)成功。Html5提供了下列事件和屬性可以利用:

  • pagehide : 頁(yè)面隱藏時(shí)觸發(fā)
  • visibilitychange : 頁(yè)面隱藏沒(méi)有在當(dāng)前顯示時(shí)觸發(fā)(切換tab也會(huì)觸發(fā)該事件)
  • document.hidden : 當(dāng)頁(yè)面隱藏時(shí),該值為true,顯示時(shí)為false

上面這些事件或者屬性并不是所有瀏覽器都支持。下面是一個(gè)給出為id為openBtn 的按鈕添加打開(kāi)scheme或者下載事件的例子,但對(duì)于Android 4.4版本以下則不支持

    var downloader,     scheme = 'luwei://',  // 需要打開(kāi)的app scheme 地址    iosDownload='http://xxx.com';  // 如果打開(kāi)scheme失效的app下載地址    andDownload = 'http://xxx.com';    var u = navigator.userAgent;    var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //g    var isIOS = !!u.match(//(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端// 給 id 為 openBtn 的按鈕添加點(diǎn)擊事件處理函數(shù)    document.getElementById('openBtn').onclick = function () {        window.location.href = scheme;  // 嘗試打開(kāi) scheme          // 設(shè)置3秒的定時(shí)下載任務(wù),3秒之后下載app        downloader = setTimeout(function(){            if(isAndroid) {                window.location.href = andDownload;            }            if(isIOS) {                window.location.href = iosDownload;            }                  }, 3000);    };     document.addEventListener('visibilitychange webkitvisibilitychange', function () {        // 如果頁(yè)面隱藏,推測(cè)打開(kāi)scheme成功,清除下載任務(wù)        if (document.hidden || document.webkitHidden) {            clearTimeout(downloader);        }    });    window.addEventListener('pagehide', function() {        clearTimeout(downloader);    });

沒(méi)有完美的方案

微信中無(wú)法喚醒App,需要“用瀏覽器打開(kāi)”是因?yàn)槲⑿艑?duì)所有的分享鏈接接做了scheme屏蔽,也就是說(shuō)分享連接中所有對(duì)于scheme的調(diào)用都被微信封掉了。有些app是能在微信打開(kāi)是因?yàn)槲⑿庞幸粋€(gè)白名單(有關(guān)系就是不錯(cuò)),對(duì)于在白名單中的分享鏈接是不會(huì)屏蔽掉scheme調(diào)用的。
本文只是小小地拋個(gè)磚,介紹了一種比較常用簡(jiǎn)單的方法去喚醒a(bǔ)pp,該方案兼容性不是特別好吧。要做出一個(gè)比較完美的方案還需要細(xì)細(xì)去鉆研,還需要不停地去搬磚~不說(shuō)了,搬磚去了~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久人人爽人人爽人人片av高请 | 久久精品无码一区二区日韩av | 一区二区三区精品国产 | 全黄裸片武则天一级第4季 偿还电影免费看 | 毛片免费观看视频 | 一区二区久久精品66国产精品 | 最近免费观看高清韩国日本大全 | 日本一区二区视频在线观看 | 少妇激情视频 | 午夜精品成人一区二区 | 色视频欧美 | 国产精品久久久久久久久久尿 | 久久久av亚洲男天堂 | 欧美a在线 | 日本黄色a视频 | 免费观看又色又爽又黄的崩锅 | 国内精品伊人久久 | 九九色在线观看 | 日韩午夜一区二区三区 | 激情综合视频 | 9191色| 精品亚洲午夜久久久久91 | 日本在线观看一区二区 | 欧洲色阁中文字幕 | 91亚洲精品一区二区福利 | 国产精品久久99精品毛片三a | 毛片免费视频观看 | 成人福利视频 | 国产精品久久77777 | 国产成人在线观看免费 | 亚洲一区成人在线 | 一级黄色免费观看视频 | 宅男噜噜噜66国产免费观看 | 日韩精品中文字幕一区 | 综合网天天射 | 久久九九热re6这里有精品 | 欧美一页 | 香蕉秀| 俄罗斯16一20sex牲色另类 | 欧美一级黄色片免费观看 | 久久国产精品成人免费网站 |