草庐IT

uni.getSystemInfo(OBJECT)

鹿蹊zz 2023-04-13 原文

系统信息的概念

uni-app提供了异步(uni.getSystemInfo)和同步(uni.getSystemInfoSync)的2个API获取系统信息。

系统信息返回的内容非常多,各操作系统、各家小程序、各浏览器对它们的定义也不相同。uni-app里重新梳理了这些概念,同时为了向下兼容也保留了这些平台原来的概念,但不推荐使用。

按照运行环境层级排序,从底层向上,uni-app有6个概念:

  • device:运行应用的设备,如iphone、huawei
  • os:设备的操作系统,如 ios、andriod、windows、mac、linux
  • rom:基于操作系统的定制,Android系统特有概念,如miui、鸿蒙
  • host:运行应用的宿主程序,即OS和应用之间的运行环境,如浏览器、微信等小程序宿主、集成uniMPSDK的App。uni-app直接开发的app没有host概念
  • uni:uni-app框架相关的信息,如uni-app框架的编译器版本、运行时版本
  • app:开发者的应用相关的信息,如应用名称、版本

uni.getSystemInfo(OBJECT)

异步获取系统信息

OBJECT 参数说明:

参数名类型必填说明
successFunction接口调用成功的回调
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

#success 返回参数说明

参数分类参数说明App平台值域Web平台值域小程序平台值域备注uni框架最低版本要求
devicedeviceId设备 id 。由 uni-app 框架生成并存储,清空 Storage 会导致改变
deviceType设备类型。如phonepadpcunknow详见phonepadpcunknowphonepadpcuni-app 3.4.10+
deviceBrand设备品牌。如:applehuawei不支持uni-app 3.4.10+
deviceModel设备型号部分设备无法获取uni-app 3.4.10+
deviceOrientation设备方向竖屏 portrait横屏 landscape竖屏 portrait横屏 landscape竖屏 portrait横屏 landscape。仅微信百度小程序支持uni-app 3.4.13+
devicePixelRatio设备像素比uni-app 3.4.13+
ososName系统名称ios、androidios、android、windows、macos、linuxios、android、windows、macosuni-app 3.4.10+
osVersion操作系统版本。如 ios 版本,andriod 版本uni-app 3.4.10+
osLanguage操作系统语言详见Android仅支持主语言+地区:zh-CN 中文简体、iOS支持主语言+次语言+地区zh-Hans-CN 中文简体与浏览器语言一致不支持uni-app 3.4.10+
osTheme操作系统主题light、dark。iOS平台只有将应用主题设置为跟随系统时才能获取到系统的主题不支持不支持uni-app 3.4.10+
osAndroidAPILevelAndroid 系统API库的版本。详情参考Android 官方文档(opens new window)仅 Android 支持不支持不支持uni-app 3.4.10+
romromNamerom 名称Android 部分机型获取不到值,详见。iOS 不支持不支持不支持uni-app 3.4.13+
romVersionrom 版本Android 部分机型获取不到值,详见。iOS 不支持不支持不支持uni-app 3.4.13+
browserbrowserName浏览器名称或App的webview名称chrome(android)、wkwebview(ios)、x5webview(app打包x5引擎)chrome、edge、safari、firefox不支持uni-app 3.4.10+
browserVersion浏览器版本、webview 版本不支持uni-app 3.4.10+
hosthostName小程序宿主或uniMPSDK的集成宿主名称,如:WeChatFeiShu仅 UniMPSDK 支持不支持详见微信小程序真机运行才有真值uni-app 3.4.10+
hostVersion宿主版本。如:微信版本号仅 UniMPSDK 支持不支持小程序宿主版本uni-app 3.4.10+
hostLanguage宿主语言仅 UniMPSDK 支持不支持小程序宿主语言uni-app 3.4.10+
hostTheme宿主主题lightdark。仅 UniMPSDK 支持不支持lightdark。前提是微信小程序全局配置"darkmode":true时才能获取uni-app 3.4.10+
hostFontSizeSetting用户字体大小设置。以“我-设置-通用-字体大小”中的设置为准,单位:px不支持不支持微信小程序、支付宝小程序、百度小程序、QQ小程序、字节小程序(2.53.0+)uni-app 3.4.13+
hostPackageName小程序宿主包名仅 UniMPSDK 支持不支持不支持uni-app 3.4.10+
hostSDKVersionuni小程序SDK版本、小程序客户端基础库版本仅 UniMPSDK 支持不支持uni-app 3.4.13+
uni-app框架uniPlatformuni-app 运行平台,与条件编译平台相同。详见appwebh5各家小程序,如mp-weixinuni-app 3.4.10+
uniCompileVersionuni 编译器版本号。详见3.4.103.2.9 等3.4.103.2.9 等3.4.103.2.9 等uni-app 3.4.10+
uniRuntimeVersionuni 运行时版本。详见3.4.103.2.9 等3.4.103.2.9 等3.4.103.2.9 等uni-app 3.4.10+
appappIdmanifest 中应用appid,即DCloud appid。uni-app 3.4.10+
appNamemanifest 中应用名称字节跳动小程序字段冲突,字节跳动小程序原字段与hostName一致uni-app 3.4.10+
appVersionmanifest 中应用版本名称。uni-app 3.4.10+
appVersionCodemanifest 中应用版本名号。uni-app 3.4.10+
appWgtVersion应用资源(wgt)的版本名称。uni-app 3.4.15+
appLanguage应用设置的语言enzh-Hanszh-Hantfresenzh-Hanszh-Hantfresenzh-Hanszh-Hantfresuni-app 3.4.13+
其他uauserAgent标识不支持uni-app 3.4.10+
screenWidth屏幕宽度
screenHeight屏幕高度
windowWidth可使用窗口宽度
windowHeight可使用窗口高度
windowTop可使用窗口的顶部位置
windowBottom可使用窗口的底部位置
statusBarHeight手机状态栏的高度
safeArea在竖屏正方向下的安全区域。由于此属性理解和使用比较困难,更推荐使用 safeAreaInsets 属性。详见微信、百度(开发者工具暂不支持,真机有效)、字节跳动、飞书、快手小程序、华为快应用
safeAreaInsets在竖屏正方向下的安全区域插入位置。与小程序定义的 safeArea 用途相同,但是规范参考 iOS 平台的 safeAreaInsets (opens new window)更利于理解和使用。详见微信、百度(开发者工具暂不支持,真机有效)、字节跳动、飞书、快手小程序、华为快应用uni-app 2.5.3+

