Xamarin.Forms Android 12及以上版本推送通知异常求助
Android 12+推送通知问题排查与解决
一、初始Android 12+崩溃问题
- 原因:Android 12(API 31)强制要求
PendingIntent必须指定FLAG_IMMUTABLE或FLAG_MUTABLE,旧版Firebase Messaging库未做适配,导致崩溃。 - 解决:更新Firebase库是正确方向,但要注意后续API的兼容替换。
二、更新Firebase.Messaging后收不到通知、类未找到错误
- 原因:
FirebaseInstanceId在新版Firebase中已被废弃,换成FirebaseMessaging获取Token是对的,但OneSignal 3.10.4仍依赖旧的FirebaseInstanceId类,导致类找不到,打断了通知接收流程。 - 解决:
- 确保Token获取逻辑正确,使用新版API:
// 替换旧的FirebaseInstanceId.GetInstance().Token写法 var token = await FirebaseMessaging.Instance.GetTokenAsync(); - 清理项目依赖缓存,避免版本冲突:
- 删除项目根目录下的
packages文件夹,通过NuGet管理器清除所有缓存,再重新安装Xamarin.Firebase.Messaging和Com.OneSignal,确保所有依赖版本统一。
- 删除项目根目录下的
- 临时补全依赖:如果仍报
FirebaseInstanceId找不到,安装和Messaging版本匹配的Xamarin.Firebase.InstanceId库,临时兼容OneSignal的旧依赖。
- 确保Token获取逻辑正确,使用新版API:
三、更新OneSignal后仍收不到通知、无角标计数
- 原因:
- OneSignal 3.x对Android 12+的通知渠道适配不足,HMS配置可能有遗漏;
- Android 13+需要单独申请
POST_NOTIFICATIONS权限,未申请则收不到通知; - 角标计数需要主动开启,部分厂商还需额外配置。
- 解决:
- 申请通知权限:
- 在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - Android 13+动态申请权限:
if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) { ActivityCompat.RequestPermissions(MainActivity.Instance, new[] { Manifest.Permission.PostNotifications }, 1001); }
- 在
- 配置通知渠道:
- OneSignal初始化时创建并启用通知渠道:
OneSignal.Initialize("你的OneSignal AppID"); OneSignal.Notifications.CreateNotificationChannel("default_channel", "默认渠道", "默认通知渠道", NotificationImportance.High, true);
- OneSignal初始化时创建并启用通知渠道:
- 开启角标计数:
- 打开OneSignal的角标支持:
OneSignal.Notifications.SetBadgeEnabled(true); - 华为、小米等厂商需要在各自开发者平台配置角标权限,OneSignal 3.x内置了部分厂商适配,确认版本支持即可。
- 打开OneSignal的角标支持:
- 检查HMS配置:
- 确保
NotificationOpenedActivityHMS的android:exported设为true,并在AndroidManifest.xml正确注册:<activity android:name="com.onesignal.NotificationOpenedActivityHMS" android:exported="true" /> - 确认华为AGC推送服务配置正确,证书、AppID均匹配。
- 确保
- 申请通知权限:
四、版本兼容建议
Xamarin.Firebase.Messaging 123.1.2.2版本较新,而Com.OneSignal 3.10.4发布时间较早,两者可能存在兼容问题。要么升级OneSignal到最新的Xamarin兼容版本(比如4.x,注意API变更),要么降级Firebase到OneSignal 3.x支持的版本(比如121.x.x.x系列),确保依赖版本匹配。
内容的提问来源于stack exchange,提问作者BSB
相关产品推荐
相关产品推荐

