Получите уникальный идентификатор устройства (UDID) под Windows Phone 8

Есть ли уникальный идентификатор устройства (UDID) или любой аналогичный идентификатор, который я могу прочитать на Windows Phone 8 (WP8), который не изменяется с аппаратными изменениями, переустановкой приложений и т.д.?

В старых версиях Windows Phone были такие ID: WP7: Состояние устройства для Windows Phone

WP7.1: DeviceStatus Class

Но с SDK 8.0 они больше не работают.

Почему я спрашиваю: Идея заключается в том, что пользователь получает бесплатные кредиты с первого запуска приложения, и я хочу избежать того, что пользователь просто переустанавливает приложение для получения новых бесплатных кредитов. Регистрация с помощью электронной почты или номера телефона может решить эту проблему, но если смогу, я не хочу, чтобы пользователи беспокоились при первом запуске с регистрацией.

---///--- Решение ----------

Я могу подтвердить, что DeviceExtendedProperties.GetValue( "DeviceUniqueId" ) все еще работает в WP 8.0. Немного смутился, когда я прочитал следующий текст:

В Windows Phone OS 7.0 этот класс использовался для запроса конкретных устройств свойства. В ОС Windows Phone 7.1 большинство свойств в DeviceExtendedProperties устарели, а новый DeviceStatus класс должен использоваться вместо этого. Однако, при необходимости, вы можете все еще используйте любые из ниже перечисленных свойств, которые не устарели.

MSDN: класс DeviceExtendedProperties

Я могу запустить следующий код, удалить приложение и переустановить его и получить тот же ID:

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

Ответ 1

Я еще не начал разрабатывать Windows Phone 8, все еще на 7, но вы все равно должны использовать оригинальный DeviceExtendedProperties класс, чтобы тянуть вернуть уникальный идентификатор устройства.

DeviceExtendedProperties.GetValue("DeviceUniqueId")

Ответ 2

У меня возникла проблема с возвратом нулевого значения. Затем вспомнил, что он должен быть включен.

В WMAppManifest.xmlCapabilities вкладка → включить ID_CAP_IDENTITY_DEVICE

Ответ 3

Там есть поворот к этому DeviceUniqueId - он уникален только для одного издателя. Таким образом, это не уникальный уникальный идентификатор устройства, а уникальный идентификатор устройства для одного издателя. Мы заметили, что когда мы работали над каким-то проектом клиента, где мы пытались идентифицировать один и тот же телефон из разных учетных записей (клиент публикуется в двух разных аккаунтах).

Ответ 4

Вы можете получить свой собственный идентификатор устройства wp8 с помощью DeviceExtendedProperties.GetValue( "DeviceUniqueId" ) Вот простой способ получить deviceId как строку

byte[] id = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
 string   deviceID = Convert.ToBase64String(id);

Ответ 5

Не предоставляя DeviceUniqueId в Windows Phone 8 и Windows 8, Microsoft пыталась избежать отслеживания пользователей, но с повышенным давлением со стороны сообщества Dev они вернули его снова.

В Windows 8.1 Microsoft представила новый API AdvertisingId и может также предоставить аналогичный идентификатор для идентификации уникального пользователя через приложения в последующих версиях Windows Phone 8.1/9.

Ответ 6

Я использовал это:

    private static String getDeviceId()
        {
            byte[] id = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
            return BitConverter.ToString(id).Replace("-", string.Empty);
        }

Но ключ должен проверить ID_CAP_IDENTITY_DEVICE в WMAppManifest, иначе он выдает ошибку.

Ответ 8

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

Я использовал это для уникального идентификатора устройства для телефона Windows.

Ответ 9

Ответы выше работают для Windows Phone 7 и 8 Silverlight. Однако они не будут работать для Windows Phone RT (Universal) или Store Apps, поскольку SDK не имеет библиотеки DLL (Microsoft.Phone).

Вот как вы получите идентификатор устройства и имя (и, возможно, другую информацию) в Windows Phone 8.1 RT (Universal/Store Apps).

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 можно найти здесь