uniapp 獲取系統信息的方法小結
uni-app提供瞭異步(uni.getSystemInfo
)和同步(uni.getSystemInfoSync
)的2個API獲取系統信息。
系統信息返回的內容非常多,各操作系統、各傢小程序、各瀏覽器對它們的定義也不相同。uni-app裡重新梳理瞭這些概念,同時為瞭向下兼容也保留瞭這些平臺原來的概念,但不推薦使用。
按照運行環境層級排序,從底層向上,uni-app有6個概念:
device
:運行應用的設備,如iphone、huaweios
:設備的操作系統,如 ios、andriod、windows、mac、linuxrom
:基於操作系統的定制,Android系統特有概念,如miui、鴻蒙host
:運行應用的宿主程序,即OS和應用之間的運行環境,如瀏覽器、微信等小程序宿主、集成uniMPSDK的App。uni-app直接開發的app沒有host概念uni
:uni-app框架相關的信息,如uni-app框架的編譯器版本、運行時版本app
:開發者的應用相關的信息,如應用名稱、版本
一、uni.getSystemInfo(OBJECT)
異步獲取系統信息
OBJECT 參數說明:
參數名 | 類型 | 必填 | 說明 |
---|---|---|---|
success | Function | 是 | 接口調用成功的回調 |
fail | Function | 否 | 接口調用失敗的回調函數 |
complete | Function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
#success 返回參數說明
參數分類 | 參數 | 說明 | App平臺值域 | Web平臺值域 | 小程序平臺值域 | 備註 | uni框架最低版本要求 |
---|---|---|---|---|---|---|---|
device | deviceId | 設備 id 。由 uni-app 框架生成並存儲,清空 Storage 會導致改變 | |||||
deviceType | 設備類型。如phone 、pad 、pc 、unknow |
詳見 | phone 、pad 、pc 、unknow |
phone 、pad 、pc |
uni-app 3.4.10+ | ||
deviceBrand | 設備品牌。如:apple 、huawei |
不支持 | 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+ | |||||
os | osName | 系統名稱 | ios、android | ios、android、windows、macos、linux | ios、android、windows、macos | uni-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+ | ||
osAndroidAPILevel | Android 系統API庫的版本。詳情參考Android 官方文檔(opens new window) | 僅 Android 支持 |
不支持 | 不支持 | uni-app 3.4.10+ | ||
rom | romName | rom 名稱 | Android 部分機型獲取不到值,詳見。iOS 不支持 | 不支持 | 不支持 | uni-app 3.4.13+ | |
romVersion | rom 版本 | Android 部分機型獲取不到值,詳見。iOS 不支持 | 不支持 | 不支持 | uni-app 3.4.13+ | ||
browser | browserName | 瀏覽器名稱或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+ | ||||
host | hostName | 小程序宿主或uniMPSDK的集成宿主名稱,如:WeChat 、FeiShu |
僅 UniMPSDK 支持 | 不支持 | 詳見 | 微信小程序真機運行才有真值 | uni-app 3.4.10+ |
hostVersion | 宿主版本。如:微信版本號 | 僅 UniMPSDK 支持 | 不支持 | 小程序宿主版本 | uni-app 3.4.10+ | ||
hostLanguage | 宿主語言 | 僅 UniMPSDK 支持 | 不支持 | 小程序宿主語言 | uni-app 3.4.10+ | ||
hostTheme | 宿主主題 | light 、dark 。僅 UniMPSDK 支持 |
不支持 | light 、dark 。前提是微信小程序全局配置"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+ | ||
hostSDKVersion | uni小程序SDK版本、小程序客戶端基礎庫版本 | 僅 UniMPSDK 支持 | 不支持 | uni-app 3.4.13+ | |||
uni-app框架 | uniPlatform | uni-app 運行平臺,與條件編譯平臺相同。詳見 | app | web 或h5 |
各傢小程序,如mp-weixin |
uni-app 3.4.10+ | |
uniCompileVersion | uni 編譯器版本號。詳見 | 3.4.10 、3.2.9 等 |
3.4.10 、3.2.9 等 |
3.4.10 、3.2.9 等 |
uni-app 3.4.10+ | ||
uniRuntimeVersion | uni 運行時版本。詳見 | 3.4.10 、3.2.9 等 |
3.4.10 、3.2.9 等 |
3.4.10 、3.2.9 等 |
uni-app 3.4.10+ | ||
app | appId | manifest 中應用appid,即DCloud appid。 |
uni-app 3.4.10+ | ||||
appName | manifest 中應用名稱 |
和字節跳動小程序 字段沖突,字節跳動小程序 原字段與hostName 一致 |
uni-app 3.4.10+ | ||||
appVersion | manifest 中應用版本名稱。 |
uni-app 3.4.10+ | |||||
appVersionCode | manifest 中應用版本名號。 |
uni-app 3.4.10+ | |||||
appWgtVersion | 應用資源(wgt)的版本名稱。 | uni-app 3.4.15+ | |||||
appLanguage | 應用設置的語言 | en 、zh-Hans 、zh-Hant 、fr 、es |
en 、zh-Hans 、zh-Hant 、fr 、es |
en 、zh-Hans 、zh-Hant 、fr 、es |
uni-app 3.4.13+ | ||
其他 | ua | userAgent標識 | 不支持 | 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 | 地理位置的系統開關 | 微信小程序 |
wifiEnabled | Wi-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 | 客戶端平臺,值域為:ios 、android 、mac(3.1.10+) 、windows(3.1.10+) 、linux(3.1.10+) |
|
host | 宿主平臺 | 百度小程序 |
SDKVersion | 客戶端基礎庫版本 | 支付寶小程序和Web不支持 |
swanNativeVersion | 宿主平臺版本號 | 百度小程序 |
app | 當前運行的客戶端 | 支付寶小程序 |
AppPlatform | App平臺 | QQ小程序 |
fontSizeSetting | 用戶字體大小設置。以“我-設置-通用-字體大小”中的設置為準,單位:px | 微信小程序、支付寶小程序、百度小程序、QQ小程序、字節小程序(2.53.0+) |
#uniPlatform 返回值說明
值 | 生效條件 |
---|---|
app | App |
web | Web |
mp-weixin | 微信小程序 |
mp-alipay | 支付寶小程序 |
mp-baidu | 百度小程序 |
mp-toutiao | 字節跳動小程序 |
mp-lark | 飛書小程序 |
mp-qq | QQ小程序 |
mp-kuaishou | 快手小程序 |
mp-jd | 京東小程序 |
mp-360 | 360小程序 |
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 | 榮耀 |
ColorOS | oppo |
Funtouch OS | vivo |
FLymeOS | 魅族 |
SmartisanOS | 錘子 |
註意:不同rom的版本號規則不同,比如MIUI
版本號是V130
,而HarmonyOS
的版本號是2.0.0
#hostName 返回值說明
值 | 解釋 |
---|---|
微信 | |
wxwork | 微信企業版 |
百度宿主平臺枚舉值列表(opens new window) | 百度 |
alipay | 支付寶 |
amap | 高德 |
DINGTALK | 釘釘 |
UC | UC瀏覽器 |
QUARK | 誇克瀏覽器 |
AK | 阿裡健康 |
YK | 優酷 |
字節宿主平臺枚舉值列表(opens new window) | 字節跳動系列 |
KUAISHOU | 快手 |
#safeArea 返回值說明
參數 | 類型 | 說明 |
---|---|---|
left | Number | 安全區域左上角橫坐標 |
right | Number | 安全區域右下角橫坐標 |
top | Number | 安全區域左上角縱坐標 |
bottom | Number | 安全區域右下角縱坐標 |
width | Number | 安全區域的寬度,單位邏輯像素 |
height | Number | 安全區域的高度,單位邏輯像素 |
safeAreaInsets 的結構
參數 | 類型 | 說明 |
---|---|---|
left | Number | 安全區域左側插入位置 |
right | Number | 安全區域右側插入位置 |
top | Number | 安全區頂部插入位置 |
bottom | Number | 安全區域底部插入位置 |
#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
隻支持phone
、pad
。 -
app-android
支持phone
、pad
、tv
、car
、watch
、vr
、appliance
、undefined
、unknown
,關於各個類型的更詳細解釋參考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; }
-
osTheme
:app-ios
隻有將應用主題設置為跟隨系統時才能獲取到系統的主題。小程序也有類似限制。- 屏幕高度 = 原生NavigationBar高度(含狀態欄高度)+ 可使用窗口高度 + 原生TabBar高度
- windowHeight不包含NavigationBar和TabBar的高度
- Web端,windowTop等於NavigationBar高度,windowBottom等於TabBar高度
- App端,windowTop等於透明狀態NavigationBar高度,windowBottom等於透明狀態TabBar高度
- 高度相關信息,要放在 onReady 裡獲取。太早取不到。
本API在其他小程序的文檔鏈接:
- 微信小程序(opens new window)
- 支付寶小程序(opens new window)
- 百度小程序(opens new window)
- 字節小程序(opens new window)
- 飛書小程序(opens new window)
- QQ小程序(opens new window)
- 快手小程序(opens new window)
- 京東小程序(opens new window)
- 華為快應用(opens new window)
#示例
調用代碼示例
uni.getSystemInfo({ success: function (res) { console.log(res.appName) } });
在不同平臺 getSystemInfo 的返回值(表格較長,可縮放頁面後拖動橫向滾動條)
標明
-
的都為 undefined,其他值都與所列出項相同
字段名稱 | App-Android | App-iOS | h5 | Android uniMPsdk | iOS uniMPsdk | mp-weixin | mp-alipay | mp-baidu | mp-toutiao |
---|---|---|---|---|---|---|---|---|---|
appId | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 | __UNI__8BB4001 |
appName | test | test | test | test | test | test | test | test | test |
appVersion | 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 | 1.0.0 |
appVersionCode | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
appLanguage | zh-Hans | zh-Hans | zh-Hans | zh-Hans | zh-Hans | zh-Hans | zh-Hans | zh-Hans | zh-Hans |
browserName | chrome | wkwebview | safari | chrome | wkwebview | – | – | – | – |
browserVersion | 96.0.4664.104 | 13.4.13 | 13.0.3 | 88.0.4324.93 | 15.4 | – | – | – | – |
deviceId | d3db0944da20f333 | F791564F-853B-47B6-8CB8-27FF59315059 | 16518284854447835016 | c7eafa7ed8774c0d | F791564F-853B-47B6-8CB8-27FF59315059 | 1652178285720384773 | 16536215804846585135 | 1653359639811213582 | 16538995501084056633 |
deviceBrand | xiaomi | apple | – | huawei | apple | iphone | iphone | iphone | apple |
deviceModel | Mi10Pro | iPhone13ProMax | iPhone | MXW-AN00 | iPhoneSimulator | iPhone6/7/8Plus | iPhone14,3 | iPhone6/7/8 | iPhone6 |
deviceType | phone | phone | phone | phone | phone | phone | phone | phone | phone |
deviceOrientation | portrait | portrait | portrait | portrait | portrait | portrait | – | portrait | – |
devicePixelRatio | 2.5687501430511475 | 3 | 2 | 3 | 3 | 3 | 3 | 2 | 2 |
hostName | – | – | safari | MPLauncherV3 | uniMPDemo | WeChat、wxwork | alipay、amap、DINGTALK、UC、QUARK、AK、YK | baiduboxapp 等百度宿主平臺枚舉值列表(opens new window) | Douyin、Toutiao、news_article_lite、live_stream、XiGua、PPX |
hostVersion | – | – | 13.0.3 | 1.0 | 1.0.0 | 8.0.5 | 10.2.23 | 2.45.0 | 6.6.3 |
hostLanguage | – | – | zh-CN | zh-CN | zh-Hans-CN | zh-CN | zh-CN | zh-CN | |
hostTheme | – | – | – | light | light | – | – | – | – |
hostPackageName | – | – | – | com.example.mplauncherv3 | io.dcloud.hellounimp | – | – | – | – |
hostSDKVersion | – | – | – | 3.4.13 | 3.4.13 | 2.24.2 | 2.7.6 | 3.450.16 | 2.49.0 |
osName | android | ios | ios | android | ios | ios | ios | ios | ios |
osVersion | 12 | 15.5 | 13.2.3 | 10 | 15.4 | 10.0.1 | 15.5 | 15.5 | 10.0.1 |
osLanguage | zh-CN | zh-Hans-CN | – | zh-CN | zh-Hans-CN | – | – | – | – |
osTheme | light | light | – | light | light | – | – | – | – |
osAndroidAPILevel | 31 | – | – | 29 | – | – | – | – | – |
romName | MIUI | – | – | HarmonyOS | – | – | – | – | – |
romVersion | V130 | – | – | 2.0.0 | – | – | – | – | – |
uniPlatform | app | app | web | app | app | mp-weixin | mp-alipay | mp-baidu | mp-toutiao |
uniCompileVersion | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 |
uniRuntimeVersion | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 | 3.4.13 |
二、uni.getSystemInfoSync()
獲取系統信息的同步接口。調用參數和返回值同上getSystemInfo
。
三、總結
uni.getSystemInfo()
(1) deviceType 獲取設備類型,phone、pad、pc
(2) deviceOrientation 獲取設備方向,豎屏 portrait
、橫屏 landscape
(3) osName 獲取系統名稱,ios、android、windows、macos (APP隻有ios、android)
推薦閱讀:
- JavaScript實現移動端橫豎屏檢測
- uni-app入門頁面佈局之window和tabbar詳解
- Android基礎之隱藏標題欄/設置為全屏/橫豎屏切換
- iOS15適配小結
- Android App隱私合規檢測輔助工具Camille詳解