export const enum UserAgentType { None = 0, /** * 安卓平板设备 */ Tablet = 1 << 1, DesktopOthers = 1 << 2, DesktopSafari = 1 << 3, DesktopChrome = 1 << 4, DesktopFirefox = 1 << 5, DesktopIE = 1 << 6, DesktopEdge = 1 << 7, Desktop = DesktopOthers | DesktopSafari | DesktopChrome | DesktopFirefox | DesktopIE | DesktopEdge, IPhone = 1 << 8, IPad = 1 << 9, /** * 安卓手机设备 */ Andriod = 1 << 10, /** * 移动设备(不含包平板设备) */ MobilePhone = IPhone | Andriod, /** * 所有移动设备,包含手机+平板 */ Mobile = MobilePhone | Tablet | IPhone, } export class UserAgentHelper { private static contains(source: string, match: string) { return source.indexOf(match) > -1; } private static containsAll(source: string, matches: string[]) { for (const item of matches) { if (!UserAgentHelper.contains(source, item)) { return false; } } return true; } private static containsAny(source: string, matches: string[]) { for (const item of matches) { if (UserAgentHelper.contains(source, item)) { return true; } } return false; } public static getType(ua: string) { const lower = ua.toLowerCase(); if (UserAgentHelper.contains(lower, "ipad")) { return UserAgentType.IPad; } if (UserAgentHelper.contains(lower, "android_tablet")) { return UserAgentType.Tablet; } if (UserAgentHelper.contains(lower, "iphone")) { return UserAgentType.IPhone; } if (UserAgentHelper.contains(lower, "ipod")) { return UserAgentType.IPhone; } if (UserAgentHelper.containsAny(lower, ["android", "mobile"])) { return UserAgentType.Andriod; } if (UserAgentHelper.contains(lower, "safari")) { return UserAgentType.DesktopSafari; } if (UserAgentHelper.containsAny(lower, ["edge", "edg"])) { return UserAgentType.DesktopEdge; } if (UserAgentHelper.contains(lower, "trident")) { return UserAgentType.DesktopIE; } if (UserAgentHelper.contains(lower, "firefox")) { return UserAgentType.DesktopFirefox; } if (UserAgentHelper.contains(lower, "chrome")) { return UserAgentType.DesktopChrome; } if (UserAgentHelper.containsAny(lower, ["360", "baidu", "qq"])) { return UserAgentType.DesktopOthers; } return UserAgentType.None; } public static isMobile(ua: string) { const type = UserAgentHelper.getType(ua); return type === UserAgentType.Andriod || type === UserAgentType.IPhone; } }