web-dev-qa-db-ja.com

Xamarin FormsでデバイスIDを取得する方法は?

AndroidおよびXamarin Fromsでc#を使用するiOS?でデバイス固有IDを取得するにはどうすればよいですか?通知の送信にAzure Notification Hubを使用しています。これを参照しています blog 。ただし、Androidでは、関連する「設定」が見つかりません

10
Srusti Thakkar

投稿されたブログ投稿 http://codeworks.it/blog/?p=26 とあなたの短い問題の説明によると、私はあなたの質問に答えようとします。

Android use Android.Provider.Settings.Secure.GetString(Android.App.Application.Context.ContentResolver, Android.Provider.Settings.Secure.AndroidId);

IOSの場合は、ブログ投稿を参照するか、必要に応じてIdentifierForVendorを保存します。 AppDelegateで、IOSDeviceクラスでこの値を返します(ブログ投稿の名前を使用)。 UIDevice.CurrentDevice.IdentifierForVendor.ToString()を使用して、iOSでデバイスIDを取得します。

22
Johannes

詳細は こちら で説明されています。しかし実際には、このようにして各デバイスからIDを取得しようとする必要はありません。 Guidを作成してデバイスに保存するだけでも機能します。 Xamarinには Prefences があり、これはデバイスの値を永続化します。

以下のように、guidを作成してPrefecencesに保存できます。

var deviceId = Preferences.Get("my_deviceId", string.Empty);
if(string.IsNullOrWhitespace(deviceId))
{
  deviceId = System.Guid.NewGuid().ToString();
  Preferences.Set("my_deviceId", deviceId);
}

このアプローチの利点は、アプリがまだ同じIDを持っているのではなく、アプリが別のデバイスに移行したときに、あなたが生成したIDであるということです。ただし、アンインストールしてから再インストールすると、新しいIDが取得されます。デバイスからIdを取得するその他の場合、アプリを別のデバイスに転送すると変更されます。

デバイスからIDを取得するその他の場合:

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;
        }
    }
1
nzrytmn