如何在Windows Phone和Windows 8 Store中获取到设备ID

背景

很多情况下,我们需要去辨识当前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