#某些小程序特殊的返回参数

参数说明平台差异说明
benchmarkLevel设备性能等级。取值为:-2 或 0(该设备无法运行小游戏),-1(性能未知),>=1(设备性能值,该值越高,设备性能越好,目前最高不到50)微信小程序Android版、QQ小程序Android版
batteryLevel剩余电量百分比(仅 iOS 有效)微信小程序
currentBattery当前电量百分比支付宝小程序
navigationBarHeight导航栏的高度百度小程序
titleBarHeight标题栏高度支付宝小程序
albumAuthorized允许微信使用相册的开关(仅 iOS 有效)微信小程序
cameraAuthorized允许微信使用摄像头的开关微信小程序
locationAuthorized允许微信使用定位的开关微信小程序
microphoneAuthorized允许微信使用麦克风的开关微信小程序
notificationAuthorized允许微信通知的开关微信小程序
notificationAlertAuthorized允许微信通知带有提醒的开关(仅 iOS 有效)微信小程序
notificationBadgeAuthorized允许微信通知带有标记的开关(仅 iOS 有效)微信小程序
notificationSoundAuthorized允许微信通知带有声音的开关(仅 iOS 有效)微信小程序
bluetoothEnabled蓝牙的系统开关微信小程序
locationEnabled地理位置的系统开关微信小程序
wifiEnabledWi-Fi 的系统开关微信小程序
cacheLocation上一次缓存的位置信息百度小程序(安卓端最低基础库版本 3.40.4 ;iOS 最低支持版本 3.70.2)
storage设备磁盘容量支付宝小程序

#不推荐使用的返回参数,仅为向下兼容保留

