首页 > 解决方案 > 如果安装在旧版本的应用程序上,则 FirebaseMessagingService 未启动

问题描述

我的应用程序有class FirebaseService : FirebaseMessagingService() 今天我发现奇怪的行为。当我安装没有 FirebaseService 的旧版本应用程序,然后在旧版本下使用 FirebaseService 安装新版本(不卸载旧版本)时,我的 FirebaseService 没有启动(onStart() 没有调用)。但是,如果我在卸载以前的版本 FirebaseService 后使用 FirebaseService 安装版本。这种行为存在于模拟器和真实设备上。所以我的问题是,它是否是预期的行为(似乎没有),当用户通过 Google Play 更新新版本时,它会重现吗?我的 FirebaseService 如下所示:

class FirebaseService : FirebaseMessagingService() {
    private val pushRegistrationHandler: PushRegistrationHandler by inject()
    private val notificator: Notificator by inject()

    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "FirebaseService created")
        notificator.createNotificationChannel(applicationContext)
    }

    override fun onNewToken(token: String) {
        Log.d(TAG, "Refreshed token: $token")
        pushRegistrationHandler.onNewFbToken(token)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        Log.d(TAG, "push data received: ${message.data}")
        notificator.showNotification(applicationContext, message.data)
        super.onMessageReceived(message)
    }

    companion object {
        val TAG = FirebaseService::class.java.simpleName
    }
}

标签: androidfirebase-cloud-messaging

解决方案


似乎指定的行为不仅在我的测试环境中被复制,而且在更新市场发布版本的真实设备的重要部分上。因此,如果用户在安装新版本之前没有卸载以前的版本,则无法保证在应用程序更新后立即启动 firebase 服务,并且可能导致您错过新令牌的情况。为确保您能够在更新后尽快获得令牌,您必须明确请求它:

FirebaseMessaging.getInstance().token.addOnCompleteListener {
                val resultToken: String = it.result ?: ""
                Log.d(tag, "FirebaseMessaging token: $resultToken")
}

推荐阅读