在Windows Phone 8下获取唯一设备ID(UDID)

47

在Windows Phone 8(WP8)上,是否存在任何不会因硬件更改、应用重新安装等而改变的唯一设备ID(UDID)或任何类似的ID可以读取?

在旧版本的Windows Phone中有这样的ID: WP7:Windows Phone的设备状态

WP7.1:DeviceStatus 类

但它们在SDK 8.0中不再起作用。

为什么我要询问: 我的想法是,用户在第一次启动应用程序时可以获得一些免费积分,我想避免用户只需重新安装应用程序即可获取新的免费积分。电子邮件或电话号码注册可以解决此问题,但如果可能,我不想在第一次启动时打扰用户进行注册。

---///---解决方案----------

我可以确认在WP 8.0中,DeviceExtendedProperties.GetValue("DeviceUniqueId") 仍然有效。当我阅读以下文本时感到有点困惑:

在Windows Phone OS 7.0中,使用此类查询特定于设备的属性。在Windows Phone OS 7.1中,DeviceExtendedProperties中的大多数属性已被弃用,并且应改用新的DeviceStatus类。但是,在适当的情况下,仍然可以使用以下未弃用的任何属性。

MSDN:DeviceExtendedProperties 类

我可以运行以下代码,删除应用程序并重新安装它,并获得相同的ID:

byte[] myDeviceID = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
string DeviceIDAsString = Convert.ToBase64String(myDeviceID);
MessageBox.Show(DeviceIDAsString);

4
据我所了解,移动操作系统不提供UDID是因为它可以追踪用户,因此注册选项可能是一个更好的选择。否则,在未来,UDID可能不再可用。这已经在iOS中发生过了。 - Davin Tryon
我知道,苹果也有过同样的问题,他们通过使用供应商ID来“缓解”这个问题。所以我想微软是否做了类似的事情?没有吗? - flexo
说实话,我对Windows Phone 8不太确定,因为我没有在其上进行开发。但原则上,我们应该尽量避免使用静态标识符,除非它们存储在服务器上。欧盟已经讨论了有关避免在移动设备上跟踪用户的方式的立法问题。 - Davin Tryon
9个回答

31

我还没有开始为 Windows Phone 8 开发,仍在使用 7,但您仍然应该能够使用原始的 DeviceExtendedProperties 类来获取设备唯一 ID。

DeviceExtendedProperties.GetValue("DeviceUniqueId")

好的,我可以确认这个。我编辑了我的问题。 - flexo
2
同时,WMAppMenifest.xml 文件中也应该检查 ID_CAP_IDENTITY_DEVICE。 - QAMAR

20

我遇到了一个关于返回空值的问题, 然后想起需要打开它.

WMAppManifest.xml 文件中的 -> Capabilities 标签中 -> 打开 ID_CAP_IDENTITY_DEVICE


没错!如果没有这个能力,以上解决方案是行不通的。 - Andrei Drynov

8
这个DeviceUniqueId有一个限制 - 它仅对一个发布者是唯一的。因此,它不是真正意义上的设备唯一标识符,而是对于一个发布者的唯一设备标识符。我们注意到这一点是在处理某个客户项目时发现的,我们试图从不同帐户(客户在两个不同帐户下发布)中识别相同的手机。

1
这听起来非常重要。你能详细说明一下吗?这是否意味着某个手机在不同的应用程序(与发布者相关联)尝试读取它时,可能会获得不同的ID? - MEMark
2
这意味着来自相同发布者的两个不同应用程序将从给定设备检索相同的 DeviceUniqueId 值,但由第二个发布者编写的应用程序将检索到不同的 DeviceUniqueId。 - Jon B
请您能否提供一个发布者的示例? - eeadev

4
您可以通过DeviceExtendedProperties.GetValue("DeviceUniqueId")获取您自己的wp8设备ID。以下是以字符串形式获取设备ID的简单方法。
byte[] id = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
 string   deviceID = Convert.ToBase64String(id);

2
我使用了这个:
    private static String getDeviceId()
        {
            byte[] id = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
            return BitConverter.ToString(id).Replace("-", string.Empty);
        }

但关键是要在WMAppManifest中检查ID_CAP_IDENTITY_DEVICE,否则会抛出错误。


2

微软在Windows Phone 8和Windows 8中没有提供设备唯一标识(DeviceUniqueId),试图避免用户跟踪,但受到开发者社区的压力加大后,他们又重新引入了此功能。

在Windows 8.1中,微软引入了新的AdvertisingId API,并可能在随后的Windows Phone 8.1/9版本中引入类似的标识符,以识别跨应用的唯一用户。


嗨,Prabh Arora,谢谢您分享有用的信息。我有一个关于AdvertisingId的问题,用户是否可以在任何时候重置或更改AdvertisingId,因为在iOS用户方面可以这样做。 请回复。提前致谢。 - Anil Chahal
我刚刚进行了一些研究,并发现了这篇文章:http://en.kioskea.net/faq/34379-windows-8-1-prevent-apps-from-using-your-advertising-id用户可以选择防止开发者获得他的广告ID,所以总体而言我们回到了起点。如果您找到任何其他用于跟踪的替代唯一功能,请回复。 - Anil Chahal

1

1
string myDeviceID = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");
string DeviceIDAsString = Convert.ToBase64String(myDeviceID);

我已经使用过这个来获取Windows Phone独特的设备ID。


0
以上的答案适用于Windows Phone 7和8 Silverlight。然而,它们不适用于Windows Phone RT(通用)或商店应用程序,因为SDK没有此dll库(Microsoft.Phone)。
以下是在Windows Phone 8.1 RT(通用/商店应用程序)上获取设备ID和名称(以及可能的其他信息)的方法。
private string GetHardwareId()
{
    var token = HardwareIdentification.GetPackageSpecificToken(null);
    var hardwareId = token.Id;
    var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);

    byte[] bytes = new byte[hardwareId.Length];
    dataReader.ReadBytes(bytes);

    return BitConverter.ToString(bytes);
}

关于在Windows RT上读取设备信息的更多详细信息可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接