Получите уникальный идентификатор устройства (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.xml
→ Capabilities
вкладка → включить 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, иначе он выдает ошибку.
Ответ 7
Я нашел это новое свойство HostInformation.PublisherHostId
Больше информации на
http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.phone.system.analytics.hostinformation.publisherhostid.aspx..
Ответ 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 можно найти здесь