get-system-info.js 3.6 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
/**
 * 获取系统信息-同步
 */
export function getSystemInfoSync () {
  var screen = window.screen
  var pixelRatio = window.devicePixelRatio
19
  // 横屏时 iOS 获取的屏幕宽高颠倒,进行纠正
20 21 22 23
  const screenFix = /^Apple/.test(navigator.vendor) && typeof window.orientation === 'number'
  const landscape = screenFix && Math.abs(window.orientation) === 90
  var screenWidth = screenFix ? Math[landscape ? 'max' : 'min'](screen.width, screen.height) : screen.width
  var screenHeight = screenFix ? Math[landscape ? 'min' : 'max'](screen.height, screen.width) : screen.height
d-u-a's avatar
d-u-a 已提交
24
  var windowWidth = Math.min(window.innerWidth, document.documentElement.clientWidth, screenWidth) || screenWidth
25
  var windowHeight = window.innerHeight
fxy060608's avatar
fxy060608 已提交
26
  var language = navigator.language
Q
qiang 已提交
27
  var statusBarHeight = safeAreaInsets.top
fxy060608's avatar
fxy060608 已提交
28 29 30 31 32 33
  var osname
  var osversion
  var model

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

  var system = `${osname} ${osversion}`
  var platform = osname.toLocaleLowerCase()
78 79 80 81 82 83 84 85
  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 已提交
86 87 88 89

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

  windowHeight -= windowTop
  windowHeight -= windowBottom

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