当前位置: 首页 > news >正文

Uniapp 获取系统信息:uni.getSystemInfo 与 uni.getSystemInfoSync

在 Uniapp 开发中,uni.getSystemInfouni.getSystemInfoSync 都是用于获取设备系统信息的 API,但它们的调用方式和适用场景有所不同。

一、基本区别

特性uni.getSystemInfouni.getSystemInfoSync
调用方式异步获取同步获取
返回值通过回调函数返回直接返回系统信息对象
执行时机需要等待回调立即执行
使用场景一般场景需要立即获取信息的场景

二、uni.getSystemInfo (异步获取)

基本用法

uni.getSystemInfo({success: (res) => {console.log(res);},fail: (err) => {console.error('获取系统信息失败', err);},complete: () => {console.log('获取系统信息完成');}
});

Promise 封装

function getSystemInfoAsync() {return new Promise((resolve, reject) => {uni.getSystemInfo({success: resolve,fail: reject});});
}// 使用
async function useSystemInfo() {try {const systemInfo = await getSystemInfoAsync();console.log(systemInfo);} catch (err) {console.error('获取系统信息失败', err);}
}

三、uni.getSystemInfoSync (同步获取)

基本用法

try {const systemInfo = uni.getSystemInfoSync();console.log(systemInfo);
} catch (err) {console.error('获取系统信息失败', err);
}

四、返回的系统信息对象

两种方法返回的对象结构相同,包含以下常用属性:

属性名类型说明
brandString设备品牌(如:Apple、HUAWEI等)
modelString设备型号(如:iPhone 13、Redmi K40等)
pixelRatioNumber设备像素比
screenWidthNumber屏幕宽度(单位:px)
screenHeightNumber屏幕高度(单位:px)
windowWidthNumber可使用窗口宽度(单位:px)
windowHeightNumber可使用窗口高度(单位:px)
statusBarHeightNumber状态栏高度(单位:px)
platformString运行平台(如:ios、android等)
systemString操作系统及版本(如:iOS 15.2、Android 11等)
languageString系统语言(如:zh-CN、en-US等)
versionString客户端基础库版本
fontSizeSettingNumber用户设置的字体大小(单位:px)
SDKVersionString客户端基础库版本(小程序端)
benchmarkLevelNumber设备性能等级(仅微信小程序)
albumAuthorizedBoolean相册授权状态(仅微信小程序)
cameraAuthorizedBoolean摄像头授权状态(仅微信小程序)
locationAuthorizedBoolean定位授权状态(仅微信小程序)
microphoneAuthorizedBoolean麦克风授权状态(仅微信小程序)
notificationAuthorizedBoolean通知授权状态(仅微信小程序)

五、使用场景对比

1. 适合使用 uni.getSystemInfo 的场景

  • 不需要立即获取系统信息
  • 在异步函数或Promise链中使用
  • 需要处理可能的错误情况
onLoad() {uni.getSystemInfo({success: (res) => {this.setData({isIPhoneX: res.model.includes('iPhone X')});}});
}

2. 适合使用 uni.getSystemInfoSync 的场景

  • 需要立即获取系统信息
  • 在同步代码流程中
  • 简单的条件判断
onLoad() {const systemInfo = uni.getSystemInfoSync();this.isIPhoneX = systemInfo.model.includes('iPhone X');// 根据平台设置样式if (systemInfo.platform === 'ios') {this.setData({ paddingTop: '44px' });} else {this.setData({ paddingTop: '48px' });}
}

六、实际应用示例

1. 适配全面屏

// 在页面或组件中
data() {return {isFullScreen: false,statusBarHeight: 0,safeAreaInsets: { top: 0, bottom: 0 }};
},created() {const systemInfo = uni.getSystemInfoSync();// 判断是否是全面屏设备this.isFullScreen = systemInfo.screenHeight / systemInfo.screenWidth > 1.8;// 获取状态栏高度this.statusBarHeight = systemInfo.statusBarHeight || 0;// 获取安全区域(App端)if (systemInfo.safeArea) {this.safeAreaInsets = {top: systemInfo.safeArea.top,bottom: systemInfo.screenHeight - systemInfo.safeArea.bottom};}
}

