import { isStr } from 'uni-shared' function IEVersion () { const userAgent = navigator.userAgent const isIE = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1 const isEdge = userAgent.indexOf('Edge') > -1 && !isIE const isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1 if (isIE) { const reIE = new RegExp('MSIE (\\d+\\.\\d+);') reIE.test(userAgent) const fIEVersion = parseFloat(RegExp.$1) if (fIEVersion > 6) { return fIEVersion } else { return 6 } } else if (isEdge) { return -1 } else if (isIE11) { return 11 } else { return -1 } } export function getTheme () { if (__uniConfig.darkmode !== true) return isStr(__uniConfig.darkmode) ? __uniConfig.darkmode : 'light' try { return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark' } catch (error) { return 'light' } } const ua = navigator.userAgent /** * 是否安卓设备 */ const isAndroid = /android/i.test(ua) /** * 是否iOS设备 */ const isIOS = /iphone|ipad|ipod/i.test(ua) /** * 是否是Windows设备 */ const isWindows = ua.match(/Windows NT ([\d|\d.\d]*)/i) /** * 是否是Mac设备 */ const isMac = /Macintosh|Mac/i.test(ua) /** * 是否是Linux设备 */ const isLinux = /Linux|X11/i.test(ua) /** * 是否是iPadOS */ const isIPadOS = isMac && navigator.maxTouchPoints > 0 /** * 获取系统信息-同步 */ export function getBrowserInfo () { var language = navigator.language var osname var osversion var model let deviceType = 'phone' if (isIOS) { osname = 'iOS' const osversionFind = ua.match(/OS\s([\w_]+)\slike/) if (osversionFind) { osversion = osversionFind[1].replace(/_/g, '.') } const modelFind = ua.match(/\(([a-zA-Z]+);/) if (modelFind) { model = modelFind[1] } } else if (isAndroid) { osname = 'Android' // eslint-disable-next-line no-useless-escape const osversionFind = ua.match(/Android[\s/]([\w\.]+)[;\s]/) if (osversionFind) { osversion = osversionFind[1] } const infoFind = ua.match(/\((.+?)\)/) const infos = infoFind ? infoFind[1].split(';') : ua.split(' ') // eslint-disable-next-line no-useless-escape const otherInfo = [/\bAndroid\b/i, /\bLinux\b/i, /\bU\b/i, /^\s?[a-z][a-z]$/i, /^\s?[a-z][a-z]-[a-z][a-z]$/i, /\bwv\b/i, /\/[\d\.,]+$/, /^\s?[\d\.,]+$/, /\bBrowser\b/i, /\bMobile\b/i] for (let i = 0; i < infos.length; i++) { const info = infos[i] if (info.indexOf('Build') > 0) { model = info.split('Build')[0].trim() break } let other for (let o = 0; o < otherInfo.length; o++) { if (otherInfo[o].test(info)) { other = true break } } if (!other) { model = info.trim() break } } } else if (isIPadOS) { model = 'iPad' osname = 'iOS' osversion = typeof window.BigInt === 'function' ? '14.0' : '13.0' deviceType = 'pad' } else if (isWindows || isMac || isLinux) { model = 'PC' osname = 'PC' deviceType = 'pc' const osversionFind = ua.match(/\((.+?)\)/)[1] if (isWindows) { osname = 'Windows' osversion = '' switch (isWindows[1]) { case '5.1': osversion = 'XP' break case '6.0': osversion = 'Vista' break case '6.1': osversion = '7' break case '6.2': osversion = '8' break case '6.3': osversion = '8.1' break case '10.0': osversion = '10' break } const framework = osversionFind.match(/[Win|WOW]([\d]+)/) if (framework) { osversion += ` x${framework[1]}` } } else if (isMac) { osname = 'macOS' osversion = osversionFind.match(/Mac OS X (.+)/) || '' if (osversion) { osversion = osversion[1].replace(/_/g, '.') // '10_15_7' or '10.16; rv:86.0' if (osversion.indexOf(';') !== -1) { osversion = osversion.split(';')[0] } } } else if (isLinux) { osname = 'Linux' osversion = osversionFind.match(/Linux (.*)/) || '' if (osversion) { osversion = osversion[1] // 'x86_64' or 'x86_64; rv:79.0' if (osversion.indexOf(';') !== -1) { osversion = osversion.split(';')[0] } } } } else { osname = 'Other' osversion = '0' deviceType = 'unknown' } var system = `${osname} ${osversion}` var platform = osname.toLocaleLowerCase() let browserName = '' let browserVersion = String(IEVersion()) if (browserVersion !== '-1') { browserName = 'IE' } else { const browseVendors = ['Version', 'Firefox', 'Chrome', 'Edge{0,1}'] const vendors = ['Safari', 'Firefox', 'Chrome', 'Edge'] for (let index = 0; index < browseVendors.length; index++) { const vendor = browseVendors[index] const reg = new RegExp(`(${vendor})/(\\S*)\\b`) if (reg.test(ua)) { browserName = vendors[index] browserVersion = ua.match(reg)[2] } } } // deviceOrientation let deviceOrientation = 'portrait' const orientation = typeof window.screen.orientation === 'undefined' ? window.orientation : window.screen.orientation.angle deviceOrientation = Math.abs(orientation) === 90 ? 'landscape' : 'portrait' return { deviceBrand: undefined, brand: undefined, deviceModel: model, deviceOrientation, model, system, platform, browserName: browserName.toLocaleLowerCase(), browserVersion, language, deviceType, ua, osname, osversion, theme: getTheme() } }