應用開發中,開發者時常需要獲取一些系統、用戶信息用於數據統計遙測、問題反饋、用戶識別等功能。本文旨在介紹在 Windows UWP 應用中獲取一些常用系統、用戶信息的方法。示例項目代碼可參見 Github: https://github.com/validvoid/UWP-SystemInfoCol
應用開發中,開發者時常需要獲取一些系統、用戶信息用於數據統計遙測、問題反饋、用戶識別等功能。本文旨在介紹在 Windows UWP 應用中獲取一些常用系統、用戶信息的方法。示例項目代碼可參見 Github:
由於涉及內容較多,故本文會分為多篇展開。本篇為系列第二篇,介紹如何獲取商店授權信息、零售演示模式信息、廣告ID、EAS 設備信息、硬體識別信息、硬體設備信息以及移動網路信息。
原博客閱讀地址:http://validvoid.net/uwp-system-info-collect-2/
商店授權信息
Windows.ApplicationModel.Store
命名空間提供了與 Windows Store 商店交互的類型和成員。我們使用其中的 CurrentApp 類獲取當前應用的授權信息。
需要註意的是,如果你還沒有 Windows Store 開發者賬號,或者正在進行本地調試,需要使用 CurrentAppSimulator
而不是 CurrentApp
類。顧名思義,CurrentAppSimulator
正是 CurrentApp
的模擬類,代替了過去 WP8 上的 Mock IAP Lib 用於模擬正式的商店交互。CurrentAppSimulator
的成員和用法與 CurrentApp
完全一致。推薦做法是使用編譯條件,Debug 時使用 CurrentAppSimulator
,而 Release 時使用 CurrentApp
。
有關
CurrentAppSimulator
的詳情,可以參考 MSDN 文檔。
授權信息
CurrentApp
類包含三個屬性:
- AppId 獲取 Windows Store 商店為通過認證的應用生成的 GUID。
- LicenseInformation 獲取當前應用的授權元數據。
- LinkUri 獲取當前應用商店頁面的 URI。
其中的 LicenseInformation
屬性是判斷當前應用整體授權情況(不包含應用內購產品的授權信息)的關鍵。該屬性的工作不要求網路連接,因此在設備離線狀態下,應用依然可以通過此 API 正確檢測授權情況。LicenseInformation
屬性 的類型為LicenseInformation。LicenseInformation
類型包含四項只讀屬性:
- ExpirationDate 獲取相對於系統時鐘的授權過期時間。
- IsActive 指示當前授權狀態是否有效。
- IsTrial 指示當前授權是否為試用授權。
- ProductLicenses 獲取與當前應用關聯的應用內商品授權列表。
我們可以通過前三項屬性控制應用的試用、購買授權。對於試用版應用,試用期間 IsTrial
屬性會返回 true, IsActive
屬性也會返回 true。超過試用期,IsActive
會返回 false。從試用版升級為完整版,則IsTrial
屬性會返回 false,IsActive
屬性會返回 true。
市場活動 ID
除以上成員外,CurrentApp
類還提供了一個方法GetAppPurchaseCampaignIdAsync。該方法用於返回市場活動 ID。這是 Windows 10 新增的一項特性。市場活動 ID(campaign ID) 本質上是一個可自定義的參數,允許你據此獲得應用安裝的來源渠道,從而進一步開展應用推廣、用戶活動、分渠道數據分析等工作。假設你要開展影響活動,從微博安裝應用的用戶可獲贈某項應用內產品,那麼在微博發佈應用的商店下載鏈接時,就需要附加上市場活動 ID。當用戶通過此攜帶市場活動 ID 的鏈接安裝你的應用並滿足轉化條件時,用戶啟動應用後,應用可以通過 GetAppPurchaseCampaignIdAsync
獲取到你在推廣鏈接中預置的市場活動 ID,進而為該用戶發放贈品。從用戶點擊攜帶市場活動 ID 的鏈接到完成應用安裝,就實現了一次轉化。
創建市場活動 ID
如果你希望發佈應用的商店頁面鏈接,使用戶通過瀏覽器導航跳轉進入應用的商店網頁進行安裝,那麼需要使用 HTTP 格式的商店鏈接,並附加市場活動 ID 參數。例如:
圖中前半部分為 Skype 的商店頁面鏈接,在此鏈接後附加了 ?cid=facebook_campaign
表示這是來自 Facebook 頁面的推廣鏈接。
而如果你希望在其它應用中通過附加市場活動 ID 的鏈接直接跳轉到 Windows Store 商店應用推廣你的應用,則需要使用協議格式的 URL。同樣以 Skype 舉例,在另一個應用中,使用代碼方式跳轉到鏈接:
ms-windows-store://pdp/?PRODUCTID=9wzdncrfj364&cid=facebook_campaign
市場活動 ID 的轉化條件
你可以在 Windows 開發人員中心面板中的“通道和轉換報告”欄目查看市場活動 ID 的轉化數據。需要註意的是,對於該欄目的數據統計,以及調用 GetAppPurchaseCampaignIdAsync
以編程方式獲得市場活動 ID 的滿足條件是不一樣的。
要被“通道和轉換報告”統計認定為有效轉化,需要滿足以下條件:
- 具有已識別的微軟帳戶的用戶點擊了自定義市場活動 ID 的應用 URL,然後重定向到該應用的 Windows 應用商店頁面。
- 該用戶在完成上一步動作後 24 小時內安裝該應用。即使用戶點擊了自定義市場活動 ID 的 Windows 應用商店 URL,但在另一臺登錄相同微軟賬戶電腦或設備上安裝該應用,這仍然認定為有效轉化。
要被編程方式獲取市場活動 ID 認定為有效轉化,需要滿足以下條件:
- 具有已識別的 Microsoft 帳戶的用戶點擊了自定義市場活動 ID 的應用 URL,然後重定向到該應用的 Windows 應用商店頁面。
- 用戶在點擊 URL 後跳轉到的 Windows 應用商店頁面立即安裝該應用。如果用戶離開頁面,然後在 24 小時內返回到該頁面(無論在同一臺電腦或設備上還是不同的電腦或設備上)並安裝應用,將認定為“通道和轉換報告”的有效轉化,但如果你以編程方式獲取市場活動 ID,則這不會認定為有效轉化。
有關市場活動 ID 的更多詳情,可以參考 MSDN 文檔 Create a custom app promotion campaign,或中文版《創建自定義應用促銷活動》。不過個人覺得中文版的翻譯不是很順暢,推薦閱讀英文版。之後我也會另寫一篇博客補上市場活動 ID 的更多相關內容。
零售演示模式信息
Windows 10 包含一個隱藏的“零售演示模式”。啟用該模式時 Windows 會刪除系統當前登錄的賬戶信息,自動開啟一個演示用賬戶。如果你的應用被選為零售 Windows 設備上的預裝應用,那麼可能需要獲取與系統零售演示模式相關的信息。 Windows.System.Profile
命名空間下的 RetailInfo 正是提供次功能的一個工具類。
RetailInfo
類只包含一個方法 IsDemoModeEnabled
和一個屬性 Properties
。
'IsDemoModeEnabled' 用於檢測當前應用是否運行於零售演示模式。如果是,返回 true,否則將返回 false。假設你的應用是 Windows 設備的預裝應用,你希望顧客在商店體驗 Windows 系統和你的應用時展示一些不同的內容,就可以通過此方法判斷當前是否運行於演示模式,如果是則展示用於演示的內容,比如產品介紹視頻。
只讀屬性 Properties
返回一系列用於演示模式應用的屬性設置。當應用不處於演示模式時,該屬性不返回任何內容。類似於上一篇文章中提到的 KnownUserProperties
,RetailInfo.Properties
的鍵名由 KnownRetailInfoProperties 類定義,該類包含以下只讀屬性:
屬性 | 訪問類型 | 說明 |
---|---|---|
BatteryLifeDescription | 只讀 | 獲取電池續航信息屬性值的鍵名。 |
DisplayDescription | 只讀 | 獲取顯示設備說明信息屬性值的鍵名。 |
DisplayModelName | 只讀 | 獲取顯示設備型號信息屬性值的鍵名。 |
FormFactor | 只讀 | 獲取設備規格信息屬性值的鍵名。 |
FrontCameraDescription | 只讀 | 獲取前置攝像頭信息屬性值的鍵名。 |
GraphicsDescription | 只讀 | 獲取圖形處理器信息屬性值的鍵名。 |
HasNfc | 只讀 | 獲取是否搭載 NFC 設備信息屬性值的鍵名。 |
HasOpticalDrive | 只讀 | 獲取是否搭載光碟機信息屬性值的鍵名。 |
HasSdSlot | 只讀 | 獲取是否搭載 SD 卡插槽信息屬性值的鍵名。 |
IsFeatured | 只讀 | 獲取是否為推薦產品信息屬性值的鍵名。 |
IsOfficeInstalled | 只讀 | 獲取是否安裝 Office 信息屬性值的鍵名。 |
ManufacturerName | 只讀 | 獲取製造商名稱屬性值的鍵名。 |
Memory | 只讀 | 獲取記憶體信息屬性值的鍵名。 |
ModelName | 只讀 | 獲取設備型號名屬性值的鍵名。 |
Price | 只讀 | 獲取設備價格信息屬性值的鍵名。 |
ProcessorDescription | 只讀 | 獲取處理器信息屬性值的鍵名。 |
RearCameraDescription | 只讀 | 獲取背部攝像頭信息屬性值的鍵名。 |
RetailAccessCode | 只讀 | 獲取零售訪問代碼信息屬性值的鍵名。 |
ScreenSize | 只讀 | 獲取屏幕尺寸信息屬性值的鍵名。 |
StorageDescription | 只讀 | 獲取儲存設備說明信息屬性值的鍵名。 |
Weight | 只讀 | 獲取設備重量信息屬性值的鍵名。 |
WindowsEdition | 只讀 | 獲取搭載 Windows 版本信息屬性值的鍵名。 |
廣告 ID
Windows.System.UserProfile.AdvertisingManager
類提供了一個屬性 AdvertisingId
,該屬性返回一個字元串類型的值,即廣告 ID。廣告 ID 也是開發者實現應用數據統計的重要參考項之一。不過使用 AdvertisingId
中有幾點問題需要註意:
- 廣告 ID 是每用戶、每設備唯一的
- 廣告 ID 可以被用戶通過系統設置關閉
- 廣告 ID 不具有持久性,在不同情況下會發生改變
- 廣告 ID 在兒童賬戶中是關閉的
有關廣告 ID 的更多介紹,以及更多獲取設備唯一 ID 實現數據統計的方案介紹,請參閱之前的文章 《Windows Store 應用獲得設備 ID 的幾種方案》。
EAS 設備信息
Windows.Security.ExchangeActiveSyncProvisioning
命名空間下的EasClientDeviceInformation 類提供了獲取 EAS 設備信息的能力。所謂的 EAS 即 Exchange ActiveSync。EAS 是一套使移動設備與 Exchange 服務同步數據的協議。EasClientDeviceInformation
往往也是開發者獲取系統信息的一個重要渠道,例如,使用 Github 上的示例代碼在一臺搭載 Windows 10 Mobile 的名為 "Steve's Phone" 的 Lumia 1520 上會得到如下 EAS 信息輸出:
EAS Client Device Information
Id: 3d776048-51ef-da40-d1ad-3ce62a9b8ca4
FriendlyName: Steve's Phone
OperatingSystem: WindowsPhone
SystemFirmwareVersion: 02540.00019.15236.45005
SystemHardwareVersion: 5.3.0.
SystemManufacturer: NOKIA
SystemProductName: RM-939_apac_prc_200
SystemSku: NOKIA RM-939_apac_prc_200
而在一臺搭載了技嘉 B85 主板的 Windows 10 台式機上運行則會得到以下 EAS 輸出:
Id: 3f69ad8d-1362-3f96-507c-453ff2efbe7c
FriendlyName: Creeper's PC
OperatingSystem: WINDOWS
SystemFirmwareVersion:
SystemHardwareVersion:
SystemManufacturer: Gigabyte Technology Co., Ltd.
SystemProductName: B85M-D3V
SystemSku: To be filled by O.E.M.
EasClientDeviceInformation
的使用方法也很簡單:
var eascdi = new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation();
EasClientDeviceInformation
包含了以下只讀屬性提供 EAS 相關的系統、設備信息:
- FriendlyName 返回設備名稱。
- Id 返回設備 ID。
- OperatingSystem 返回設備操作系統。
- SystemFirmwareVersion 返回系統固件版本號。
- SystemHardwareVersion 返回硬體版本號。
- SystemManufacturer 返回製造商名稱。
- SystemProductName 返回設備型號名。
- SystemSku 返回 SKU。此項僅限 Windows Store 應用使用。其內容從註冊表獲取,如果註冊表不可訪問,則該項返回空字元串。當為空時,建議以設備型號作為 SKU 值,否則應當適用製造商名稱和設備型號名構造 SKU 值。
如果你打算使用 EAS ID 做唯一設備是別,需要註意 EAS ID 是每用戶、每設備、每應用唯一的,這意味著不同用戶、不同設備、不同應用獲取到的 EAS ID 都是不一樣的。有關設備 ID 的更多內容,可參閱我之前編寫的文章《Windows Store 應用獲得設備 ID 的幾種方案》。
硬體識別信息
如果你打算在你的應用中實現每設備邏輯,那麼就會用到 Windows.System.Profile
命名空間下定義的 HardwareIdentification 類。該類只包含一個方法:GetPackageSpecificToken。該方法用於返回當前應用在當前設備的硬體識別 ID(簡稱為 ASHWID)。方法的返回值類型為 HardwareToken。
HardwareToken
類型包含三個只讀屬性:
- Certificate 獲取用於校驗硬體識別 ID 的證書。
- Id 獲取硬體識別 ID。
- Signature 獲取用於校驗硬體識別 ID 的數字簽名。
要獲得 ASHWID 的值,我們可以使用如下方法:
string strDeviceUniqueId = ""; string strSignature = ""; string strCertificate = ""; var token = HardwareIdentification.GetPackageSpecificToken(null); IBuffer hardwareId = token.Id; IBuffer signature = token.Signature; IBuffer certificate = token.Certificate; var byteArray = new byte[hardwareId.Length]; var dataReader = DataReader.FromBuffer(hardwareId); dataReader.ReadBytes(byteArray); foreach (byte b in byteArray) { string strTemp = b.ToString(); if (1 == strTemp.Length) { strTemp = "00" + strTemp; } else if (2 == strTemp.Length) { strTemp = "0" + strTemp; } strDeviceUniqueId += strTemp; }
需要註意的是,ASHWID 是用戶間一致,每設備、每應用唯一的。也就是說同一用戶在不同設備上使用同一應用獲得的 ASHWID 取值不同;同一用戶在相同設備上使用不同應用獲得的 ASHWID 取值也不同。
有關 ASHWID 以及實現每設備應用邏輯的更多詳情可以參閱我之前編寫的文章《Windows Store 應用獲得設備 ID 的幾種方案》。
移動網路信息
在 Windows.Networking.NetworkOperators
命名空間中定義了很多移動網路相關 API。例如 MobileBroadbandAccount
類表示了移動寬頻賬戶,'MobileBroadbandNetwork' 類表示移動寬頻網路等。該命名空間下提供的所有功能特性屬於微軟合作伙伴 API。這意味著開發者需要從微軟獲得特定的私有許可權才能在應用中調用這些 API 並正常工作。由於我不是手機製造商,也不是移動網路工作人員,無法拿到這些私有許可權的授權,並且大部分開發者也拿不到,故在此不再贅述此命名空間相關 API,僅在此給出參考資料,有興趣的朋友可以參閱:
- Mobile Broadband Overview
- Mobile broadband WinRT API overview
- List of mobile broadband Windows Runtime APIs
- Best practices for using Mobile Broadband Windows Runtime API
UWP 應用獲取各類系統、用戶信息第二篇到此結束。後續隨著對 UWP 各種 API 瞭解的深入,我會繼續更新本系列文章和示例代碼演示如何獲取常用信息。