2. 平台特定样式

<template><view :style="{ paddingTop: paddingTop + 'px' }"><!-- 页面内容 --></view>
</template><script>
export default {data() {return {paddingTop: 0};},mounted() {const systemInfo = uni.getSystemInfoSync();this.paddingTop = systemInfo.statusBarHeight + (systemInfo.platform === 'ios' ? 44 : 48);}
};
</script>

3. 设备判断

// 判断是否是iOS设备
function isIOS() {const systemInfo = uni.getSystemInfoSync();return systemInfo.platform === 'ios';
}// 判断是否是Android设备
function isAndroid() {const systemInfo = uni.getSystemInfoSync();return systemInfo.platform === 'android';
}// 判断是否是iPhone X及以上机型
function isIPhoneX() {const systemInfo = uni.getSystemInfoSync();return /iPhone X|iPhone 1[1-9]|iPhone [1-9][0-9]/.test(systemInfo.model);
}

七、注意事项

  1. 平台差异

    • 某些属性只在特定平台有效(如 safeArea 主要在App端有效)
    • 小程序端和H5端返回的信息可能比App端少
  2. 性能考虑

    • 频繁调用同步API可能会影响性能
    • 对于不常变化的信息,可以考虑缓存结果
  3. 错误处理

    • 同步方法需要用 try-catch 包裹
    • 异步方法需要处理 fail 回调
  4. 时机问题

    • 在应用启动时,某些信息可能还未准备好
    • 对于关键信息,建议在 onReadymounted 生命周期中获取
  5. 单位转换

    • 返回的尺寸单位是 px,需要根据需要进行 rpx 转换

通过合理使用这两个API,可以更好地实现多端适配和设备特性检测,提升应用的用户体验。

http://www.dtcms.com/a/331033.html

相关文章:

  • vs2022 opencv环境配置(使用相对地址-将依赖都放入项目中)
  • spring boot配置es
  • 开发避坑指南(26):Vue3 input输入框前置后 置元素解决方案
  • 新增和编辑共用弹窗模板
  • .Net Core控制台程序连接HGDB并部署到Linux
  • 【C#】跨平台创建你的WinForms窗体应用(WindowsUbuntu)
  • 上网行为安全概述和组网方案
  • 深入解析 HTTP 协议演进:从 1.0 到 3.0
  • 【web站点安全开发】任务4:JavaScript与HTML/CSS的完美协作指南
  • 嵌入式Linux学习-编译内核源码
  • vscode的ws环境,esp32s3连接wifi
  • 深入解析Python身份切换:安全权限管理实践指南
  • MyBatis缓存模块深度解析
  • dolphinscheduler中任务输出变量的问题出现ArrayIndexOutOfBoundsException
  • MCP和Agent之间的区别和联系
  • vercel部署上线
  • lesson38:MySQL数据库核心操作详解:从基础查询到高级应用
  • 飞算JavaAI智慧零售场景实践:从用户洞察到供应链优化的全链路技术升级
  • UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)
  • [ HTML 前端 ] 语法介绍和HBuilderX安装
  • 通过网页调用身份证阅读器http websocket方法-湖南步联科技美萍MP999A电子————仙盟创梦IDE
  • 15 ABP Framework 开发工具
  • Transformer网络结构解析
  • HTML <link rel=“preload“>:提前加载关键资源的性能优化利器
  • CNN - 卷积层
  • MicroVM-as-a-Service 后端服务架构设计与实现
  • 使用 Docker 部署 PostgreSQL
  • 加密货币交易所开发:如何打造安全、高并发的数字资产交易平台?
  • 基于ECharts和EdgeOne打造云上智能图表
  • 单体架构集训整理