get-system-info.js 2.9 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 21 22 23
/**
 * 获取系统信息-同步
 */
export function getSystemInfoSync () {
  var windowWidth = window.innerWidth
  var windowHeight = window.innerHeight
  var screen = window.screen
  var pixelRatio = window.devicePixelRatio
  var screenWidth = screen.width
  var screenHeight = screen.height
  var language = navigator.language
24
  var statusBarHeight = 0
fxy060608's avatar
fxy060608 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
  var osname
  var osversion
  var model

  if (isIOS) {
    osname = 'iOS'
    let osversionFind = ua.match(/OS\s([\w_]+)\slike/)
    if (osversionFind) {
      osversion = osversionFind[1].replace(/_/g, '.')
    }
    let modelFind = ua.match(/\(([a-zA-Z]+);/)
    if (modelFind) {
      model = modelFind[1]
    }
  } else if (isAndroid) {
    osname = 'Android'
41 42
    // eslint-disable-next-line no-useless-escape
    let osversionFind = ua.match(/Android[\s/]([\w\.]+)[;\s]/)
fxy060608's avatar
fxy060608 已提交
43 44 45
    if (osversionFind) {
      osversion = osversionFind[1]
    }
46 47 48 49
    let infoFind = ua.match(/\((.+?)\)/)
    let 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]
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 87 88 89 90 91

  const {
    top: windowTop,
    bottom: windowBottom
  } = getWindowOffset()

  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 105
    model,
    safeArea
fxy060608's avatar
fxy060608 已提交
106 107 108 109 110 111 112
  }
}
/**
 * 获取系统信息-异步
 */
export function getSystemInfo () {
  return getSystemInfoSync()
113
}