参数说明平台差异说明
pixelRatio设备像素比
brand设备品牌。uni-app 3.4.10+ 后该字段为全小写,可能要做兼容处理App、微信小程序、百度小程序、字节跳动小程序、飞书小程序、QQ小程序
model设备型号全平台支持。Web 端部分设备无法获取具体型号
system操作系统名称及版本,如Android 10
language应用设置的语言
version引擎版本号Web不支持
platform客户端平台,值域为:iosandroidmac(3.1.10+)windows(3.1.10+)linux(3.1.10+)
host宿主平台百度小程序
SDKVersion客户端基础库版本支付宝小程序和Web不支持
swanNativeVersion宿主平台版本号百度小程序
app当前运行的客户端支付宝小程序
AppPlatformApp平台QQ小程序
fontSizeSetting用户字体大小设置。以“我-设置-通用-字体大小”中的设置为准,单位:px微信小程序、支付宝小程序、百度小程序、QQ小程序、字节小程序(2.53.0+)

#uniPlatform 返回值说明

生效条件
appApp
webWeb
mp-weixin微信小程序
mp-alipay支付宝小程序
mp-baidu百度小程序
mp-toutiao字节跳动小程序
mp-lark飞书小程序
mp-qqQQ小程序
mp-kuaishou快手小程序
mp-jd京东小程序
mp-360360小程序
quickapp-webview快应用通用(包含联盟、华为)
quickapp-webview-union快应用联盟
quickapp-webview-huawei快应用华为

uniCompileVersion编译器版本 和 uniRuntimeVersion运行时版本,正常情况应该是一样的值,即uni-app的版本。

如果使用HBuilder自带的uni-app开发,该值即等同于HBuilder的版本;如果使用单独的uni-app cli开发,则等同于cli版本。

但在App平台,uniCompileVersion 和 uniRuntimeVersion 在某些情况的值会不一样:

  • App云打包选择了不匹配的打包机版本,比如HBuilder版本较老,云端已经没有对应打包机,此时打包后uniCompileVersion会小于uniRuntimeVersion
  • App离线打包,使用了不匹配的离线SDK
  • App wgt升级,即手机上安装的App是老版的uniRuntimeVersion,wgt的新版使用了不同版本的HBuilder或uni-app cli版本,并且实施了应用资源升级

#romName 返回值说明

解释
MIUI小米
EMUI华为
HarmonyOS华为鸿蒙
Magic OS荣耀
ColorOSoppo
Funtouch OSvivo
FLymeOS魅族
SmartisanOS锤子

注意:不同rom的版本号规则不同,比如MIUI版本号是V130,而HarmonyOS的版本号是2.0.0

#hostName 返回值说明

解释
WeChat微信
wxwork微信企业版
百度宿主平台枚举值列表(opens new window)百度
alipay支付宝
amap高德
DINGTALK钉钉
UCUC浏览器
QUARK夸克浏览器
AK阿里健康
YK优酷
字节宿主平台枚举值列表(opens new window)字节跳动系列
qqQQ
KUAISHOU快手

#safeArea 返回值说明

参数类型说明
leftNumber安全区域左上角横坐标
rightNumber安全区域右下角横坐标
topNumber安全区域左上角纵坐标
bottomNumber安全区域右下角纵坐标
widthNumber安全区域的宽度,单位逻辑像素
heightNumber安全区域的高度,单位逻辑像素

safeAreaInsets 的结构

参数类型说明
leftNumber安全区域左侧插入位置
rightNumber安全区域右侧插入位置
topNumber安全区顶部插入位置
bottomNumber安全区域底部插入位置

#language 返回值说明

language的国际规范是BCP47规范,分为三段,主语言-次语言-地区。例如zh-Hans-CN,表示 中文-简体-中国大陆

但除了主语言外,后两者均可省略。在不同平台,它们的省略规则也不相同。

  • app-ios,不省略,返回zh-Hans-CN
  • app-android、web、微信小程序,省略次语言,返回zh-CN
  • uni-app框架和应用的多语言,以及支付宝小程序,则用zh-Hans来表示简体中文

所以获取语言后,不能直接字符串比较,需要拆段比较,npm上也有专门做BCP47语言规范比较的库。

#deviceId 返回值说明

Web、小程序、iOS,属于对用户隐私保护比较严格的平台,在这些平台很难获取有效的设备唯一标记。

Android也已经改进用户隐私保护。在极老的手机上可以无限制获取imei,在次老的手机上,获取imei等隐私信息时需要弹框让用户授权。新的Android手机(Android10以上)已经彻底无法获取imei了。

所以标记设备,大多只能依靠本地存储一个随机数来标记。

