很多 Android 的專案都需要用到推播的功能,但你有遇過使用 FCM 取得 token 有時會無法順利取得的狀況嗎?通常專案的設計中 app 會將 token 傳給 server 作為裝置的依據,這時 token 為 null 就會發生很大的問題。
FCM 的 token 為 null 的情況通常發生在第一次安裝完 app 開啟時,為了解決這情況發生,我解決的方式為如果取得的 token 為 null 時會延遲一秒在取得 token 一次直到順利取得 token 為止。
private void getToken() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
final String pushToken = FirebaseInstanceId.getInstance().getToken();
if (null == pushToken) {
getToken();
} else {
//Next scenario
}
}
}, 1000);
}
不過 FirebaseInstanceId.getInstance().getToken() 已經被 deprecated 了!!!必須改使用下面的方法 :
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
final String deviceToken = instanceIdResult.getToken();
}
});
另外要注意 FCM token 更新的時機點為下面這 4 項 :
- 刪除 Instance ID
- 將備份的 app 資料還原到新的手機上
- 移除或重新安裝 app
- 使用者將 app 的資料清除
刪除 Instance ID 方法 :
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
結論 :
使用 FCM 必須知道本身的特性還有如何正確的取得 token 和刪除,假設做一個使用者登入登出的功能,登出的時候沒有刪除 token 且登入時 token 沒有更新的清況下是會出很大的問題。