html 5ページでローカルappを開き、ダウンロードページをジャンプするソリューションがなければ
38874 ワード
需要効果
プロモーションページでユーザーが製品の詳細をクリックすると、このユーザーの携帯電話に自分のアプリがインストールされているかどうかを判断します.携帯電話内のアプリを直接自動的に開くアプリがインストールされている場合、なければアプリのダウンロードページをジャンプします.
テクノロジー実装
直接windowを使います.location.hrefの方法解決、この方法の前提条件は自分のappの対応するオープンプロトコルを知る必要があることで、例えばアプリを貼り付けて、プロトコルは:com.baidu.tieba://(下は掲示板を例に)
AndroidとiOSではダウンロードパッケージやプロトコルが異なるので、ユーザーのシステムタイプを判断する必要があります
でもwindowでlocation.hrefメソッドでは、携帯電話にターゲットアプリケーションがある場合、アプリケーションは開くが、ブラウザもダウンロードページにジャンプし、微信ブラウザはサードパーティのappを開く、ダウンロードすることをサポートしていないため、微信活動ページを作るcoderたちは、そのニーズを実現する必要がある場合に考慮することが多い.京東針のこの問題に対する解決策.次のように
これは煩雑に見えますが、実際に理解しなければなりませんが、比較的包括的な解決策です.
上記の方法に対して、すべてコードロジックの実装で、いくつかの未知の問題が存在するか、コードが煩雑で使いにくい可能性があります.以下、比較的簡単な方法を説明します.
アプリベースの実装ページでローカルappを開き、ダウンロードページをジャンプしない場合のソリューション
以上の方法コードは以下の理解に転载して、ありがとうございます解决方法【JS】ページをクリックしてappをインストールして开くかどうかを判断して、さもなくばジャンプしてダウンロードする方法京东はhtml 5ページの中で地元のappの解决方案を开いてみんなも私のブログにアクセスすることができて、何か伝言があっても、お互いに友达になることができます
プロモーションページでユーザーが製品の詳細をクリックすると、このユーザーの携帯電話に自分のアプリがインストールされているかどうかを判断します.携帯電話内のアプリを直接自動的に開くアプリがインストールされている場合、なければアプリのダウンロードページをジャンプします.
テクノロジー実装
直接windowを使います.location.hrefの方法解決、この方法の前提条件は自分のappの対応するオープンプロトコルを知る必要があることで、例えばアプリを貼り付けて、プロトコルは:com.baidu.tieba://(下は掲示板を例に)
<a href="javascript:;" id="openApp"> a>
<script type="text/javascript">
document.getElementById('openApp').onclick = function(e){
window.location.href = "com.baidu.tieba://";
window.setTimeout(function(){
window.location.href = "https://itunes.apple.com/cn/app/id477927812";// app , app
},2000)
};
script>
AndroidとiOSではダウンロードパッケージやプロトコルが異なるので、ユーザーのシステムタイプを判断する必要があります
<body>
<a href="javascript:;" id="openApp"> a>
body>
<script type="text/javascript">
document.getElementById('openApp').onclick = function(e){
if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i))
{
window.location.href = "com.baidu.tieba://";//ios app
window.setTimeout(function() {
window.location.href = "https://itunes.apple.com/cn/app/id477927812";
}, 2000)
}
if(navigator.userAgent.match(/android/i))
{
window.location.href = "com.baidu.tieba://app";//android app
window.setTimeout(function() {
window.location.href = "https://****.apk";//android
}, 2000)
}
};
script>
でもwindowでlocation.hrefメソッドでは、携帯電話にターゲットアプリケーションがある場合、アプリケーションは開くが、ブラウザもダウンロードページにジャンプし、微信ブラウザはサードパーティのappを開く、ダウンロードすることをサポートしていないため、微信活動ページを作るcoderたちは、そのニーズを実現する必要がある場合に考慮することが多い.京東針のこの問題に対する解決策.次のように
(function(){
//
var Navigator = navigator.userAgent;
var ifChrome = Navigator.match(/Chrome/i) != null && Navigator.match(/Version\/\d+\.\d+(\.\d+)?\sChrome\//i) == null ? true : false;
var ifAndroid = (Navigator.match(/(Android);?[\s\/]+([\d.]+)?/)) ? true : false;
var ifiPad = (Navigator.match(/(iPad).*OS\s([\d_]+)/)) ? true : false;
var ifiPhone = (!ifiPad && Navigator.match(/(iPhone\sOS)\s([\d_]+)/)) ? true : false;
var ifSafari = (ifiPhone || ifiPad) && Navigator.match(/Safari/);
var version = 0;
ifSafari && (version = Navigator.match(/Version\/([\d\.]+)/));
version = parseFloat(version[1], 10);
//
var ifWeixin = navigator.userAgent.indexOf("MicroMessenger") >= 0; // weixin
var j = false;
var iframe = "plugIn_downloadAppPlugIn_loadIframe";
var t = false;
var i = 0;
var B = {};
var b = {};
var selector = null;
var Hquery = {};
// js zepto jquery
var Query = window.Zepto || window.jQuery ? true : false;
var g = [];
// html5 localStorage
var v = window.localStorage ? true : false;
var o = "mdownloadAppPlugInskip";
var p = null;
function m() { // :2016-5-18 var M = new Date(); var N = M.getFullYear(); var O = M.getMonth() + 1; var L = M.getDate(); strDate = N + "-" + O + "-" + L; return strDate }
//
function r() { // weixin api WeixinJSBridge.invoke("getInstallState", { packageName: "com.jingdong.app.mall", packageUrl: "openApp.jdMobile://" }, function(M) { var N = M.err_msg, L = 0; if (N.indexOf("get_install_state:yes") > -1) { j = true } }) }
// js dom
function bind(dom, event, fun) { // bind event if (Query) { selector("#" + dom).bind(event, fun) } else { selector("#" + dom).addEventListener(event, fun, !1) } }
function z(L) { var M = (L || "mGen") + (++i); return M }
//
if (ifWeixin) { // if navigitor is weixin if (window.WeixinJSBridge && WeixinJSBridge.invoke) { r() } else { document.addEventListener("WeixinJSBridgeReady", r, !1) } }
// js
if (Query) { selector = window.$; Hquery = window.$ } else { selector = function(obj) { if (typeof obj == "object") { return obj } return document.querySelector(obj); }; if (!window.$) { window.$ = Hquery = selector } else { Hquery = window.$ } }
window.onblur = function() { for (var L = 0; L < g.length; L++) { clearTimeout(g[L]) } }; // cookie。 function e(N) { var M = document.cookie.indexOf(N + "="); if (M == -1) { return "" } M = M + N.length + 1; var L = document.cookie.indexOf(";", M); if (L == -1) { L = document.cookie.length } return document.cookie.substring(M, L) } // cookie function l(N, P, L, Q, O) { var R = N + "=" + escape(P); if (L != "") { var M = new Date(); M.setTime(M.getTime() + L * 24 * 3600 * 1000); R += ";expires=" + M.toGMTString() } if (Q != "") { R += ";path=" + Q } if (O != "") { R += ";domain=" + O } document.cookie = R } // function F(L) { var url = { downAppURl: "http://h5.m.jd.com/active/download/download.html?channel=jd-m", downAppIos: "http://union.m.jd.com/download/go.action?to=http%3A%2F%2Fitunes.apple.com%2Fcn%2Fapp%2Fid414245413&client=apple&unionId=12532&subunionId=m-top&key=e4dd45c0f480d8a08c4621b4fff5de74", downWeixin: "http://a.app.qq.com/o/simple.jsp?pkgname=com.jingdong.app.mall&g_f=991850", downIpad: "https://itunes.apple.com/cn/app/jing-dong-hd/id434374726?mt=8", inteneUrl: "openApp.jdMobile://360buy?type=1", inteneUrlParams: null, openAppBtnId: "", closePanelBtnId: "", closePanelId: "", closeCallblack: null, closeCallblackSource: null, cookieFlag: null, noRecord: false, sourceType: "JSHOP_SOURCE_TYPE", sourceValue: "JSHOP_SOURCE_VALUE", openAppEventId: "MDownLoadFloat_OpenNow", closePanelEventId: "MDownLoadFloat_Close" }; if (L) { for (var M in L) { if (M && L[M]) { url[M] = L[M] } } } return url } // 。 。 function openApp(N, L) { // openApp var R = h(N); // url var O = null; if (ifWeixin) { // var M = null; if (j) { M = R } else { M = N.downWeixin } location.href = M; // location.href return } if (ifiPad) { // ipad O = N.downIpad } else { if (ifiPhone) { // iphone O = N.downAppIos } else { O = N.downAppURl } } if (ifChrome) { // chrome if (ifAndroid) { // var Q = R; R = y(Q); // 50 setTimeout(function() { window.location.href = R }, 50) } } if (ifSafari && version >= 9) { // safari 9 setTimeout(function() { // settimeout var S = document.createElement("a"); // a S.setAttribute("href", R), S.style.display = "none", document.body.appendChild(S); var T = document.createEvent("HTMLEvents"); // Event , 。 T.initEvent("click", !1, !1)// , S.dispatchEvent(T) // }, 0) } else { document.querySelector("#" + iframe).src = R // iframe src } var P = Date.now(); setTimeout(function() { if (L) { var S = setTimeout(function() { x(P, O) }, 1500); g.push(S) } }, 100) } // x function x(N, downUrl) { var L = Date.now(); if (N && (L - N) < (1500 + 200)) { window.location.href = downUrl } } function h(N) { var V = []; var P = N.inteneUrlParams; var T = { category: "jump", des: "productDetail" }; if (N.sourceType && N.sourceValue) { T.sourceType = N.sourceType; T.sourceValue = N.sourceValue; if (P && !P.sourceType && !P.sourceValue) { P.sourceType = N.sourceType; P.sourceValue = N.sourceValue } } if (P) { for (var U in P) { if (U && P[U]) { V.push('"' + U + '":"' + P[U] + '"') } } } else { for (var U in T) { if (U && T[U]) { V.push('"' + U + '":"' + T[U] + '"') } } } try { var Q = MPing.EventSeries.getSeries(); if (Q) { var W = JSON.parse(Q); W.jdv = encodeURIComponent(e("__jdv")); W.unpl = encodeURIComponent(e("unpl")); W.mt_xid = encodeURIComponent(e("mt_xid")); W.mt_subsite = encodeURIComponent(e("mt_subsite")) } var S = { mt_subsite: encodeURIComponent(e("mt_subsite")), __jdv: encodeURIComponent(e("__jdv")), unpl: encodeURIComponent(e("unpl")), __jda: encodeURIComponent(e("__jda")) }; Q = JSON.stringify(W); V.push('"m_param":' + Q); V.push('"SE":' + JSON.stringify(S)) } catch (R) { V.push('"m_param":null') } var M = "{" + V.join(",") + "}"; var O = N.inteneUrl.split("?"); var L = null; if (O.length == 2) { L = O[0] + "?" + O[1] + "¶ms=" + M } else { L = O[0] + "?params=" + M } return L } function y(L) { return "intent://m.jd.com/#Intent;scheme=" + L + ";package=com.jingdong.app.mall;end" } function n(L) { if (L.openAppBtnId) { B[L.openAppBtnId] = L; G(L.openAppBtnId, L.openAppEventId); bind(L.openAppBtnId, "click", function() { var P = this.getAttribute("id"); var M = B[P]; if (!t) { var N = document.createElement("iframe"); N.id = iframe; document.body.appendChild(N); document.getElementById(iframe).style.display = "none"; document.getElementById(iframe).style.width = "0px"; document.getElementById(iframe).style.height = "0px"; t = true } var O = M.cookieFlag ? "downloadAppPlugIn_downCloseDate_" + M.cookieFlag : "downloadAppPlugIn_downCloseDate"; l(O, Date.now() + "_2592000000", 60, "/", "m.jd.com"); l(O, Date.now() + "_2592000000", 60, "/", "m.jd.hk"); openApp(M, true) }) } } function D(M) { if (M.closePanelBtnId && M.closePanelId) { B[M.closePanelBtnId] = M; G(M.closePanelBtnId, M.closePanelEventId); var Q = M.cookieFlag ? "downloadAppPlugIn_downCloseDate_" + M.cookieFlag : "downloadAppPlugIn_downCloseDate"; var O = e(Q); var P = null; if (O) { P = O.split("_"); if (P.length == 2) { P[0] = parseInt(P[0], 10); P[1] = parseInt(P[1], 10) } else { P = null } } var L = Date.now(); if (Html5Plus() || (!M.noRecord && P && P.length == 2 && (L - P[0]) < P[1])) { document.querySelector("#" + M.closePanelId).style.display = "none"; if (M.closeCallblack) { var N = M.closeCallblackSource ? M.closeCallblackSource : null; M.closeCallblack.call(N) } return } else { document.querySelector("#" + M.closePanelId).style.display = "block" } bind(M.closePanelBtnId, "click", function() { var U = this.getAttribute("id"); var R = B[U]; var T = R.cookieFlag ? "downloadAppPlugIn_downCloseDate_" + R.cookieFlag : "downloadAppPlugIn_downCloseDate"; if (!R.noRecord) { l(T, Date.now() + "_259200000", 60, "/", "m.jd.com"); l(T, Date.now() + "_259200000", 60, "/", "m.jd.hk") } document.querySelector("#" + R.closePanelId).style.display = "none"; if (R.closeCallblack) { var S = R.closeCallblackSource ? R.closeCallblackSource : null; R.closeCallblack.call(S) } }) } } function Html5Plus() { // htmlplus if (Navigator.indexOf("Html5Plus") >= 0) { return true } else { return false } } function G(P, M) { try { var O = document.getElementById(P); var L = O.className; if (L) { L = L + " J_ping" } else { L = "J_ping" } O.className = L; O.setAttribute("report-eventid", M) } catch (N) {} } function C(L) { var M = F(L); n(M); D(M) } Hquery.downloadAppPlugIn = C; Hquery.downloadAppPlugInOpenApp = function(L) { var M = F(L); openApp(M); } });
これは煩雑に見えますが、実際に理解しなければなりませんが、比較的包括的な解決策です.
上記の方法に対して、すべてコードロジックの実装で、いくつかの未知の問題が存在するか、コードが煩雑で使いにくい可能性があります.以下、比較的簡単な方法を説明します.
アプリベースの実装ページでローカルappを開き、ダウンロードページをジャンプしない場合のソリューション
以上の方法コードは以下の理解に転载して、ありがとうございます解决方法【JS】ページをクリックしてappをインストールして开くかどうかを判断して、さもなくばジャンプしてダウンロードする方法京东はhtml 5ページの中で地元のappの解决方案を开いてみんなも私のブログにアクセスすることができて、何か伝言があっても、お互いに友达になることができます