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

Firebase推送通知在AdHoc分发的Android APK中无法正常工作

解决AdHoc分发后Firebase推送通知失效的问题

这种场景我之前也踩过坑,USB调试安装正常但AdHoc分发后推送失效,基本都是签名、配置或者SDK兼容性的问题,咱们一步步排查解决:

1. 优先排查签名证书不匹配问题

USB调试用的是debug签名证书,而AdHoc分发用的是release签名证书,Firebase控制台需要同时配置这两种签名的指纹才能正常推送。

  • 找到你AdHoc打包用的签名文件(.keystore或.jks),用keytool命令导出SHA-1和SHA-256指纹:
    keytool -list -v -keystore 你的签名文件路径 -alias 签名别名
    
  • 登录Firebase控制台,进入你的项目设置 → 「应用」标签页,把刚导出的SHA-1和SHA-256添加进去,然后重新下载google-services.json替换到项目中,确保AdHoc打包时使用的是更新后的配置。

2. 替换已废弃的FirebaseInstanceIdService

从Firebase SDK 17.0.0开始,FirebaseInstanceIdService已经被废弃,旧API在release打包时可能被优化或出现兼容性问题,建议替换为FirebaseMessagingService的新接口:

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFirebaseMessagingService : FirebaseMessagingService
{
    const string TAG = "MyFirebaseMessagingService";
    
    // 替代原OnTokenRefresh的token刷新逻辑
    public override void OnNewToken(string token)
    {
        Log.Debug(TAG, "Refreshed token: " + token);
        SendRegistrationToServer(token);
    }

    // 处理收到的推送消息
    public override void OnMessageReceived(RemoteMessage message)
    {
        Log.Debug(TAG, "Received message from: " + message.From);
        // 这里添加自定义的通知展示逻辑
    }

    void SendRegistrationToServer(string token)
    {
        // 自定义的token上报逻辑
    }
}

3. 检查ProGuard/R8混淆规则

AdHoc打包通常会开启代码混淆,如果没有保留Firebase相关类,会导致推送组件被误删:
在你的ProGuard配置文件(proguard-rules.pro)中添加以下规则:

-keep class com.google.firebase.** { *; }
-keep class com.google.android.gms.** { *; }
-keepattributes *Annotation*
-keepattributes Signature

如果是Xamarin项目,还要在项目属性的「Android选项」→「打包」中确认混淆规则已正确引用,没有遗漏Firebase的保留项。

4. 确认AndroidManifest配置完整性

手动检查清单文件中是否包含推送所需的权限和接收器:

<!-- 必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<!-- Firebase推送接收器(通常google-services.json会自动生成,可手动确认) -->
<receiver
    android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
    </intent-filter>
</receiver>

按这个顺序排查下来,基本能解决AdHoc分发后的推送失效问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:51:53