Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
背景
很多情况下,我们需要去辨识当前App运行的设备,以便应用一些适合此设备的内容。Windows Phone 7时代,我们有一些原生的去获取设备号的方法。但是来到Windows Phone 8时代,却有些改变。至少在Windows 8 RTM中,获取Unique ID的方法消失了。但是这个问题在这一年里被广泛的提及。
解决方法
Windows Phone 7.X
典型用法:
(注意:不要忘记把ID_CAP_IDENTITY_DEVICE加入到App Manifest里面)
1: byte[] myDeviceID = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
2:
3: string DeviceIDAsString = Convert.ToBase64String(myDeviceID);
在Microsoft.Phone.Info.DeviceExtendedProperties中有一句话需要注意:
在 Windows Phone OS 7.0 中,此类被用来查询特定于设备的属性。在 Windows Phone OS 7.1 中,DeviceExtendedProperties 的大多数属性已弃用,而应改用新的 DeviceStatus 类。但是,在适当时,您仍然可以使用以下任何未弃用的属性。
不管怎样,我们依然需要使用DevieExtendedProperties去获取“DeviceUniqueID”。因为在新的Microsoft.Phone.Info.DeviceStatus中没有被提及。
Windows Phone 8
当然,上文提及的API在Windows Phone 8中还是可以使用的。但是新的API在Windows Phone 中也有所提及。使用HostInformation.PublisherHostId可以直接获取到一段包含设备号的string。并且,这个API可以在.NET和C++中使用。不过,这里也有一些改变,对于在Windows Phone 8或后续版本中运行的不同的Windows Phone 8的app来说,DeviceUniqueID的值也是不一样的。换一种说法也就是,两个App分别被不同的Windows Phone Store的开发者上传,他们得到的DeviceUniqueID也是不同的。
Windows 8 Store App
随着Windows 8 RTM的发布,App Specific Hardware ID (ASHWID)也随之公布。不像手机一样,平板或者PC的硬件是可以随时做一些改动的,所以跟Windows Phone UniqueID一样也失去了一些意义。在预览版的时候,我们被问到如何去做到获取唯一标识时,我们会提供一个workaround:
- 在App启动的时候得到一个GUID
- 得到运行此App的LiveID
幸运的时候,在随着Windows 8 RTM发布时,Guidance on using the App Specific Hardware ID (ASHWID) to implement per-device app logic这篇文章吸引了我们的眼球。在Windows 8 RTM中,我们可以通过使用ASHWID作为Windows 8设备的唯一标识。我们可以使用HardwareIdentification.GetPackageSpecificToken去获得。
用法:
1: HardwareToken hwToken = HardwareIdentification.GetPackageSpecificToken(null);
2:
3: IBuffer hwID = hwToken.Id;
4:
5: byte[] hwIDBytes = hwID.ToArray(); //WindowsRuntimeBufferExtensions.ToArray(hwID)
6:
7: string deviceID = hwIDBytes.Select(b => b.ToString()).Aggregate((b, next) => b + "," + next);
8:
9: //sample id result : 3,0,188,97,3,0,76,128,3,0,250,138,5,0,220,130,6,0,1,0,4,0,20,164,1,0,204,49,2,0,226,37,9,0,22,72
对于这段代码的理解,还请各位去参看MSDN的讲解,这里就不过多的提及。
总体来讲,ASHWID提供了一种对于设备和App间的强关联。为了保护用户的隐私,ASHWID针对于不同的App也是会不一样的。除非硬件发生改动,同一App获取到的ASHWID是不会发生改变的。例如,用户把USB的蓝牙适配器移除。后端的服务就可以通过验证ASHWID的改动来判断硬件是否发生了改变。
English Version: https://blogs.msdn.com/b/lighthouse/archive/2013/08/27/how-to-identify-unique-device-for-windows-8-and-windows-phone-app.aspx