如何在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.MessagingNuGet包 - 在
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
相关产品推荐
相关产品推荐

