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
相关产品推荐
相关产品推荐

