Как получить идентификатор устройства в формах Xamarin?
Как я могу получить уникальный идентификатор устройства в Android и iOS, используя C# в Xamarin Froms? Я использую Центр уведомлений Azure для отправки уведомлений. Я имею в виду этот блог. Но в Android я не могу найти соответствующие "Настройки"
3 ответа
Согласно вашему опубликованному посту в блоге http://codeworks.it/blog/?p=260 и вашему краткому описанию проблемы, я постараюсь ответить на ваш вопрос.
Для использования AndroidAndroid.Provider.Settings.Secure.GetString(Forms.Context.ContentResolver, Android.Provider.Settings.Secure.AndroidId);
Для iOS см. Ваш пост.. или при необходимости сохраните IdentifierForVendor
например, в вашем AppDelegate
и вернуть это значение в вашем IOSDevice
класс (используя имя в блоге). использование UIDevice.CurrentDevice.IdentifierForVendor.ToString()
получить идентификатор устройства на iOS.
Подробно описано здесь. Но на самом деле вам не нужно делать так и пытаться получить идентификатор от каждого устройства. Простое создание Guid и сохранение на устройстве также работает. Xamarin имеет Prefences для постоянного значения в устройстве.
Вы можете создать гид и сохранить его в Prefecences, как я сделал ниже:
var deviceId = Preferences.Get("my_deviceId", string.Empty);
if(string.IsNullOrWhitespace(deviceId))
{
deviceId = System.Guid.NewGuid().ToString();
Preferences.Set("my_deviceId", deviceId);
}
Преимущество этого подхода заключается в том, что ваш идентификатор, который вы генерировали, переносится в другое приложение, когда у вас все тот же идентификатор; но если вы удалите и переустановите снова, вы получите новый идентификатор. В других случаях, когда вы получаете идентификатор устройства, он будет изменен при переносе приложения на другое устройство.
Для других случаев, когда вы хотите получить идентификатор с устройства:
iOS: IdentifierForDevice
public string Id => UIDevice.CurrentDevice.IdentifierForVendor.AsString();
Android: серийный, getSerial и AndroidId
string id = string.Empty;
public string Id
{
get
{
if (!string.IsNullOrWhiteSpace(id))
return id;
id = Android.OS.Build.Serial;
if (string.IsNullOrWhiteSpace(id) || id == Build.Unknown || id == "0")
{
try
{
var context = Android.App.Application.Context;
id = Secure.GetString(context.ContentResolver, Secure.AndroidId);
}
catch (Exception ex)
{
Android.Util.Log.Warn("DeviceInfo", "Unable to get id: " + ex.ToString());
}
}
return id;
}
}
UWP: GetPackageSpecificToken или GetSystemIdForPublisher
string id = null;
public string Id
{
get
{
if (id != null)
return id;
try
{
if (ApiInformation.IsTypePresent("Windows.System.Profile.SystemIdentification"))
{
var systemId = SystemIdentification.GetSystemIdForPublisher();
// Make sure this device can generate the IDs
if (systemId.Source != SystemIdentificationSource.None)
{
// The Id property has a buffer with the unique ID
var hardwareId = systemId.Id;
var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);
var bytes = new byte[hardwareId.Length];
dataReader.ReadBytes(bytes);
id = Convert.ToBase64String(bytes);
}
}
if (id == null && ApiInformation.IsTypePresent("Windows.System.Profile.HardwareIdentification"))
{
var token = HardwareIdentification.GetPackageSpecificToken(null);
var hardwareId = token.Id;
var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(hardwareId);
var bytes = new byte[hardwareId.Length];
dataReader.ReadBytes(bytes);
id = Convert.ToBase64String(bytes);
}
if (id == null)
{
id = "unsupported";
}
}
catch (Exception)
{
id = "unsupported";
}
return id;
}
}
Есть плагин, представленный Джеймсом Монтемагно.
Найдите его в пакетах NuGet как Xam.Plugin.DeviceInf. Ссылка на Github: https://github.com/jamesmontemagno/DeviceInfoPlugin