get-system-info.js 3.2 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import getWindowOffset from 'uni-platform/helpers/get-window-offset'
2
import safeAreaInsets from 'safe-area-insets'
fxy060608's avatar
fxy060608 已提交
3 4 5 6 7

const ua = navigator.userAgent
/**
 * 是否安卓设备
 */
fxy060608's avatar
fxy060608 已提交
8
const isAndroid = /android/i.test(ua)
fxy060608's avatar
fxy060608 已提交
9 10 11
/**
 * 是否iOS设备
 */
fxy060608's avatar
fxy060608 已提交
12
const isIOS = /iphone|ipad|ipod/i.test(ua)
fxy060608's avatar
fxy060608 已提交
13 14 15 16 17 18 19 20
/**
 * 获取系统信息-同步
 */
export function getSystemInfoSync () {
  var screen = window.screen
  var pixelRatio = window.devicePixelRatio
  var screenWidth = screen.width
  var screenHeight = screen.height
21 22
  var windowWidth = Math.min(window.innerWidth, document.documentElement.clientWidth, screenWidth)
  var windowHeight = window.innerHeight
fxy060608's avatar
fxy060608 已提交
23
  var language = navigator.language
Q
qiang 已提交
24
  var statusBarHeight = safeAreaInsets.top
fxy060608's avatar
fxy060608 已提交
25 26 27 28 29 30
  var osname
  var osversion
  var model

  if (isIOS) {
    osname = 'iOS'
fxy060608's avatar
fxy060608 已提交
31
    const osversionFind = ua.match(/OS\s([\w_]+)\slike/)
fxy060608's avatar
fxy060608 已提交
32 33 34
    if (osversionFind) {
      osversion = osversionFind[1].replace(/_/g, '.')
    }
fxy060608's avatar
fxy060608 已提交
35
    const modelFind = ua.match(/\(([a-zA-Z]+);/)
fxy060608's avatar
fxy060608 已提交
36 37 38 39 40
    if (modelFind) {
      model = modelFind[1]
    }
  } else if (isAndroid) {
    osname = 'Android'
41
    // eslint-disable-next-line no-useless-escape
fxy060608's avatar
fxy060608 已提交
42
    const osversionFind = ua.match(/Android[\s/]([\w\.]+)[;\s]/)
fxy060608's avatar
fxy060608 已提交
43 44 45
    if (osversionFind) {
      osversion = osversionFind[1]
    }
fxy060608's avatar
fxy060608 已提交
46 47
    const infoFind = ua.match(/\((.+?)\)/)
    const infos = infoFind ? infoFind[1].split(';') : ua.split(' ')
48 49
    // 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]
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
    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
      }
    }
fxy060608's avatar
fxy060608 已提交
68 69 70 71 72 73 74
  } else {
    osname = 'Other'
    osversion = '0'
  }

  var system = `${osname} ${osversion}`
  var platform = osname.toLocaleLowerCase()
75 76 77 78 79 80 81 82
  var safeArea = {
    left: safeAreaInsets.left,
    right: windowWidth - safeAreaInsets.right,
    top: safeAreaInsets.top,
    bottom: windowHeight - safeAreaInsets.bottom,
    width: windowWidth - safeAreaInsets.left - safeAreaInsets.right,
    height: windowHeight - safeAreaInsets.top - safeAreaInsets.bottom
  }
fxy060608's avatar
fxy060608 已提交
83 84 85 86

  const {
    top: windowTop,
    bottom: windowBottom
Q
qiang 已提交
87
  } = getWindowOffset()
fxy060608's avatar
fxy060608 已提交
88 89 90 91

  windowHeight -= windowTop
  windowHeight -= windowBottom

92 93
  return {
    windowTop,
fxy060608's avatar
fxy060608 已提交
94 95
    windowBottom,
    windowWidth,
96
    windowHeight,
fxy060608's avatar
fxy060608 已提交
97 98 99 100
    pixelRatio,
    screenWidth,
    screenHeight,
    language,
101
    statusBarHeight,
fxy060608's avatar
fxy060608 已提交
102 103
    system,
    platform,
104
    model,
Q
qiang 已提交
105 106 107 108 109 110 111
    safeArea,
    safeAreaInsets: {
      top: safeAreaInsets.top,
      right: safeAreaInsets.right,
      bottom: safeAreaInsets.bottom,
      left: safeAreaInsets.left
    }
fxy060608's avatar
fxy060608 已提交
112 113 114 115 116 117 118
  }
}
/**
 * 获取系统信息-异步
 */
export function getSystemInfo () {
  return getSystemInfoSync()
119
}