Xamarin Forms适配Android 31+时PendingIntent参数错误求助
解决Xamarin Forms适配Android S+(API 31+)的PendingIntent崩溃问题
从错误堆栈可明确:崩溃并非来自你编写的PendingIntent代码,而是旧版Firebase IID库内部创建PendingIntent时未指定API 31+要求的FLAG_IMMUTABLE或FLAG_MUTABLE标记——即便注释自身FCM代码、更新部分包,只要旧版Firebase IID依赖仍存在,就会触发问题。以下是针对性解决方案:
核心解决方案:升级到Firebase Messaging新API
FirebaseInstanceId已被官方废弃,新版Firebase Messaging库完全适配API 31+的PendingIntent规则,操作步骤:
- 卸载项目中所有
FirebaseInstanceId相关NuGet包,安装最新稳定版Xamarin.Firebase.Messaging - 替换旧Token获取逻辑:
旧版代码:
替换为新版代码:var token = FirebaseInstanceId.Instance.Token;var token = await FirebaseMessaging.Instance.GetTokenAsync(); - 更新Firebase服务实现:重写
FirebaseMessagingService的OnNewToken方法,替代旧版FirebaseInstanceIdService的逻辑
兼容方案(无法立即升级库时)
若暂时无法替换旧库,可通过以下方式强制兼容:
- 安装
Xamarin.AndroidX.CoreNuGet包,使用PendingIntentCompat类创建兼容的PendingIntent:var intent = new Intent(this, typeof(MainActivity)); intent.AddFlags(ActivityFlags.ClearTop); var flags = PendingIntentFlags.OneShot; if (Build.VERSION.SdkInt >= BuildVersionCodes.S) { flags |= PendingIntentFlags.Immutable; } var pendingIntent = PendingIntentCompat.GetActivity(this, 0, intent, flags); - 排查并移除旧版Firebase依赖:检查NuGet依赖树,确保没有间接引入的旧版
Firebase.Iid相关包,必要时手动排除
额外检查项
- 确认所有第三方依赖库(如推送、统计、定位类)均已更新到适配API 31+的版本,避免其他库创建未标记的PendingIntent
- 验证项目的
TargetFrameworkVersion已设置为Android 12 (API 31)或更高
内容的提问来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