deviceId,在app-android平台,会根据优先使用imei、mac(仅在用户已授权的情况下,如果发现需要授权或未授权,则跳过此步骤),如果没有获取到就使用随机生成的标识。其他平台是直接使用随机生成的标识。

当使用本地存贮的随机数时,发生以下情况将导致deviceId失效:

  • 卸载App
  • Android上重置App数据
  • 浏览器清空缓存或开启隐私模式,

app下需要广告追踪的场景,在iOS上可以使用idfa (opens new window)、部分国产Android手机可以使用OAID(opens new window)

#deviceModel 返回值说明

uni-app 3.5.1+ 版本规范了 deviceModel 返回值,例如之前返回 iPhone11ProMax 新版本返回值为 iPhone 11 Pro Max,各设备型号参考规范 (opens new window)中 Generation 对应的值

注意:新机型刚推出一段时间会显示 Unknown,官方会尽快进行适配。

#其他注意

  • deviceType
    • app-ios 只支持 phonepad

    • app-android 支持 phonepadtvcarwatchvrapplianceundefinedunknown,关于各个类型的更详细解释参考Android官方文档 (opens new window)

    • 其中,app-android 平台下 pad 类型的判断,在国产pad等非google官方设备上并不一定准确。如果有需要开发者可自行根据型号或屏幕大小判断。uni-app框架源码中判断pad的java代码如下,供参考:

      public static boolean isTablet(Context context) {
      	return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
      }
      
      复制代码
  • osThemeapp-ios 只有将应用主题设置为跟随系统时才能获取到系统的主题。小程序也有类似限制。
  • 屏幕高度 = 原生NavigationBar高度(含状态栏高度)+ 可使用窗口高度 + 原生TabBar高度
  • windowHeight不包含NavigationBar和TabBar的高度
  • Web端,windowTop等于NavigationBar高度,windowBottom等于TabBar高度
  • App端,windowTop等于透明状态NavigationBar高度,windowBottom等于透明状态TabBar高度
  • 高度相关信息,要放在 onReady 里获取。太早取不到。

调用代码示例

uni.getSystemInfo({
	success: function (res) {
		console.log(res.appName)
	}
});

在不同平台 getSystemInfo 的返回值(表格较长,可缩放页面后拖动横向滚动条)

标明 - 的都为 undefined,其他值都与所列出项相同

字段名称App-AndroidApp-iOSh5Android uniMPsdkiOS uniMPsdkmp-weixinmp-alipaymp-baidump-toutiao
appId__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001__UNI__8BB4001
appNametesttesttesttesttesttesttesttesttest
appVersion1.0.01.0.01.0.01.0.01.0.01.0.01.0.01.0.01.0.0
appVersionCode100100100100100100100100100
appLanguagezh-Hanszh-Hanszh-Hanszh-Hanszh-Hanszh-Hanszh-Hanszh-Hanszh-Hans
browserNamechromewkwebviewsafarichromewkwebview----
browserVersion96.0.4664.10413.4.1313.0.388.0.4324.9315.4----
deviceIdd3db0944da20f333F791564F-853B-47B6-8CB8-27FF5931505916518284854447835016c7eafa7ed8774c0dF791564F-853B-47B6-8CB8-27FF59315059165217828572038477316536215804846585135165335963981121358216538995501084056633
deviceBrandxiaomiapple-huaweiappleiphoneiphoneiphoneapple
deviceModelMi10ProiPhone13ProMaxiPhoneMXW-AN00iPhoneSimulatoriPhone6/7/8PlusiPhone14,3iPhone6/7/8iPhone6
deviceTypephonephonephonephonephonephonephonephonephone
deviceOrientationportraitportraitportraitportraitportraitportrait-portrait-
devicePixelRatio2.568750143051147532333322
hostName--safariMPLauncherV3uniMPDemoWeChat、wxworkalipay、amap、DINGTALK、UC、QUARK、AK、YKbaiduboxapp 等百度宿主平台枚举值列表(opens new window)Douyin、Toutiao、news_article_lite、live_stream、XiGua、PPX
hostVersion--13.0.31.01.0.08.0.510.2.232.45.06.6.3
hostLanguage--zh-CNzh-CNzh-Hans-CNzh-CNzh-CNzh-CN
hostTheme---lightlight----
hostPackageName---com.example.mplauncherv3io.dcloud.hellounimp----
hostSDKVersion---3.4.133.4.132.24.22.7.63.450.162.49.0
osNameandroidiosiosandroidiosiosiosiosios
osVersion1215.513.2.31015.410.0.115.515.510.0.1
osLanguagezh-CNzh-Hans-CN-zh-CNzh-Hans-CN----
osThemelightlight-lightlight----
osAndroidAPILevel31--29-----
romNameMIUI--HarmonyOS-----
romVersionV130--2.0.0-----
uniPlatformappappwebappappmp-weixinmp-alipaymp-baidump-toutiao
uniCompileVersion3.4.133.4.133.4.133.4.133.4.133.4.133.4.133.4.133.4.13
uniRuntimeVersion3.4.133.4.133.4.133.4.133.4.133.4.133.4.133.4.133.4.13

