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

如何在FCM获取推送令牌时延长超时时间?

解决FCM获取推送令牌超时的方案

针对弱网环境下FCM获取令牌超时的问题,FCM SDK本身并没有公开的API直接配置超时时间,但可以通过以下几种间接方式处理:

1. 注入自定义OkHttpClient到FCM

FCM内部依赖OkHttp进行网络请求,你可以通过自定义OkHttpClient并注入到Firebase配置中,将超时参数设置为你需要的值。示例代码如下(Kotlin):

val customOkHttp = OkHttpClient.Builder()
    .connectTimeout(60L, TimeUnit.SECONDS)
    .readTimeout(60L, TimeUnit.SECONDS)
    .writeTimeout(60L, TimeUnit.SECONDS)
    .build()

val firebaseOptions = FirebaseOptions.Builder()
    .setApplicationId("你的AppID")
    .setApiKey("你的ApiKey")
    // 补充其他必要配置
    .setHttpClient(customOkHttp)
    .build()

FirebaseApp.initializeApp(context, firebaseOptions)

注意:这个方法需要在FirebaseApp初始化之前设置,确保FCM全程使用你自定义的客户端实例。

2. 实现手动重试逻辑

捕获获取令牌时的超时异常,添加重试机制,给弱网环境多次尝试的机会。可以结合指数退避策略优化重试间隔,避免频繁请求加重网络负担。示例代码:

suspend fun getFcmTokenWithRetry(maxRetries: Int = 3): String? {
    var retryCount = 0
    while (retryCount < maxRetries) {
        try {
            return FirebaseMessaging.getInstance().token.await()
        } catch (e: IOException) {
            retryCount++
            if (retryCount >= maxRetries) throw e
            // 指数退避等待,间隔依次为2s、4s、8s...
            delay(1000L * (1 shl retryCount))
        }
    }
    return null
}

3. 优化令牌获取时机

尽量在网络状态稳定时触发令牌获取:

  • 监听网络连接状态,当检测到WiFi或信号稳定的移动网络时再调用getToken
  • 避免在App启动初期(此时网络可能还未完全就绪)立即执行令牌获取操作

补充说明

FCM SDK将超时参数封装在内部实现中,未对外暴露配置入口,所以无法直接修改SDK内部的超时值。上述方法是目前可行的替代方案,其中注入自定义OkHttpClient的方式最贴合你之前解决其他URL超时问题的思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:20:44