You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xamarin Forms中获取设备ID及Android/iOS平台唯一ID?

我来帮你解决这个问题,在Xamarin.Forms中为Azure Notification Hub获取设备ID以及平台唯一ID的方案如下,同时也会解决你Android端找不到Settings选项的困惑:

一、跨平台依赖服务框架

因为设备ID和平台唯一ID都是平台相关的功能,我们可以用Xamarin.Forms的依赖服务来实现跨平台调用。首先在共享项目中定义一个接口:

public interface IDeviceInfoService
{
    // 获取用于Azure Notification Hub的推送设备ID(FCM/APNs令牌)
    string GetPushDeviceId();
    // 获取平台专属的唯一设备ID
    string GetPlatformUniqueId();
}
二、Android平台实现(解决Settings找不到的问题)

你提到的找不到「Settings」选项,大概率是没引用正确的命名空间。Android端的Settings类属于Android.Provider命名空间,只要添加这个引用就能正常使用。

1. 先集成FCM(Azure推送依赖)

Azure Notification Hub在Android上依赖Firebase Cloud Messaging(FCM),所以你需要先完成FCM集成:

  • 在Firebase控制台创建项目,下载google-services.json到Android项目根目录
  • 安装Xamarin.Firebase.Messaging NuGet包
  • 在AndroidManifest.xml中添加必要权限(如果用Advertising ID,还要加com.google.android.gms.permission.AD_ID)

2. 实现依赖服务

using Android.Content;
using Android.Provider;
using Firebase.Messaging;
using Xamarin.Forms;

[assembly: Dependency(typeof(DeviceInfoService_Android))]
namespace YourApp.Droid
{
    public class DeviceInfoService_Android : IDeviceInfoService
    {
        // 获取FCM推送令牌(用于Azure Notification Hub注册)
        public string GetPushDeviceId()
        {
            // 同步获取FCM令牌,也可以用异步方式处理
            var fcmToken = FirebaseMessaging.Instance.Token.Result;
            return fcmToken;
        }

        // 获取Android平台唯一ID
        public string GetPlatformUniqueId()
        {
            // 方案1: 使用Android ID(SSAID),恢复出厂设置会变更,无需特殊权限
            var androidId = Settings.Secure.GetString(
                Android.App.Application.Context.ContentResolver, 
                Settings.Secure.AndroidId);
            
            // 方案2: 使用广告ID(需Google Play服务,用户可重置)
            // var adId = AdvertisingIdClient.GetAdvertisingIdInfo(Android.App.Application.Context).Id;
            
            return androidId;
        }
    }
}

关于Settings的补充说明

如果代码里还是找不到Settings,检查:

  • 已添加using Android.Provider;命名空间
  • Android项目的目标框架版本不低于Android 8.0(API 26)
  • 清理并重建Android项目,可能是缓存问题
三、iOS平台实现

iOS端的推送令牌来自APNs,唯一ID可以用IdentifierForVendor(同一开发者应用在同一设备上唯一,卸载重装会变)或广告ID。

1. 先配置APNs

  • 在Apple开发者后台启用APNs,生成推送证书
  • 在iOS项目的Info.plist中开启远程通知权限

2. 实现依赖服务

using UIKit;
using Xamarin.Forms;

[assembly: Dependency(typeof(DeviceInfoService_iOS))]
namespace YourApp.iOS
{
    public class DeviceInfoService_iOS : IDeviceInfoService
    {
        // 获取APNs推送令牌(需先在AppDelegate中捕获并保存)
        public string GetPushDeviceId()
        {
            // 令牌通常在AppDelegate的RegisteredForRemoteNotifications方法中捕获,保存到NSUserDefaults
            return NSUserDefaults.StandardUserDefaults.StringForKey("APNSPushToken");
        }

        // 获取iOS平台唯一ID
        public string GetPlatformUniqueId()
        {
            // 方案1: IdentifierForVendor,同一开发者应用唯一
            var vendorId = UIDevice.CurrentDevice.IdentifierForVendor.ToString();
            
            // 方案2: 广告ID(需引入AdSupport框架)
            // var adId = ASIdentifierManager.SharedManager.AdvertisingIdentifier.ToString();
            
            return vendorId;
        }
    }
}

补充:AppDelegate中捕获APNs令牌

在iOS项目的AppDelegate.cs中添加以下代码:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    var tokenString = deviceToken.Description.Trim('<', '>').Replace(" ", "");
    NSUserDefaults.StandardUserDefaults.SetString(tokenString, "APNSPushToken");
    NSUserDefaults.StandardUserDefaults.Synchronize();
}
四、在共享项目中调用

现在你可以在Xamarin.Forms的共享代码中统一调用:

var deviceInfoService = DependencyService.Get<IDeviceInfoService>();
string pushDeviceId = deviceInfoService.GetPushDeviceId();
string platformUniqueId = deviceInfoService.GetPlatformUniqueId();

// 将推送令牌注册到Azure Notification Hub
var notificationHub = new NotificationHub("YourHubName", "YourConnectionString");
await notificationHub.RegisterNativeAsync(pushDeviceId);
五、关键注意事项
  • Android端:FCM令牌可能会刷新,建议监听OnNewToken事件,及时更新Azure的注册信息
  • iOS端:用户可以关闭推送权限,需要处理权限申请和令牌为空的情况
  • 平台唯一ID:没有绝对永久不变的ID,根据你的业务需求选择合适的方案(比如Android ID vs 广告ID)

内容的提问来源于stack exchange,提问作者Srusti Thakkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:53