#uni.getSystemInfoSync()

获取系统信息的同步接口。调用参数和返回值同上getSystemInfo

有关uni.getSystemInfo(OBJECT)的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  3. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  4. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

    在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

  5. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  6. ruby object.hash - 2

    一个对象的散列值是什么意思?在什么情况下两个对象具有相同的哈希值??还有说Array|Hash不能是Hashkeys,这个跟对象的hash值有关系,为什么? 最佳答案 对于要存储在HashMap或哈希集中的对象,必须满足以下条件:如果认为两个对象相等,则它们的哈希值也必须相等。如果两个对象不被认为是相等的,那么它们的哈希值应该很可能不同(两个不同的对象具有相同哈希值的次数越多,对HashMap/集合的操作性能就越差)。因此,如果两个对象具有相同的哈希值,则很有可能(但不能保证)它们相等。上面“相等”的确切含义取决于散列方法的实现者。

  7. ruby - 为什么 Object 在 Ruby 中既包含内核又继承它? - 2

    在Ruby(1.8.X)中为什么Object既继承了内核又包含了内核?仅仅继承还不够吗?irb(main):006:0>Object.ancestors=>[Object,Kernel]irb(main):005:0>Object.included_modules=>[Kernel]irb(main):011:0>Object.superclass=>nil请注意,在Ruby1.9中情况类似(但更简洁):irb(main):001:0>Object.ancestors=>[Object,Kernel,BasicObject]irb(main):002:0>Object.included

  8. ruby-on-rails - my_object.save(false) 并没有真正跳过我的 Active Record 验证 - 2

    所以我一直在努力解决我一直遇到的这个错误,我终于找到了导致它的原因。我一直觉得,当我调用@my_model.save(false)我会跳过我的ActiveRecord验证。事实证明这是部分正确的。我的对象正在保存到数据库中DESPITE我的ActiveRecord验证。我的问题存在是因为我的一个验证在验证过程中修改了一个子模型(这是一个24小时位置的调度应用程序,因此当午餐被保存时,我对照他们保存的那天和第二天检查它们以及确保用户不是指“凌晨2点”表示要上夜类。我的问题是:有没有办法真正跳过我的验证并直接移动到数据库?这是正常的ActiveRecord行为还是我应该更深入地研究我的验证

  9. ruby - 为什么 Object.class == Class 在 Ruby 中? - 2

    我觉得Object是每个人的祖先,包括Class。所以我觉得应该是Class.class==Object。感觉有点迷茫和扭曲 最佳答案 class返回类(#type)而不是祖先。对象的类是Class。Class的类(class)是Class。类是一个对象。广告中的真相:我从未学过Ruby,但对象类关系必须是Smalltalk30年前提出的那种关系。 关于ruby-为什么Object.class==Class在Ruby中?,我们在StackOverflow上找到一个类似的问题:

  10. ruby - 什么是 "terminated object",为什么我不能调用它的方法? - 2

    我会定期收到此异常:NotImplementedError:method`at'calledonterminatedobject在这行代码中:nextifHpricot(html).at('a')这个错误是什么意思?我该如何避免? 最佳答案 您正在使用的库使用自定义C扩展。在C扩展中,它试图在已被垃圾回收的Ruby对象上调用方法。这在纯Ruby中是不可能发生的,因为垃圾收集器只会释放不再能从任何引用中访问的对象。但在C语言中,可能会在垃圾收集器不检查的地方保留对Ruby对象的引用(例如,编译器可能已将变量放入CPU寄存器中)。

随机推荐