deviceInfo.ts 1.51 KB
export interface DeviceIdentity {
  model: string
  brand: string
  manufacturer: string
  product: string
  device: string
  platform: string
}

let cachedDeviceIdentity: DeviceIdentity | null = null

function safeText (value: unknown): string {
  return String(value || '').trim()
}

export function getDeviceIdentity (): DeviceIdentity {
  if (cachedDeviceIdentity) return cachedDeviceIdentity

  const info = (() => {
    try {
      return uni.getSystemInfoSync()
    } catch (_) {
      return {} as UniApp.GetSystemInfoResult
    }
  })()

  const identity: DeviceIdentity = {
    model: safeText((info as any).model),
    brand: safeText((info as any).brand),
    manufacturer: '',
    product: '',
    device: '',
    platform: safeText((info as any).platform),
  }

  // #ifdef APP-PLUS
  try {
    const Build = plus.android.importClass('android.os.Build')
    identity.model = safeText((Build as any).MODEL) || identity.model
    identity.brand = safeText((Build as any).BRAND) || identity.brand
    identity.manufacturer = safeText((Build as any).MANUFACTURER)
    identity.product = safeText((Build as any).PRODUCT)
    identity.device = safeText((Build as any).DEVICE)
  } catch (_) {}
  // #endif

  cachedDeviceIdentity = identity
  return identity
}

export function getDeviceFingerprint (): string {
  const identity = getDeviceIdentity()
  return [
    identity.brand,
    identity.manufacturer,
    identity.model,
    identity.product,
    identity.device,
  ]
    .filter(Boolean)
    .join(' | ')
    .toLowerCase()
}