要通过 navigator 对象验证设备是 iOS 还是 Android,核心是利用 navigator.userAgent(用户代理字符串)中包含的系统特征关键词进行判断

一、核心原理

不同系统的 userAgent 会包含固定特征:

  • iOS 设备:包含 iPhoneiPadiPodiOS 等关键词(且需排除 macOS 伪装的情况);
  • Android 设备:包含 Android 关键词(需排除 Chrome 模拟器等非真实设备场景)。

二、完整判断函数

/**
 * 判断设备系统类型
 * @returns {String} "ios" | "android" | "other"
 */
function getOS() {
  // 获取用户代理字符串并转为小写,避免大小写问题
  const userAgent = navigator.userAgent.toLowerCase();
  
  // 先判断 iOS(需排除 macOS 上的 Safari 伪装)
  const isIOS = /iphone|ipad|ipod/.test(userAgent) && !/macintosh/.test(userAgent);
  
  // 判断 Android(排除 Windows 模拟器等非真实设备)
  const isAndroid = /android/.test(userAgent) && !/windows/.test(userAgent);

  if (isIOS) {
    return "ios";
  } else if (isAndroid) {
    return "android";
  } else {
    return "other"; // 桌面端、鸿蒙、Windows Phone 等
  }
}

三、进阶:获取 iOS/Android 具体版本

如果需要进一步获取系统版本(如 iOS 17、Android 14),可扩展函数:

function getOSWithVersion() {
  const userAgent = navigator.userAgent.toLowerCase();
  let os = "other";
  let version = "unknown";

  // 匹配 iOS 版本(如 "os 17_0_3 like mac os x" 或 "iphone os 16_1")
  const iosMatch = userAgent.match(/os (\d+[_|\.]\d+(_|\.)?\d*)/);
  if (/iphone|ipad|ipod/.test(userAgent) && !/macintosh/.test(userAgent)) {
    os = "ios";
    version = iosMatch ? iosMatch[1].replace(/_/g, ".") : "unknown";
  }

  // 匹配 Android 版本(如 "android 14" 或 "android 13; build/...")
  const androidMatch = userAgent.match(/android (\d+(\.\d+)?)/);
  if (/android/.test(userAgent) && !/windows/.test(userAgent)) {
    os = "android";
    version = androidMatch ? androidMatch[1] : "unknown";
  }

  return { os, version };
}

四、使用示例

// 基础判断
const osType = getOS();
if (osType === "ios") {
  console.log("当前是 iOS 设备");
  // 执行 iOS 专属逻辑(如适配刘海屏、唤起原生分享)
} else if (osType === "android") {
  console.log("当前是 Android 设备");
  // 执行 Android 专属逻辑(如处理返回键、适配状态栏)
} else {
  console.log("非移动设备或其他系统");
}

// 获取版本信息
const { os, version } = getOSWithVersion();
console.log(`系统类型:${os},版本:${version}`);

五、关键注意事项

  1. userAgent 可能被修改:部分浏览器(如 Chrome 移动端)可伪装 UA,仅能作为参考,不能作为唯一判断依据;
  2. 鸿蒙系统兼容:鸿蒙设备默认会伪装成 Android 的 UA(包含 Android 关键词),若需区分鸿蒙,需额外检测 harmonyos 关键词:
const isHarmonyOS = /harmonyos/.test(userAgent);

     3.桌面端模拟器:Chrome 开发者工具的设备模拟会添加 Android/iOS UA,需结合 navigator.platform 辅助判断:

// 真实移动端的 platform 特征
const isRealMobile = /iphone|ipad|ipod|android|linux/.test(navigator.platform.toLowerCase());

         4.iOS 13+ 隐私限制:iOS 13 及以上版本中,userAgent 可能隐藏部分细节,核心关键词(iPhone/iPad)仍保留,不影响基础判断。

    六、扩展:结合 navigator.platform 增强准确性

    function getOSAccurate() {
      const platform = navigator.platform.toLowerCase();
      const userAgent = navigator.userAgent.toLowerCase();
    
      // iOS 设备的 platform 为 "iphone" | "ipad" | "ipod"
      if (/iphone|ipad|ipod/.test(platform)) {
        return "ios";
      }
      // Android 设备的 platform 多为 "linux"(Android 基于 Linux 内核)
      else if (/linux/.test(platform) && /android/.test(userAgent)) {
        return "android";
      }
      return "other";
    }

    简易版本,检测是否为移动端

    !(function () {
            const userAgent = navigator.userAgent;
            // 验证是否为Android或iPone
            const android = userAgent.match(/(Android);?[\s\/]+([\d.]+)?/);
            const iphone = userAgent.match(/(iPhone\sOS)\s([\d_]+)/);
            // 如果是Android或iPone,则跳转到移动端站点
            if (android || iphone) {
              window.location.href = "https://baidu.com";
            }
          })();

    Logo

    火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

    更多推荐