编辑代码

const AppNameMap = {
  elmc: 'eleme',
  tb: 'taobao',
  ap: 'alipay',
  kb: 'koubei',
  micromessenger: 'wechat',
};

const UNKNOWN = 'unknown';


const getAppInfo = () => {
  /* 支持的应用环境检测集合 (均转换成小写) strat */
  // 非《阿里应用》的app userAgent 集合
  const apps = ['micromessenger', 'weibo'];
  // 国内常用浏览器 (360 浏览器更新版本, 伪装成 IE 或者 Chrome 浏览器, 不对其做特殊校验)
  const customBrowsers = ['ucbrowser', 'qqbrowser', 'sogou', 'baidu', 'liebaofast'];
  // 较通用浏览器
  const originalBrowsers = ['msie', 'firefox', 'opera', 'safari', 'chrome'];
  /* 支持的应用环境检测集合 (均转换成小写) end */

  const ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1';
  let platform = UNKNOWN; // 所在的平台环境。默认值为 unknown
  let appName = UNKNOWN; // 所在应用名称。默认值为 unknown
  let appVersion = UNKNOWN; // 所在应用的版本。默认值为 unknown

  /* 平台判断, 目前有 android, ios, pc */
  if (ua.match(/(android|adr)/)) {
    // android 手机, 平板, 电视
    platform = 'android';
  } else if (ua.match(/\(i[^;]+;( u;)? cpu.+mac os x/gi)) {
    // iPhone, iPad, iPod
    platform = 'ios';
  } else if (ua.match(/(windows|linux|os x)/gi)) {
    // windows, linux, os x
    platform = 'pc';
  }

  /* 应用判断 */
  // 阿里应用判断
  const AliApp = ua.match(/AliApp\(([^\/]+)\/([\d\.\_]+)\)/i);
  // 匹配应用名称 生成类似 /(windows|linux|os x)/ 的正则
  const processMatchName = (nameList) => {
    return ua.match(new RegExp(`(${nameList.join('|')})`));
  };

  console.log(processMatchName(originalBrowsers))

  if (AliApp) {
    // 阿里应用
    appName = AliApp[1];
    appVersion = AliApp[2];
  } else if (
    processMatchName(apps)
    || processMatchName(customBrowsers)
    || processMatchName(originalBrowsers)
  ) {
    // 非阿里应用, 先判断应用名称, 在判别应用版本。避免一次性匹配失败出现应用名称和应用版本均为 unknown 的情况
    appName = RegExp.$1;
    ua.match(new RegExp(`${appName}[\/:\\s\\(]([\\d.]+)`, 'gi')) && (appVersion = RegExp.$1);
  }

  return { appName, appVersion, platform };
};
console.log(getAppInfo())