无原GCM账号时,基于UrbanAirship切换至FCM的技术咨询
嘿,我来帮你梳理下这个场景下的解决方案——毕竟没法访问原GCM账号确实是个棘手的问题,但结合UrbanAirship的特性,咱们完全可以实现平滑过渡到FCM,而且不用让用户卸载重装应用:
核心思路
绕开原GCM账号,直接在UrbanAirship后台切换到新FCM配置,同时在客户端实现自动注册FCM+令牌无缝替换的逻辑,让用户更新应用后就能自动切换到FCM推送通道。
第一步:用新谷歌账号创建FCM项目并获取配置
- 登录Firebase控制台,用你的新谷歌账号创建一个全新的FCM项目(或者直接关联现有Android应用,包名必须和当前应用完全一致,这是核心前提)
- 下载项目对应的
google-services.json文件,同时记录下FCM的服务器密钥和发送者ID——这两个信息后续要配置到UrbanAirship后台。
第二步:在UrbanAirship后台替换为新FCM配置
- 登录你的UrbanAirship管理后台,找到项目的推送平台设置(路径一般是
Settings > Platforms > Android) - 把原来GCM相关的配置(服务器密钥、发送者ID)全部替换成新FCM的对应信息。UrbanAirship会自动适配FCM通道,无需额外的兼容配置。
第三步:客户端代码改造,实现自动注册与令牌替换
这部分是实现无缝过渡的关键,要让应用更新后自动触发FCM注册,并把新令牌同步给UrbanAirship:
- 替换依赖:在应用的
build.gradle(Module级别)中,移除所有GCM相关依赖,添加FCM的推送依赖,比如:implementation 'com.google.firebase:firebase-messaging:23.4.0' // 建议使用最新稳定版 - 自动触发FCM注册:
- 创建一个继承自
FirebaseMessagingService的子类,重写onNewToken方法。当FCM生成新令牌时,直接调用UrbanAirship的API将其设置为当前设备的推送令牌:@Override public void onNewToken(String fcmToken) { super.onNewToken(fcmToken); // 将新的FCM令牌同步给UrbanAirship UAirship.shared().getPushManager().setPushToken(fcmToken); } - 同时,在应用启动的入口(比如
Application类的onCreate方法),主动调用FirebaseMessaging.getInstance().getToken()来获取令牌并同步,确保即使没有触发onNewToken,也能完成令牌更新:FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // 获取到FCM令牌后同步给UrbanAirship String fcmToken = task.getResult(); UAirship.shared().getPushManager().setPushToken(fcmToken); });
- 创建一个继承自
- 升级UrbanAirship SDK:确保你使用的是最新版的UrbanAirship Android SDK,旧版SDK可能对FCM的支持不完善,升级后能更好地处理令牌替换逻辑。
第四步:验证过渡效果
- 先发布一个内部测试版本,让少量用户更新应用,观察客户端是否能正常获取FCM令牌并同步到UrbanAirship后台
- 在UrbanAirship后台查看设备的推送令牌,确认已经从GCM格式切换为FCM格式
- 发送测试推送,验证是否能通过FCM通道正常到达用户设备
关于“保留注册令牌”的说明
GCM令牌和FCM令牌是完全独立的,没法直接保留GCM令牌继续使用(毕竟GCM服务已被谷歌弃用)。但通过上面的方案,用户更新应用后会自动完成令牌替换,全程无感知,体验上和“保留令牌”完全一致,不需要用户卸载重装。
额外注意事项
- 包名必须一致:新FCM项目的应用包名必须和原应用完全相同,否则无法关联到现有应用,令牌注册会失败
- SHA-1指纹配置:如果应用是签名发布的,需要把当前应用签名的SHA-1指纹添加到新FCM项目中(如果原GCM项目的SHA-1没法获取,用当前的即可),否则FCM注册会失败
- 灰度测试:正式发布前一定要做灰度测试,确保推送功能正常后再全面上线
内容的提问来源于stack exchange,提问作者rohanagarwal
相关产品推荐
相关产品推荐

