首頁 > 軟體

uniapp 獲取系統資訊的方法小結

2022-11-13 14:00:34

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詳見phonepadpcunknowphonepadpc uni-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、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+
 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-weixin uni-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-Hantfres uni-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 裡獲取。太早取不到。

本API在其他小程式的檔案連結:

#範例

呼叫程式碼範例

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()  

(1) deviceType 獲取裝置型別,phone、pad、pc

(2) deviceOrientation 獲取裝置方向,豎屏 portrait橫屏 landscape

(3) osName 獲取系統名稱,ios、android、windows、macos (APP只有ios、android)


IT145.com E-mail:sddin#qq.com