Source: browser.js

/**
 * 本模块提供浏览器检测相关方法。
 * @module browser
 */

// 默认获取浏览器 useragent
function getBrowserUA(ua) {
  if (!ua && typeof navigator !== 'undefined') {
    ua = navigator.userAgent;
  }
  return ua;
}

/**
 * 检查当前设备是否移动设备。
 * @author luoliquan
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @param {Object} [features] 浏览器特征。
 *   @param {string} [features.platform] 运行平台。
 *   @param {string} [features.maxTouchPoints] 最大触点数。
 * @return {boolean} 当前设备是否移动设备。
 * @example
 * isMobile(navigator.userAgent);
 * isMobile(navigator.userAgent, {
 *   platform: navigator.platform,
 *   maxTouchPoints: navigator.maxTouchPoints
 * });
 */
export function isMobile(ua, features) {
  ua = getBrowserUA(ua);
  let result = /mobile|android/i.test(ua) ||
    !/\b(Windows\sNT|Macintosh|Linux)\b/.test(ua);

  if (features && 'platform' in features) {
    result = result || [
      'Android', 'iPhone', 'iPad', 'iPod'
    ].indexOf(features.platform) !== -1;

    if ('maxTouchPoints' in features) {
      result = result || (
        features.platform === 'MacIntel' && features.maxTouchPoints > 1
      );
    }
  }

  return result;
}

/**
 * 检查指定 useragent 字符串是否符合微信客户端特征。
 * @author luoliquan
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {boolean} 是否符合微信客户端特征。
 */
export function isWeixin(ua) {
  ua = getBrowserUA(ua);
  return /\bMicroMessenger\//.test(ua);
}

/**
 * 获取指定 useragent 字符串中的微信版本号。
 * @since 1.6.0
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {string} 微信版本号,不符合微信特征时返回空字符串。
 */
export function weixinVersion(ua) {
  ua = getBrowserUA(ua);
  return /\bMicroMessenger\/([\d.]+)/.test(ua) ? RegExp.$1 : '';
}

/**
 * 检查指定 useragent 字符串是否符合企业微信客户端特征。
 * @author luoliquan
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {boolean} 字符串是否符合企业微信客户端特征。
 */
export function isWorkWeixin(ua) {
  ua = getBrowserUA(ua);
  return isWeixin(ua) && /\bwxwork\b/.test(ua);
}

/**
 * 获取指定 useragent 字符串中的 IE 浏览器版本号。
 * @author luoliquan
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {string} IE 浏览器版本号,不符合该浏览器特征时返回空字符串。
 */
export function ieVersion(ua) {
  ua = getBrowserUA(ua);
  return /\bMSIE\s(\d+)/i.test(ua) || /\bTrident\/.*;\srv:(\d+)/.test(ua) ?
    RegExp.$1 : '';
}

/**
 * 检查指定 useragent 字符串是否符合安卓系统特征。
 * @author luoliquan
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {boolean} 是否符合安卓系统特征。
 */
export function isAndroid(ua) {
  ua = getBrowserUA(ua);
  return /\bAndroid\b/.test(ua);
}

/**
 * 检查指定 useragent 字符串是否符合 iOS 系统特征。
 * @author luoliquan
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {boolean} 是否符合 iOS 系统特征。
 */
export function isIOS(ua) {
  ua = getBrowserUA(ua);
  return /\b(?:iPad|iPod|iPhone)\b/.test(ua);
}

/**
 * 获取指定 useragent 字符串中的 iOS 版本号。
 * @since 1.6.0
 * @param {string} [ua] useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {string} iOS 版本号,不符合该系统特征时返回空字符串。
 */
export function iOSVersion(ua) {
  ua = getBrowserUA(ua);
  return /\bOS(?:\s([\d_.]+))?\slike\sMac\sOS\sX\b/.test(ua) ?
    RegExp.$1.replace(/_/g, '.') : '';
}

/**
 * 检查指定 useragent 字符串是否符合华为或荣耀设备特征。
 * @since 1.6.0
 * @param {string} ua useragent 字符串,浏览器环境下默认为 navigator.userAgent。
 * @return {boolean} 是否符合华为或荣耀设备特征。
 */
export function isHuawei(ua) {
  ua = getBrowserUA(ua);
  return /\b(?:huawei|honor)/i.test(ua);
}