// 本文来自: https://github.com/AlanZhang001/H5CallUpNative (具体详情信息请转此处)<script src="https://code.jquery.com/jquery-1.10.2.js"></script> 或 // var extend = require('extend');<script> var browser = { isAndroid: function () { return navigator.userAgent.match(/Android/i) ? true : false; }, isMobileQQ: function () { var ua = navigator.userAgent; return /(iPad|iPhone|iPod).*? (IPad)?QQ\/([\d\.]+)/.test(ua) || /\bV1_AND_SQI?_([\d\.]+)(.*? QQ\/([\d\.]+))?/ .test(ua); }, isIOS: function () { return navigator.userAgent.match(/iPhone|iPad|iPod/i) ? true : false; }, isWx: function () { return navigator.userAgent.match(/micromessenger/i) ? true : false; }, isChrome: function () { return (navigator.userAgent.match(/Chrome\/([\d.]+)/) || navigator.userAgent.match(/CriOS\/([\d.]+)/)) ? true : false; }, isBaidu: function () { return navigator.userAgent.match(/baidubrowser/i) ? true : false; }, isUC: function () { return navigator.userAgent.match(/UCBrowser/i) ? true : false; }, isSafari: function () { return navigator.userAgent.match(/safari/i) ? true : false; }, isQQBrowser: function () { return navigator.userAgent.match(/MQQBrowser/i) ? true : false; }, isWeibo: function () { return navigator.userAgent.match(/weibo/i) ? true : false; }, isAlipay: function () { return navigator.userAgent.match(/Alipay/i) ? true : false; } }; /** * [defautlConfig APP默认配置] */ var defautlConfig = { // 协议头 PROTOCAL: '', // 主页 HOME: '', // 唤起失败时的跳转链接 FAILBACK: { ANDROID: '', IOS: '' }, // Android apk 相关信息 APK_INFO: { PKG: '', CATEGORY: 'android.intent.category.DEFAULT', ACTION: 'android.intent.action.VIEW' }, // 唤起超时时间,超时则跳转到下载页面 LOAD_WAITING: 3000 }; /** * [util 创建A标签] */ var util = { hiddenStyle: 'display:none;width:0px;height:0px;', /** * [createIfr 创建iframe并隐藏,未加入document中] */ createIfr: function (src) { var iframe = document.createElement('iframe'); iframe.className = 'call_up_iframe'; iframe.src = src; iframe.style.cssText = this.hiddenStyle; return iframe; }, /** * [createALink 创建A标签并隐藏,未加入document中] */ createALink: function (href) { var aLink = document.createElement("a"); aLink.className = 'call_up_a_link'; aLink.href = href; aLink.style.cssText = this.hiddenStyle; return aLink; }, /** * [isDocHidden docuement是否已隐藏] */ isDocHidden: function () { return document.hidden || document.webkitHidden || document.msHidden; }, /** * [visibilityChangeName 兼容visibilityChange] */ visibilityChangeName: function () { var visibilityChange; if (typeof document.hidden !== 'undefined') { visibilityChange = 'visibilitychange'; } else if (typeof document.msHidden !== 'undefined') { visibilityChange = 'msvisibilitychange'; } else if (typeof document.webkitHidden !== 'undefined') { visibilityChange = 'webkitvisibilitychange'; }; return visibilityChange; } }; function Callup(config) { if (!config) { return; }; // 合并参数 this.appConfig = $.extend({}, defautlConfig, config, true); }; $.extend(Callup.prototype, { /** * [generateSchema 根据不同的场景及UA生成最终应用的schema] */ generateSchema: function (schemaURI) { var schemaStr = ''; // 如果未定义schema,则根据当前路径来映射 if (!schemaURI) { schemaStr = this.appConfig.HOME; // 在schema省略时,可以根据当前页面的url,设置不同的默认值 } else { schemaStr = schemaURI; }; // 如果是安卓chrome浏览器,则通过intent方式打开 // if (browser.isChrome() && browser.isAndroid() && browser.isUC() === false && browser.isQQBrowser() === // false) { // schemaStr = 'intent://' + schemaStr + '#Intent;' + // 'scheme=' + this.appConfig.PROTOCAL + ';' + // 'package=' + this.appConfig.APK_INFO.PKG + ';' + // 'category=' + this.appConfig.APK_INFO.CATEGORY + ';' + // 'action=' + this.appConfig.APK_INFO.ACTION + ';' + // 'S.browser_fallback_url=' + encodeURIComponent(this.appConfig.FAILBACK.ANDROID) + ';' + // 'end'; // } else { // schemaStr = this.appConfig.PROTOCAL + '://' + schemaStr; // }; //直接打开 schemaStr = this.appConfig.PROTOCAL + '://' + schemaStr; return schemaStr; }, /** * [loadSchema 加载schema,打开app] */ loadSchema: function (config) { // 需要使用的schema var schemaUrl = this.generateSchema(config.targetURI); var body = document.body; // Android 微信不支持schema唤醒,必须提前加入腾讯的白名单 // 百度浏览器会拦截schema,所以直接跳下载页 // QQ,weobo 内也直接跳转下载页 if (browser.isWx() || browser.isBaidu() || (browser.isIOS() && browser.isMobileQQ()) || (browser.isIOS() && browser.isAlipay()) || browser.isWeibo()) { if (browser.isAndroid()) { window.location.href = this.appConfig.FAILBACK.ANDROID; } else if (browser.isIOS()) { window.location.href = this.appConfig.FAILBACK.IOS; }; // Android chrome 不支持iframe 方式唤醒 // 适用:chrome,leibao,mibrowser,opera,360,UC,qq浏览器 } else if (browser.isChrome() && browser.isAndroid() || browser.isUC() || browser.isSafari() || browser.isQQBrowser()) { var aLink = util.createALink(schemaUrl); // 创建 body.appendChild(aLink); aLink.click(); // 其他浏览器 // 适用:sogou,firefox,mobileQQ } else { var iframe = util.createIfr(schemaUrl); body.appendChild(iframe); }; this.checkLoadStatus(config.success, config.fail); }, /** * [checkLoadStatus 通过setTimeout来检查App是否启动] */ checkLoadStatus: function (success, fail) { var start = new Date().getTime(); var that = this; var loadTimer = setTimeout(function () { if (util.isDocHidden()) { return; }; // 如果app启动,浏览器最小化进入后台,则计时器存在推迟或者变慢的问题 // 那么代码执行到此处时,时间间隔必然大于设置的定时时间 if (Date.now() - start > that.appConfig.LOAD_WAITING + 200) { //console.log('come back from app') // 如果浏览器未因为app启动进入后台,则定时器会准时执行,故应该跳转到下载页 } else { if (fail) { fail(); } else { window.location.href = browser.isIOS() ? that.appConfig.FAILBACK.IOS : that.appConfig.FAILBACK.ANDROID; }; }; }, this.appConfig.LOAD_WAITING); // 当本地app被唤起,则页面会隐藏掉,就会触发pagehide与visibilitychange事件 // 在部分浏览器中可行,网上提供方案,作hack处理 document.addEventListener(util.visibilityChangeName(), function () { if (util.isDocHidden) { clearTimeout(loadTimer); } }, false); // pagehide 必须绑定到window window.addEventListener('pagehide', function () { clearTimeout(loadTimer); success && success(); }, false); } }); /*globals Callup*/ var callup = new Callup({ // 协议头 PROTOCAL: 'shareits', // 主页 HOME: 'game', // 唤起失败时的跳转链接 FAILBACK: { ANDROID: 'https://play.google.com/store/apps/details?id=com.lenovo.anyshare.gps&referrer=utm_source%3D%26utm_medium%3DSHAREitinvite%26utm_campaign%3Dinvite', IOS: '' }, // Android apk 相关信息 APK_INFO: { PKG: 'com.lenovo.anyshare', CATEGORY: 'android.intent.category.DEFAULT', ACTION: 'android.intent.action.VIEW' }, // 唤起超时时间,超时则跳转到下载页面 LOAD_WAITING: 2000 }); function action() { //encodeURIComponent()编码之后不会跳转到目的地,这里未使用编码 // var url = encodeURIComponent('gameshare/8?inner_func_type=28&portal=gameshare&main_tab_name=navi_game&channel_id=game'); var url = 'gameshare/8?inner_func_type=28&portal=gameshare&main_tab_name=navi_game&channel_id=game'; callup.loadSchema({ // 通过NN打开某个链接 targetURI: url, success:function(){ }, fail: function(){ window.location.href = 'https://play.google.com/store/apps/details?id=com.lenovo.anyshare.gps&referrer=utm_source%3D%26utm_medium%3DSHAREitinvite%26utm_campaign%3Dinvite'; } }); };window.onload = function() { // action();};</script>