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

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的逻辑

兼容方案(无法立即升级库时)

若暂时无法替换旧库,可通过以下方式强制兼容:

  1. 安装Xamarin.AndroidX.Core NuGet包,使用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);
    
  2. 排查并移除旧版Firebase依赖:检查NuGet依赖树,确保没有间接引入的旧版Firebase.Iid相关包,必要时手动排除

额外检查项

  • 确认所有第三方依赖库(如推送、统计、定位类)均已更新到适配API 31+的版本,避免其他库创建未标记的PendingIntent
  • 验证项目的TargetFrameworkVersion已设置为Android 12 (API 31)或更高

内容的提问来源于stack exchange,提问作者Sreejith Sree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:35:15