【发布时间】:2018-03-14 19:54:13
【问题描述】:
什么是让getToken() 以令牌 ID 返回的正确、可靠方式?
我见过几次尝试使用
- while 循环,调用 getToken() 直到它不为空
- 本地广播接收器
- 定时器
while 循环似乎真的在 ANR 方面存在风险,并且循环无限期运行。
本地 BroadcastReceiver 并不适用于我的应用程序,因为即使我的应用程序中有一个主要活动,也没有任何东西强迫用户与之交互。用户可以在应用中完成任务,而无需通过该主要活动。
计时器看起来很脆弱。您需要等待多长时间?秒、分、小时?
Firebase 快速入门示例代码没有提供一个示例来处理getToken() 为空时的情况,而且我看不出有什么正确和可靠的实现可以确保返回一个令牌,没有上述实现的任何令人讨厌的副作用都会带来。
有一个回调方法可以挂钩,这不会成为问题,但由于它不可用,我只需要通过 StackOverflow 运行它,以了解人们如何解决这个问题。
注意:我已经实现了onTokenRefresh(),它适用于文档中所述的特定情况,但我不能单独使用,因为该应用只是升级 em> 在很多设备上,并且在应用升级期间不会调用此方法。我在 (Nexus) 硬件设备上有 null 问题,我根本没有使用模拟器,也不打算使用它。
【问题讨论】:
-
在我的情况下,我每次启动应用程序时都会检查令牌并将其发送到服务器(如果服务器没有令牌)。
-
当 APK 被替换为较新版本(“应用升级”)时,您是否看到令牌更改?这不是导致令牌更改的events listed in the docs 之一。
-
@wonsuc 正如我在问题中所说,getToken() 在随机情况下为空,因此它不可靠。我需要它保持一致。
-
@BobSnyder 我编辑了我的问题以澄清;升级应用程序时不会发生令牌更改,因此 onTokenRefresh 仅部分支持我的用例。我需要让 getToken() 可靠地返回一个令牌,但正如 API 中定义的那样,如果你能得到一个令牌,那就是抛硬币,因为“它可能还没有准备好”。而且无法知道它什么时候准备好。
-
到目前为止,我已经进行了调整以利用 FirebaseInstanceId.getInstance().deleteInstanceId();和 FirebaseInstanceId.getInstance().getToken();它以一种我一点都不满意的方式完成,除了它始终如一地工作;如果我没有本地存储 FCM 令牌 ID 的应用程序,我会调用 deleteInstanceId() 和 getToken() 来“强制”调用 onTokenrefresh()。我宁愿根本不必这样做,因为这感觉就像一个黑客。我将把这个问题保持一段时间,看看是否会出现其他更理智的问题。
标签: android firebase firebase-cloud-messaging