android - iid - onnewtoken




不推薦使用FirebaseInstanceIdService (4)

希望大家都知道這個類,用於在刷新通知令牌時刷新通知令牌,我們從這個類中獲取刷新的令牌,來自以下方法。

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
}

為了使用它我想要實現FCM,我從 FirebaseInstanceIdService 擴展了MyClass

但是,顯示 不推薦使用FirebaseInstanceIdService

有沒有人知道這個?,我應該使用什麼方法或類來代替這個來獲取刷新令牌,因為這是不推薦使用的。

我正在使用: implementation 'com.google.firebase:firebase-messaging:17.1.0'

我檢查了相同的文件沒有提到這個。 : FCM設置文件

UPDATE

這個問題已被解決。

谷歌棄用了 FirebaseInstanceService

我問問題是找到方法,然後我知道我們可以從 FirebaseMessagingService 獲取令牌,

和以前一樣,當我問問題文檔沒有更新但是現在谷歌文檔更新以獲取更多信息時,請參閱此谷歌文檔: FirebaseMessagingService

舊版自:FirebaseInstanceService(已棄用)

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
}

新來自:FirebaseMessagingService

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.d("NEW_TOKEN",s);
}

謝謝。


Kotlin允許比其他答案中顯示的更簡單的代碼。

要在刷新時獲取新令牌:

class MyFirebaseMessagingService: FirebaseMessagingService() {

    override fun onNewToken(token: String?) {
        Log.d("FMS_TOKEN", token)
    }
    ...
}

要在運行時從任何位置獲取令牌:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
    Log.d("FMS_TOKEN", it.token)
}

不推薦使用 FirebaseinstanceIdService 。 所以必須使用“FirebaseMessagingService”

海形象請:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("NEW_TOKEN",s);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }
}

是的 ,不推薦使用 FirebaseInstanceIdService

來自DOCS: - 此類已棄用。 支持 overriding onNewToken FirebaseMessagingService overriding onNewToken 。 一旦實施,就可以安全地刪除此服務。

無需使用 FirebaseInstanceIdService 服務來獲取FCM令牌您可以安全地刪除 FirebaseInstanceIdService 服務

現在我們需要 @Override onNewToken FirebaseMessagingService 獲取 Token

示例代碼

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        Log.e("NEW_TOKEN", s);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Map<String, String> params = remoteMessage.getData();
        JSONObject object = new JSONObject(params);
        Log.e("JSON_OBJECT", object.toString());

        String NOTIFICATION_CHANNEL_ID = "Nilesh_channel";

        long pattern[] = {0, 1000, 500, 1000};

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications",
                    NotificationManager.IMPORTANCE_HIGH);

            notificationChannel.setDescription("");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setVibrationPattern(pattern);
            notificationChannel.enableVibration(true);
            mNotificationManager.createNotificationChannel(notificationChannel);
        }

        // to diaplay notification in DND Mode
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
            channel.canBypassDnd();
        }

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);

        notificationBuilder.setAutoCancel(true)
                .setColor(ContextCompat.getColor(this, R.color.colorAccent))
                .setContentTitle(getString(R.string.app_name))
                .setContentText(remoteMessage.getNotification().getBody())
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setAutoCancel(true);


        mNotificationManager.notify(1000, notificationBuilder.build());
    }
}

編輯

您需要在清單文件中註冊 FirebaseMessagingService ,如下所示

    <service
        android:name=".MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>

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

如何在您的活動中獲得令牌

.getToken(); 如果您需要在活動中獲取令牌而不是使用 getInstanceId () 也會棄用

現在我們需要使用 getInstanceId () 來生成令牌

getInstanceId () 返回此 Firebase 項目的 ID 和自動生成的標記。

如果實例ID尚不存在,則會生成該實例ID,該實例ID會定期向Firebase後端發送信息。

返回

  • 您可以使用任務通過保存 IDtokenInstanceIdResult 查看結果。

示例代碼

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this,  new OnSuccessListener<InstanceIdResult>() {
     @Override
     public void onSuccess(InstanceIdResult instanceIdResult) {
           String newToken = instanceIdResult.getToken();
           Log.e("newToken",newToken);

     }
 });

編輯2

這是kotlin的工作代碼

class MyFirebaseMessagingService : FirebaseMessagingService() {

    override fun onNewToken(p0: String?) {

    }

    override fun onMessageReceived(remoteMessage: RemoteMessage?) {


        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        val NOTIFICATION_CHANNEL_ID = "Nilesh_channel"

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications", NotificationManager.IMPORTANCE_HIGH)

            notificationChannel.description = "Description"
            notificationChannel.enableLights(true)
            notificationChannel.lightColor = Color.RED
            notificationChannel.vibrationPattern = longArrayOf(0, 1000, 500, 1000)
            notificationChannel.enableVibration(true)
            notificationManager.createNotificationChannel(notificationChannel)
        }

        // to diaplay notification in DND Mode
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
            channel.canBypassDnd()
        }

        val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)

        notificationBuilder.setAutoCancel(true)
                .setColor(ContextCompat.getColor(this, R.color.colorAccent))
                .setContentTitle(getString(R.string.app_name))
                .setContentText(remoteMessage!!.getNotification()!!.getBody())
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setAutoCancel(true)


        notificationManager.notify(1000, notificationBuilder.build())

    }
}

這裡有一個firebaser

查看 FirebaseInstanceIdService 參考文檔

這個類已被棄用。

支持覆蓋 FirebaseMessagingService onNewToken 。 一旦實施,就可以安全地刪除此服務。

奇怪的是,FireDMessagingService的JavaDoc還沒有提到 onNewToken 方法。 看起來並非所有更新的文檔都尚未發布。 我已經提交了一個內部問題來獲取已發布的參考文檔的更新,並且還可以更新指南中的示例。

與此同時,舊的/已棄用的呼叫和新呼叫都應該有效。 如果您遇到任何一個問題,請發布代碼,我會看看。





firebase-cloud-messaging