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

《uni-app跨平台开发完全指南》- 13 -获取设备信息

前言

大家好,今天我们聊一个看似简单、实则至关重要的技术话题——如何获取和利用设备信息。在移动应用开发中,许多令人头疼的适配问题,其根源往往就在设备信息的处理上。今天,我们就来一起聊聊这个话题。

一、系统信息

1.1 同步vs异步

很多人都知道用uni.getSystemInfo(),但其实这里有个性能坑:

// 不推荐:每次都调异步APIasyncfunctiongetDeviceInfo(){constinfo=awaituni.getSystemInfo()returninfo}// 推荐:同步获取+缓存letcachedInfo=nullfunctiongetSystemInfo(){if(!cachedInfo){// 首次使用同步API,避免Promise开销cachedInfo=uni.getSystemInfoSync()}returncachedInfo}

为什么同步更好?

  • 无Promise开销,避免微任务队列调度
  • 不用await
  • 应用启动时就应该获取

但同步API有个坑:在极少数情况下可能会阻塞UI。建议:

  • 应用启动时用同步
  • 运行时变化用异步监听

1.2 专业术语解释

constsystemInfo=uni.getSystemInfoSync()// 一下6个字段比较重要:constessentialFields={// 1. 设备识别platform:systemInfo.platform,// "android" | "ios" | "web"model:systemInfo.model,// 具体型号,如"iPhone 13 Pro"// 2. 屏幕信息pixelRatio:systemInfo.pixelRatio,// 设备像素比screenWidth:systemInfo.screenWidth,// 物理像素宽度windowWidth:systemInfo.windowWidth,// 可用宽度// 3. 刘海屏-安全区域safeArea:systemInfo.safeArea,// 安全区域坐标statusBarHeight:systemInfo.statusBarHeight// 状态栏高度}

特别说明一下pixelRatio这个字段,很多新手会忽略它:

像素比的意义:

// 根据像素比加载合适图片functiongetImageUrl(baseUrl,pixelRatio){if(pixelRatio>=3)return`${baseUrl}@3x.png`if(pixelRatio>=2)return`${baseUrl}@2x.png`return`${baseUrl}.png`}// 计算Canvas绘制尺寸functiongetCanvasSize(designSize,pixelRatio){return{width:designSize.width*pixelRatio,height:designSize.height*pixelRatio,styleWidth:designSize.width,styleHeight:designSize.height}}

1.3 平台差异处理

uni-app号称"一套代码,多端运行",但现实是不同平台确实存在差异:

// Platform适配工具类classPlatformAdapter{staticgetStatusBarHeight(){constinfo=uni.getSystemInfoSync()// iOS和Android的状态栏高度if(info.platform==='ios'){// iOS:iPhone X以上有刘海constisNotchScreen=this.isNotchScreen(info)returnisNotchScreen?44:20}elseif(info.platform==='android'){// Android:通常比iOS高,且版本差异大constversion=parseFloat(info.system.split(' ')[1])||0returnversion>=10?28:25}return20// Web端默认}staticisNotchScreen(info){// 判断是否为刘海屏constnotchModels=['iPhone X','iPhone 11','iPhone 12','iPhone 13','iPhone 14','iPhone 15']returnnotchModels.some(model=>info.model.includes(model))}}

二、屏幕适配

2.1 rpx单位

rpx是uni-app的核心创新,让我们深入了解一下rpx吧。

// rpx转换原理functionrpx2px(rpx,windowWidth=375){// 1rpx = windowWidth / 750return(rpx*windowWidth)/750}// 注意事项constdesignWidth=750constdeviceWidth=uni.getSystemInfoSync().windowWidth// 按钮宽度是200rpxconstbuttonDesignWidth=200// 在任何设备上,实际宽度都是:constactualWidth=(buttonDesignWidth/designWidth)*deviceWidth

rpx的好处在于:

  • 750rpx对应设计稿750px
  • 所有元素按屏幕宽度等比缩放
  • 框架自动处理转换

rpx局限性:

  • 不适合需要固定尺寸的场景(如1px边框)
  • 在大屏设备上可能过度拉伸
  • 图片使用rpx需要配合mode="widthFix"

2.2 适配安全区域

随着全面屏普及,安全区域适配成了必修课:

http://www.cnnetsun.cn/news/91424.html

相关文章:

  • 从入门到精通,R Shiny多用户权限管理系统搭建全记录
  • Dify版本回滚从入门到精通:一套被验证的标准化操作流程
  • Frdbio®小鼠抗体纯化试剂盒
  • 告别冗余加载:构建高效量子计算运行时环境的6个不可忽视步骤
  • Agent服务扩展难题,如何在Docker Compose中实现无缝横向扩容?
  • PageAdmin:为企业政务提供产品及解决方案
  • 国产数据库技术学习心得:DM 数据库从实操到应用
  • Docker Compose Agent服务扩展全攻略(从入门到高可用部署)
  • R Shiny模块热加载技术揭秘:实现无缝更新,用户零感知(企业级方案曝光)
  • 【加密PDF解析终极指南】:Dify密钥管理核心技术揭秘与实战应用
  • 节能又达标!基于Linux的污水自动控制方案
  • 企微 SCRM 服务天花板:微伴四级支持,AI 陪跑至盈利
  • PyTorch训练损失异常?LobeChat给出诊断建议
  • 医药类电商系统开发公司有哪些?
  • 为什么90%的企业还没意识到Dify解密算法对文档安全的颠覆性威胁?
  • 为什么你的Vercel AI SDK在Docker中无法读取环境变量?深度剖析加载机制盲区
  • Dify权限验证系统解析:3步完成PDF加密与访问控制
  • 找不到符号
  • 300套伺服电机步进调速电机SolidWorks三维3D模型图结构库合集
  • 模温机企业排名:2025
  • Qwen3-VL-8B:轻量级多模态Embedding新选择
  • 本地部署EmotiVoice多音色情感TTS
  • LobeChat能否实现代码注释生成?文档完整性保障工具
  • 12.16 脚本网页 Golang标准库
  • 【LInux】进程程序替换与shell实现:从fork到exec的完整闭环
  • Github 9.6k Star!一款开源的超强大数据可视化神器!
  • 空间转录组+R语言=发刊利器?5个高分论文常用富集策略首次系统披露
  • 逆变器DC-AC拓扑全解析:从基础到专用,实战选型指南
  • 一文讲清楚Spring Bean的生命周期(附详细流程图)
  • 【Dify与Spring AI兼容性深度解析】:掌握版本匹配的5大核心原则