بدست آوردن Device ID در Xamarin.Forms

بدست آوردن Device ID در Xamarin.Forms

Device ID یک شناسه منحصر به فرد برای هر دستگاه است که در برنامه نویسی می تواند کمک خوبی برای شناسایی دستگاه باشد.
به عنوان مثال میخواهیم اپلیکیشنی که درست میکنیم با نام کاربری و کلمه عبور تنها در یک دستگاه بتواند لاگین شود، برنامه به این صورت است که تنظیمات خاصی را برای هر دستگاه در سرور ذخیره میکند با Device ID میتوانیم تنظیمات را تفکیک کنیم.
در کل از Device ID برای تفکیک اطلاعات می توانیم استفاده کنیم.
برای این کا از Dependency Service استفاده می کنیم.
خوب اجازه بدهید کار را شروع کنیم، یک اینترفیس با نام IDevice در پروژه مشترک می سازیم که دارای یک متد GetIdentifier می باشد:

using System;
using System.Collections.Generic;
using System.Text;

namespace GetDeviceId.Interfaces
{
    public interface IDevice
    {
        string GetIdentifier();
    }
}

بعد از اتمام پروژه به راحتی می توانید با کد زیر شناسه دستگاه یا Device ID را بدست بیاورید:

	IDevice device = DependencyService.Get<IDevice>();
	string deviceIdentifier = device.GetIdentifier();

حالا در پروژه ویندوز کلاس WinPhoneDevice را اضافه می کنیم و قابلیت ID_CAP_IDENTITY_DEVICE را به پروژه اضافه میکنیم.

[assembly: Xamarin.Forms.Dependency(typeof(WinPhoneDevice))]
namespace XFUniqueIdentifier.WinPhone
{
 public class WinPhoneDevice : IDevice
 {
  public string GetIdentifier()
  {
   byte[] myDeviceId = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
   return Convert.ToBase64String(myDeviceId);
  }
 }
}

دقت داشته باشید که این کلاس اینترفیس IDevice که در ابتدا ساختیم را پیاده سازی می کند.

در پروژه اندروید هم کلاسی با نام AndroidDevice اضافه می کنیم و کدهای زیر را در این کلاس می نویسیم:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using GetDeviceId.Droid;
using GetDeviceId.Interfaces;
using Xamarin.Forms;

[assembly: Xamarin.Forms.Dependency(typeof(AndroidDevice))]
namespace GetDeviceId.Droid
{
    public class AndroidDevice : IDevice
    {
        public string GetIdentifier()
        {
            return Android.Provider.Settings.Secure.GetString(Forms.Context.ContentResolver, Android.Provider.Settings.Secure.AndroidId);
        }
    }
}

در پروژه اندروید هم به همان صورت متد GetIdentifier اینترفیس IDevice را پیاده سازی کردیم.

و حالا در IOS، قبل تر ها در IOS به استفاده از Device UniqueIdentifier API شناسه دسنگاه یا Device ID را بدست می آوردیم اما این API در نسخه های جدیدتر کارایی ندارد.
برای این کار کلاس IOSDevice را به پروژه IOS اضافه می کنیم و مجددا متد GetIdentifier از اینترفیس IDevice را پیاده سازی میکنیم:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

using Foundation;
using GetDeviceId.Interfaces;
using GetDeviceId.iOS;
using UIKit;

[assembly: Xamarin.Forms.Dependency(typeof(IOSDevice))]
namespace GetDeviceId.iOS
{
    public class IOSDevice : IDevice
    {
        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern uint IOServiceGetMatchingService(uint masterPort, IntPtr matching);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern IntPtr IOServiceMatching(string s);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern IntPtr IORegistryEntryCreateCFProperty(uint entry, IntPtr key, IntPtr allocator, uint options);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern int IOObjectRelease(uint o);

        public string GetIdentifier()
        {
            string serial = string.Empty;
            uint platformExpert = IOServiceGetMatchingService(0, IOServiceMatching("IOPlatformExpertDevice"));
            if (platformExpert != 0)
            {
                NSString key = (NSString)"IOPlatformSerialNumber";
                IntPtr serialNumber = IORegistryEntryCreateCFProperty(platformExpert, key.Handle, IntPtr.Zero, 0);
                if (serialNumber != IntPtr.Zero)
                {
                    serial = NSString.FromHandle(serialNumber);
                }

                IOObjectRelease(platformExpert);
            }

            return serial;
        }
    }
}

کار تمام است، حالا همانطور که در ابتدای مقاله گفته شد می توانیم با استفاده از تکه کد زیر شناسه دستگاه یا همان Device ID را بدست بیاوریم:
 

IDevice device = DependencyService.Get<IDevice>();
string deviceIdentifier = device.GetIdentifier();

جمع بندی:
در این مقاله شناسه دستگاه یا همان Device ID را بدست آوردیم.
در IOS کدهای قبل منقضی شده اند و باید از روشی که معرفی شد به عنوان جایگزین استفاده کنید.

نظرات (0)

نظرسنجی
میزان رضایت شما از امکانات و مقالات سایت