UWP 應用獲取各類系統、用戶信息 (1) - 設備和系統的基本信息、應用包信息、用戶數據賬戶信息和用戶賬戶信息
應用開發中,開發者時常需要獲取一些系統、用戶信息用於數據統計遙測、問題反饋、用戶識別等功能。本文旨在介紹在 Windows UWP 應用中獲取一些常用系統、用戶信息的方法。示例項目代碼可參見 Github:
https://github.com/validvoid/UWP-SystemInfoCollector
由於涉及內容較多,故本文會分為多篇展開。本篇介紹獲取設備和系統的基本信息、應用包信息、用戶數據賬戶信息和用戶賬戶信息。
原博客閱讀地址:http://validvoid.net/uwp-system-info-collect-1/
AnalyticsInfo
Windows.System.Profile
命名空間下的 AnalyticsInfo 類負責提供用於設備分析的相關信息。通過此類,我們能夠獲得系統的具體版本號以及設備類型等信息。
通過 AnalyticsInfo
類中的 VersionInfo
屬性我們可以獲取當前應用運行設備的設備類型和操作系統具體版本。AnalyticsVersionInfo 類型的 VersionInfo
屬性包含兩個成員:
- DeviceFamily
- DeviceFamilyVersion
DeviceFamily
屬性的返回值類型為字符串。其提供的設備類型信息極為重要,幾乎在所有 UWP 開發中均會用到。通常我們都會根據此屬性返回的設備類型信息配合實現應用的響應式設計。例如,返回 "Windows.Desktop" 時表示應用運行在桌面端 Windows 10 上,則應用呈現適合於鼠標鍵盤操作的 PC 端界面;返回 "Windows.Mobile" 時表示應用運行在移動端的 Windows 10 上,則應用應當呈現適合於觸屏操作的移動端小屏界面。
DeviceFamilyVersion
屬性的返回值類型也是字符串。其返回值指示了當前設備運行的 Windows 的具體版本號。不過直接獲取此屬性拿到的返回值是一個形如 "2814750460870692" 的 long 型數字。如果想要獲取可讀的 "major.minor.revision.build" 形式的版本號,需要先將此數值轉化為十六進制,然後進一步轉化為可讀的版本號。
格式化版本號的 C# 代碼:
string sv = AnalyticsInfo.VersionInfo.DeviceFamilyVersion; ulong v = ulong.Parse(sv);ulong v1 = (v & 0xFFFF000000000000L) >> 48; ulong v2 = (v & 0x0000FFFF00000000L) >> 32; ulong v3 = (v & 0x00000000FFFF0000L) >> 16; ulong v4 = (v & 0x000000000000FFFFL); string version = $"{v1}.{v2}.{v3}.{v4}";
運行示例代碼會得以類似以下內容的輸出:
Device Analytics Info
DeviceForm: Unknown
DeviceFamily: Windows.Desktop
DeviceFamilyVersion: 2814750460870692
Reconstructed OS Version: 10.0.10586.36
需要指出的是,如果你打算通過 DeviceFamilyVersion 進行數據統計、分析工作,那麽在應用的客戶端代碼中不要將原始的 DeviceFamilyVersion 返回值格式化為可讀形式。據微軟官方人員在 MSDN 的解釋,AnalyticsInfo.VersionInfo
旨在為遙測和日誌記錄提供一個不透明的版本號字符串值,最佳做法是將該原始值傳回服務器,如果有必要,在服務器端進行格式化解析的工作。
另外,AnalyticsInfo
類中的 DeviceForm
屬性具體作用不明,在 PC 和 Windows Mobile 設備中均返回 "Unknown"。MSDN 文檔中僅將此屬性描述為 "Gets the device form."
資源限定符
Windows.ApplicationModel.Resources.Core.ResourceContext
類封裝了可能影響資源選定的資源限定符(qualifiers)。這些資源限定符影響了應用運行時所需資源的選定。查詢資源限定符並做出適當匹配優化對於增進用戶體驗也有幫助。
要獲得當前應用的資源限定符,我們需要調用 ResourceContext.GetForCurrentView()
方法獲得當前應用視圖的資源上下文,再訪問其中的 QualifierValues
屬性。QualifierValues
屬性的類型為 IObservableMap<string,string>
,可通過鍵名獲得對應的限定符值。
以下為 MSDN 文檔中列舉的可能的資源限定符名稱以及對應取值:
資源限定符 | 可能的取值 | 說明 |
---|---|---|
Language | 如 "en-us" | 此限定符名稱可以映射到表示語言的字符串值,例如,"en-us" 表示美國英語。 |
Contrast | standard | 此限定符名稱可以映射到當前對比度設置值。 |
high | ||
black | ||
white | ||
Scale | 80 | 此限定符名稱可以映射到以百分比形式表示顯示比例的值。 |
100 | ||
120 | ||
140 | ||
150 | ||
160 | ||
180 | ||
225 | ||
HomeRegion | 如 "021" | 此限定符名稱可以映射到表示區域的字符串值,例如,"021" 表示北美。 |
TargetSize | 如 "256" | 此限定符名稱可以映射到表示目標大小的字符串值,例如,"256"。 |
LayoutDirection | LTR | 此限定符名稱可以映射到當前布局方向的值。 |
RTL | ||
TTBLTR | ||
TTBRTL | ||
Configuration | 此限定符名稱可以映射到表示配置的字符串值。 | |
AlternateForm | 此限定符名稱可以映射到表示替換窗體的字符串值。 | |
DXFeatureLevel | DX9 | 此限定符名稱可以映射到表示 DirectX 功能級別。 |
DX10 | ||
DX11 |
有關 ResourceContext
類的更多用法,可以參閱 MSDN 文檔 ResourceContext 類型。
獲取當前應用包信息
Windows.ApplicationModel.Package 類型負責提供應用包的信息。要獲取當前應用的 Package 對象實例,可以通過 ‘Package.Current‘ 屬性獲取。獲取當前應用的包對象之後,我們就可以進一步獲得以下信息:
- DisplayName 獲取包的顯示名稱。
- InstalledDate 獲取包安裝或最近一次更新的時間。
- InstalledLocation 獲取包的安裝位置。返回值為
StorageFolder
類型。 - IsBundle 指示該包是否為 Bundle 集合包。
- IsDevelopmentMode 指示該包是否以開發模式安裝。
- IsFramework 指示是否有其它包將該包聲明為依賴項。
- IsResourcePackage 指示該包是否為資源包。
- Logo 獲取該包 Logo 文件的位置。返回值為
Uri
類型。 - PublisherDisplayName 獲取包發布者顯示名稱。
- InstallDate 獲取應用包初次安裝的時間。該屬性在 Windows 10 上並未實現。過去也僅對 Windows Phone 8 有效。
除以上屬性外,Package
類還提供了三個重要的屬性:Id 、 Status 以及Dependencies。
Id
屬性為 PackageId 類型。該屬性提供了當前包 Id 的各種信息,包括:
- Architecture 獲取當前包的對應處理器架構。
- FamilyName 獲取包的 Family Name。如 "32b04fa8-6b7b-4ed9-8a9b-eade01a24207_hpzxbeh1zj56g "
- FullName 獲取包的完整名稱。如 "32b04fa8-6b7b-4ed9-8a9b-eade01a242071.0.0.0x86__hpzxbeh1zj56g"
- Name 獲取包名。如 "32b04fa8-6b7b-4ed9-8a9b-eade01a24207"
- Publisher 獲取包發布者。如 "CN=validvoid"
- PublisherId 獲取包發布者 ID。
- ResourceId 獲取包的資源 ID。
- Version 獲取包版本。返回值為
PackageVersion
類型,可進一步格式化輸出字符串。 - Author 獲取包作者。僅限 Windows Phone,在 Windows 10 上無效。
- ProductId 獲取包的
ProductID
屬性值。僅限 Windows Phone,在 Windows 10 上無效。
Status
屬性為 PackageStatus 類型。該類型提供了一個 VerifyisOK()
方法用於判斷當前包的狀態是否良好,可以使用。該方法會驗證 PackageStatus
中的一系列屬性以判斷包是否可用。PackageStatus
包含的屬性如下:
- DataOffline 指示當前包所用數據是否離線。例如,當應用的數據安裝在了 SD 卡等可移動介質上,而該媒體彈出時,數據即為離線狀態,則該屬性返回 true。
- DependencyIssue 指示包的依賴項狀態。當當前包的依賴項之一遭遇異常時,該屬性即返回 true。在當前包的全部依賴項解決問題前,當前包將無法使用。
- DeploymentInProgress 指示當前包是否正在被部署過程占用。例如,當包正在更新時,該屬性返回 true。
- Disabled 指示當前包是否被禁用。包可以通過PackageManager.SetPackageStatus 進行禁用,或通過PackageManager.ClearPackageStatus 啟用。
- LicenseIssue 指示當前包是否有授權問題。例如當授權丟失或過期時,該屬性返回 true。所有授權問題解決前,當前包將不可用。
- Modified 指示當前包是否存在內容修改問題。例如,當包丟失了某些文件時,該屬性返回 true。
- NeedsRemediation 指示當前包是否需要進行修正。例如,當
NotAvailable
,LicenseIssue
,Modified
,Tampered
中的一個或多個屬性指示出當前包存在異常情況時,該屬性即為 true。 - NotAvailable 指示當前包是否不可用。例如,當
DataOffline
,Disabled
,PackageOffline
中的一個或多個屬性指示出當前包存在異常情況時,該屬性即為 true。 - PackageOffline 指示當前包是否離線或不能訪問。例如,當包文件安裝在 SD 卡等可移動介質上,且該介質處於被移除,則該屬性為 true。
- Servicing 指示當前包是否處於被占用狀態。
- Tampered 指示當前包是否處於感染狀態。改屬性返回 true 的一種可能原因是第三方反病毒軟件將當前包標記為了惡意程序。
Dependencies
屬性為 IReadOnlyList<Package>
類型,可用於獲取當前包的所有依賴項。註意該屬性僅用於獲取 Windows Store 應用包的依賴項。要獲取一個桌面應用包的依賴項,需使用 Win32 函數 GetPackageInfo。
有關 Package
的具體用法可參見 Github 上的示例代碼。
列舉 Windows Mobile 設備上已部署的應用包
Windows.Phone.Management.Deployment
命名空間下提供了一系列用於控制應用部署功能的類型,其中 InstallationManager 類型負責應用包的安裝管理。我們可以通過其中的 FindPackagesForCurrentPublisher
方法獲得當前 Windows Mobile 設備上安裝的同一發布者的應用包部署情況。該方法的返回類型為 IEnumerable<Package>
,我們可以進一步檢索返回值獲取具體某個應用包的詳細信息甚至啟動這些應用。
值得說明的是,Windows.Phone.Management.Deployment
僅在 Windows Mobile 設備上有效,故在 UWP 應用中使用時,需要配合 AnalyticsInfo.VersionInfo.DeviceFamily
檢測當前設備類型,選擇是否調用該命名空間下的方法。另外,‘InstallationManager‘ 類中提供的其它方法需要 ID_CAP_OEM_DEPLOYMENT
特別權限才能夠正常使用,故一般開發者無法使用。
獲取用戶數據賬戶信息
用戶數據賬戶是什麽呢?舉例說明,如果你用過 Android 系統,那麽你在 Android 的系統設置中會看到一項名為“賬戶”(Accounts)的設置欄目,其中列出了當前系統登錄的 Gmail、Outlook、Office、Exchange、微博等各種應用註冊的賬戶。這些賬戶就是用戶數據賬戶。Windows.ApplicationModel.UserDataAccounts
命名空間定義了用於控制郵件、預約、日歷等用戶數據賬戶信息的相關類型和枚舉。其中,UserDataAccount 類型表示一個用於存取郵件、聯系人、日歷等數據的用戶數據賬戶。UserDataAccountManager類型提供了與用戶數據賬戶交互的 API。UserDataAccountStore 代表用戶數據賬戶的儲存區。本文主要講述如何通過 Windows Store App API 獲取一些常用的信息,故在此不涉及操作用戶數據賬戶的內容。僅關註如何獲得一些數據。
要使用 UserDataAccounts
相關 API,要求應用在清單文件中聲明聯系人(contacts)、預約(appointments)、郵件(email)等功能中的一個或多個。
假設我們想要列舉出當前系統上登錄的所有用戶數據賬戶,並輸出這些賬戶的相關信息,首先我們需要通過 UserDataAccountManager.RequestStoreAsync
方法向系統請求用戶數據賬戶的儲存區。該方法接受一個 UserDataAccountStoreAccessType 枚舉類型的參數。該參數用於指定要求的用戶數據賬戶存儲區的訪問類型。UserDataAccountStoreAccessType
枚舉包含兩個成員:
AllAccountsReadOnly
對應用以及系統的用戶數據賬戶進行只讀訪問AppAccountsReadWrite
對當前應用的用戶數據儲存區進行讀/寫訪問
由枚舉可知,我們雖然可以檢索當前應用自身以外的用戶數據賬戶,但對於自身以外的用戶數據賬戶並沒有寫權限。
這裏我們選擇第一種訪問類型,使用以下代碼請求用戶數據賬戶儲存區:
UserDataAccountStore userDataAccountStore = await UserDataAccountManager.RequestStoreAsync(UserDataAccountStoreAccessType.AllAccountsReadOnly);
獲取到的用戶數據賬戶儲存區實例為 UserDataAccountStore
類型,該類型包含三個方法:
- CreateAccountAsync 創建一個用戶數據賬戶。
- FindAccountsAsync 根據指定的訪問類型返回用戶數據賬戶儲存區中的賬戶集合。
- GetAccountAsync 獲取指定用戶數據賬戶。
這裏我們調用 FindAccountsAsync
即可獲得所有用戶數據賬戶,並進行下一步操作。具體演示可參見 Github 上的示例代碼。
獲取系統用戶信息
在 Windows 8 應用中,我們使用 Windows.System.UserProfile
命名空間中的UserInformation 訪問系統登錄的用戶賬戶信息。而在 Windows 10 以及以後版本的 Windows 中,UserInformation
不再被支持。因為在 Windows 10 中,除非用戶授權,應用是不能獲取用戶信息的。而 Windows 8 應用則是默認得到授權的。並且,舊的 Windows 8 應用運行於 Windows 10 時也無法正常獲取用戶信息。
在 Windows 10 上我們需要使用新的 API 提供的Windows.System.User 類型獲取用戶信息。註意使用該 API 需要應用在清單文件中配置“用戶賬戶信息”(User Account Information) 功能。
User
類提供了三個靜態方法及其重載:
- CreateWatcher 創建一個監視器用於在列舉用戶賬戶或用戶賬戶發生變更時出發有關事件。
- FindAllAsync 查找所有用戶賬戶。
- FindAllAsync(UserType) 查找指定類型的用戶賬戶。
- FindAllAsync(UserType,UserAuthenticationStatus) 查找指定類型和驗證狀態的用戶賬戶。
- GetFromId 根據 ID 獲取指定用戶賬戶實例。
我們可以通過 FindAllAsync
或 GetFromId
方法獲取用戶賬戶實例,獲取用戶後,可以通過調用 GetPropertyAsync 方法取得該用戶的屬性信息。GetPropertyAsync
方法接受一個 string 類型的參數,具體傳入內容可以通過 KnownUserProperties 類中定義的屬性獲取。 KnownUserProperties
類中定義了已知可用的用戶賬戶屬性鍵名。例如,我們想要獲取賬戶顯示名稱時,可以采用如下方法:
string displayName = await user.GetPropertyAsync(KnownUserProperties.DisplayName);
User
類還包含以下三個屬性成員:
- AuthenticationStatus 獲取用戶賬戶的驗證狀態。返回值為枚舉類型UserAuthenticationStatus。
- NonRoamableId 獲取用戶的非漫遊 ID。
- Type 獲取用戶的用戶賬戶類型。返回值為枚舉類型 UserType。
配合使用 UserDataAccount 和 User 兩個 API 可以使應用更好地實現唯一用戶識別、用戶賬戶體系、自定義授權等功能特性。
更多內容請參閱本文後續內容更新。
第二篇:UWP 應用獲取各類系統、用戶信息 (2) - 商店授權信息、零售演示模式信息、廣告 ID、EAS 設備信息、硬件識別信息、移動網絡信息
閱讀地址:http://validvoid.net/uwp-system-info-collect-2/
UWP 應用獲取各類系統、用戶信息 (1) - 設備和系統的基本信息、應用包信息、用戶數據賬戶信息和用戶賬戶信息