【问题标题】:Firebase onNewToken not refreshing my tokenFirebase onNewToken 没有刷新我的令牌
【发布时间】:2020-11-23 22:02:31
【问题描述】:

所以,我的令牌每次过期都需要刷新,但是在 d 后面运行的服务不会触发onNewToken()

清单

 <service
            android:name=".fcm.MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

代码

class MyFirebaseMessagingService: FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        val currentUser = FirebaseAuth.getInstance().currentUser?.uid
        if(currentUser != null){
            FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken",token)
        }
    }
}

每次我在我的应用程序中通过 onStart() 时是否需要显式调用 getInstanceID() ?还是该服务应该像我一样用新的 deviceToken 更新我的 deviceToken ?

我用旧的登录帐户测试过,但没有收到通知,因此新令牌没有刷新(我需要注销并再次登录才能再次接收通知)

【问题讨论】:

  • 你怎么知道令牌过期了?通常令牌不会过期。为了安全起见,您不会错过更改,因为您的服务未成功将令牌传输到您的服务器,您还可以获取令牌,例如在每个应用启动时。
  • 您通常会在应用程序的onNewTokenonStart 中获得令牌。您自己的设备最需要后者,因为在您第一次使用onNewToken 部署安装时,可能已经生成了令牌。或者,您可以在首次添加onNewToken 后卸载该应用并重新安装它,在这种情况下,它还会生成一个新令牌并调用onNewToken

标签: android firebase kotlin firebase-cloud-messaging


【解决方案1】:

onNewToken。文档内容:

在为默认 Firebase 项目生成新令牌时调用。

在首次生成令牌时在应用安装后调用,如果令牌发生更改,则会再次调用。

这意味着一旦生成了令牌,该方法将不会被调用,直到推送令牌必须更改。

当您的应用启动时,您必须获取FirebaseInstanceId 的实例并从中提取令牌。它将保证您获得有效的令牌。

您应该保留 onNewToken 方法中的代码,并添加下面提到的代码以处理已生成令牌的情况:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult: InstanceIdResult ->
        val currentUser = FirebaseAuth.getInstance().currentUser?.uid
        if(currentUser != null){
            FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken", instanceIdResult.token)
        }
    }

更新:何时使用。

首先,你要明白两件事:

  • 令牌不存在且必须生成(在应用程序安装后)或令牌已过期且必须更改时调用onNewToken
  • FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(...) 没有生成任何令牌!它只返回您当前可用、有效、安全使用推送通知令牌。在您的情况下多次调用它是没有用的。

所以现在您已准备好onNewToken 并准备好处理令牌更改。好的。保持原样。

现在您需要处理的是令牌已经生成、有效且可以使用的情况。 onNewToken 在这种情况下不会被调用!现在轮到您手动请求将此令牌退还给您了。

例子:

class YourActivity: Activity {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        uploadFcmToken()
    }

    private fun uploadFcmToken() {
        FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult: InstanceIdResult ->
            val currentUser = FirebaseAuth.getInstance().currentUser?.uid
            if(currentUser != null){
                FirebaseFirestore.getInstance()
                                     .collection("user")
                                     .document(currentUser)
                                     .update("deviceToken", instanceIdResult.token)
            }
        }
    }
}

【讨论】:

  • 每次用户进入该活动/片段时,我是否需要将该代码放在 onStart() 中?每次用户进入该视图时,这是否会生成一个新令牌?
  • 你需要把它放在你活动的onCreate方法中。 onStart 会经常执行它,但您真正需要的是在应用程序启动并且每次更改令牌时执行一次(由onNewToken 处理)。我会更新我的答案以使其更清楚。
【解决方案2】:

您很可能在 FCM 已经生成初始令牌之后添加了 onNewToken 实现。

对于这种特定情况(主要影响作为开发人员的您,而不是您的用户),您还需要在主要活动的 onStart 之类的内容中获取令牌。或者,您可以在首次添加onNewToken 后卸载该应用并重新安装它,在这种情况下,它还会生成一个新令牌并调用onNewToken

因此,您通常最终会在应用程序的 onNewTokenonStart 中获得令牌。

【讨论】:

  • 这两种方法是正确的吗弗兰克?我的意思是,我还需要在 onStart 中提供令牌的生成??
  • 对不起,我不确定你在问什么。我试图解释为什么您可能需要在活动和onNewToken 中调用getIdToken。如果有不清楚的地方,请解释不清楚的地方。
猜你喜欢
  • 1970-01-01
  • 2016-10-16
  • 2016-11-21
  • 2017-07-25
  • 2017-06-30
  • 2016-10-08
  • 2017-10-19
  • 2019-03-29
  • 2020-02-27
相关资源
最近更新 更多