open-app.js 2.42 KB
const getAppPath = () => {
  let appPath = document.getElementById('main-wrap').dataset.apppath || 'yohobuy://yohobuy.com/goapp?openby:yohobuy={"action":"go.home","params":{"gender":"1","channel":"2"}}';

  return appPath;
};

const u = navigator.userAgent;
const isFromYOHO = /m\.yohobuy\.com/i.test(document.referrer);
const isApp = /yoho/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 nodownload = document.getElementById('no-download'); // 页面不需要下载

const getIOSVersion = () => {
  const verion = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);

  return verion ? parseInt(verion[1], 10) : 0;
};
const ua = navigator.userAgent;
const isOriginalChrome = /chrome\/[\d.]+ Mobile Safari\/[\d.]+/i.test(ua) &&
  isAndroid &&
  ua.indexOf('Version') < 0;

const getFallUrl = (schemeUrl) => {
  const appPath = (schemeUrl || '').replace('yohobuy://yohobuy.com/goapp?', '') || 'openby:yohobuy={"action":"go.home","params":{"gender":"1","channel":"2"}}';

  return `https://union.yoho.cn/union/app-downloads.html?${appPath}`;
};

const checkOpenFall = (url, callFunc, noFall) => {
  callFunc();

  const fallUrl = getFallUrl(url);

  if (noFall) {
    return;
  }

  window.location.href = fallUrl;
};

const callIframe = (url, noFall) => {
  checkOpenFall(url, () => {
    window.location.href = url;
  }, noFall);
};

const callUrl = (url, noFall) => {
  checkOpenFall(url, () => {
  }, noFall);
};

const callA = (url, noFall) => {
  checkOpenFall(url, () => {
    const ca = document.createElement('a');

    ca.setAttribute('href', url);
    ca.style.display = 'none';
    document.body.appendChild(ca);

    ca.click();
  }, noFall);
};

const toAppPage = (appUrl, noFall) => {
  if (isOriginalChrome) {
    callA(appUrl, noFall);
  } else if (isiOS) {
    if (getIOSVersion() < 9) {
      callIframe(appUrl, noFall);
    } else {
      callUrl(appUrl, noFall);
    }
  } else {
    callIframe(appUrl, noFall);
  }
};

const canOpenApp = () => {
  if (isWechatDevtool || isApp || isFromYOHO || nodownload) {
    return false;
  }
  return isAndroid || isiOS;
};

export default () => {
  if (canOpenApp()) {
    let appPath = getAppPath();

    toAppPage(appPath, false);
  }
};