android - 如果安装在旧版本的应用程序上,则 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
}
}
解决方案
似乎指定的行为不仅在我的测试环境中被复制,而且在更新市场发布版本的真实设备的重要部分上。因此,如果用户在安装新版本之前没有卸载以前的版本,则无法保证在应用程序更新后立即启动 firebase 服务,并且可能导致您错过新令牌的情况。为确保您能够在更新后尽快获得令牌,您必须明确请求它:
FirebaseMessaging.getInstance().token.addOnCompleteListener {
val resultToken: String = it.result ?: ""
Log.d(tag, "FirebaseMessaging token: $resultToken")
}
推荐阅读
- c - Unexpected output when using scanf("%d\n")
- ios - 使用 Alamofire 上传音频文件
- mysql - 在 Laravel Eloquent 中连接表
- tomcat - 在 EC2 实例上成功安装 tomcat 后,没有为 tomcat 加载 GUI
- regex - 如何使用持续时间条件进行导入范围查询(1分钟以下的所有行)
- swift - 字典搜索键并获取值
- prometheus-node-exporter - container_fs_usage_bytes 和 container_fs_writes_total 是否相关指标?
- python-3.x - 在同一个异步函数中运行“get_object”两次时,botocore 挂起并且速度非常慢
- go - 如何使用 golang 在非根路径上提供 index.html
- css - 如何使用在两个方向上渐变的渐变图像作为边框图像?