open-app.js 3.11 KB
/**
 * 移动端尝试打开 app
 */
const qs = require('yoho-qs');
const cookie = require('yoho-cookie');

const u = navigator.userAgent;
const isFromYOHO = /m\.yohobuy\.com/i.test(document.referrer);
const isApp = /yohobuy/i.test(u) ||
        !!window.yohoInterface ||
        /app_version=/i.test(location.search) ||
        /openrefer=/i.test(location.search);

const isiOS = /(iPhone|iPad|iPod|iOS)/i.test(u); // ios终端
const isAndroid = /Android/i.test(u); // android终端
const isWechatDevtool = /wechatdevtools/i.test(u); // 微信开发者工具

// const iOSVersion = parseInt((u.match(/OS (\d+)_(\d+)_?(\d+)?/i) || [])[1], 10); // iOS 版本

const nodownload = document.getElementById('no-download'); // 页面不需要下载
const urlBlacklist = ['m.yohobuy.com/brands', 'm.yohobuy.com/passport'];
const blackCheck = urlBlacklist.some(function(url) {
    return new RegExp(url, 'i').test(location.href);
});

/**
 * 从referrer中获取信息,设定mktcode
 */
const channelMap = {
    'baidu.com': 100000000000055,
    'so.com': 100000000000049,
    'sogou.com': 100000000000053,
    'bing.com': 100000000000057,
    'm.sm.cn': 100000000000059,
    'google.com': 100000000000061
};

const getMktcBySeo = function() {
    let mktc,
        rf = document.referrer;

    for (let domain in channelMap) {
        if (rf.indexOf(domain) > -1) {
            mktc = channelMap[domain];
            break;
        }
    }
    return mktc;
};

const canOpenApp = () => {
    if (isWechatDevtool || isApp || isFromYOHO || nodownload || qs.nodownload || qs.no_openapp || blackCheck) {
        return false;
    }
    return isAndroid || isiOS || qs.openapp;
};

const getAppPath = () => {
    let appPath = document.getElementById('main-wrap').dataset.apppath || 'yohobuy://yohobuy.com/goapp?openby:yohobuy={"action":"go.home","params":{"gender":"1","channel":"2"}}';
    let ct = qs.mkt_code || qs.union_type || getMktcBySeo() || '100000000000349';
    let clientId = cookie.get('_yasvd');

    if (ct) {
        appPath = appPath.replace('goapp?', 'goapp?ct=' + ct + '&');
    }

    if (clientId) {
        appPath = appPath.replace('goapp?', 'goapp?client_id=' + clientId + '&');
    }

    return appPath;
};


if (canOpenApp()) {
    setTimeout(function() {
        if (window._yas && window._yas.sendCustomInfo) {
            window._yas.sendCustomInfo({
                op: 'YB_H5_AWAKE_APP',
                param: JSON.stringify({
                    PAGE_NAME: encodeURIComponent(document.title),
                    PAGE_URL: encodeURIComponent(location.href)
                })
            }, true);
        }

        if (window._hmt && window._hmt.push) {
            window._hmt.push(['_trackEvent', 'H5唤起APP', isiOS ? 'Apple' : 'Android', document.title, location.href]);
        }
    }, 1000);

    setTimeout(function() {
        let appPath = getAppPath();
        let ifr;

        if (isiOS) {
            window.location.href = appPath;
        } else {
            ifr = document.createElement('iframe');
            ifr.src = appPath;
            ifr.style.display = 'none';
            document.body.appendChild(ifr);
        }
    }, 2000);
}