Android ve iOS işletim sistemlerinde benzersiz “UUID” ihtiyaç duyabiliriz. Bunun içinde özel izinler almamız gerekmektedir.
Örnek olarak aşağıdaki kodları incelemenizi tavsiye ederim.
Dependecy Service
namespace Xamarin.App.Dependency.UUID { public interface IDevice { string DeviceUUID { get;} } }
Cross platform olarak hazırladığımız kodu IDevice arayüzünden türemiş Dependency Service sınıflarımız içerisinde DeviceUUID özelliği get olarak tanımlayalım.
Android
using Android.Telephony; using Java.Util; using Xamarin.Forms; using Xamarin.App.Dependency.UUID; [assembly: Dependency(typeof(Xamarin.Droid.Dependency.Device))] namespace Xamarin.Droid.Dependency { public class Device : IDevice { public string DeviceUUID { get { var telephonyDeviceId = string.Empty; var telephonySimSerialNumber = string.Empty; var telephonyManager = (TelephonyManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.TelephonyService); if (telephonyManager != null) { if (!string.IsNullOrEmpty(telephonyManager.DeviceId)) telephonyDeviceId = telephonyManager.DeviceId; if (!string.IsNullOrEmpty(telephonyManager.SimSerialNumber)) telephonySimSerialNumber = telephonyManager.SimSerialNumber; } var androidId = Android.Provider.Settings.Secure.GetString(Android.App.Application.Context.ContentResolver, Android.Provider.Settings.Secure.AndroidId); var deviceUuid = new UUID(androidId.GetHashCode(), ((long)telephonyDeviceId.GetHashCode() << 32) | telephonySimSerialNumber.GetHashCode()); var deviceId = deviceUuid.ToString(); return deviceId; } } } }
Android tarafında yetkiye ihtiyaç duyacağız. READ_PHONE_STATE yetkisini uygulamamıza almamız gerekiyor.
iOS
using System; using Foundation; using Security; using XamarinForms.Dependency.UUID; using XamarinForms.iOS.Dependency; [assembly: Xamarin.App.Dependency(typeof(Device))] namespace Xamarin.iOS.Dependency { class Device : IDevice { public string DeviceUUID { get { var query = new SecRecord(SecKind.GenericPassword); query.Service = NSBundle.MainBundle.BundleIdentifier; query.Account = "UniqueID"; NSData uniqueId = SecKeyChain.QueryAsData(query); if (uniqueId == null) { query.ValueData = NSData.FromString(System.Guid.NewGuid().ToString()); var err = SecKeyChain.Add(query); if (err != SecStatusCode.Success && err != SecStatusCode.DuplicateItem) throw new Exception("Cannot store Unique ID"); return query.ValueData.ToString(); } else { return uniqueId.ToString(); } } } } }
DeviceUUID uygulama içinde çağırmak için aşağıdaki kodu kullanabilirsiniz.
var deviceUUId = DependencyService.Get<IDevice>().DeviceUUID;