FirebaseInstanceIdService sudah usang

224

Semoga Anda semua mengetahui kelas ini, yang digunakan untuk mendapatkan token notifikasi setiap kali token notifikasi firebase di-refresh, kami mendapatkan token yang di-refresh dari kelas ini, Dari metode berikut.

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

Untuk menggunakan ini karena saya ingin mengimplementasikan FCM, saya memperpanjang MyClass dari FirebaseInstanceIdService

Tapi, Menunjukkan bahwa FirebaseInstanceIdService sudah usang

Adakah yang tahu ini ?, Metode atau kelas apa yang harus saya gunakan alih-alih ini untuk mendapatkan token yang diperbarui karena ini sudah usang.

Saya menggunakan : implementation 'com.google.firebase:firebase-messaging:17.1.0'

Saya memeriksa dokumen yang sama tidak ada yang disebutkan tentang ini. : DOKUMEN PENGATURAN FCM


MEMPERBARUI

Masalah ini telah diperbaiki.

Karena Google tidak lagi menggunakan FirebaseInstanceService,

Saya mengajukan pertanyaan untuk menemukan jalan dan saya mengetahui bahwa Kami bisa mendapatkan Token dari FirebaseMessagingService ,

Seperti sebelumnya, ketika saya bertanya Dokumen Pertanyaan tidak diperbarui tetapi Sekarang Google docs diperbarui sehingga untuk info lebih lanjut, Rujuk dokumen google ini: FirebaseMessagingService

LAMA Dari: FirebaseInstanceService (Sudah usang)

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

BARU Dari: FirebaseMessagingService

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

Terima kasih.

Uttam Panchasara
sumber
1
Diposting silang di GitHub
Rosário Pereira Fernandes
Di sini juga: medium.com/android-school/…
Pratik Butani
dokumentasi online baru saja diperbarui. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau
Apakah perlu / benar menelepon super.onNewToken(s);? (Saya tidak melihatnya dipanggil di firebase.google.com/docs/cloud-messaging/android/client .)
ban-geoengineering
apakah akan ada perubahan dalam manifes?
Muahmmad Tayyib

Jawaban:

122

pemadam api di sini

Periksa dokumentasi referensi untukFirebaseInstanceIdService :

Kelas ini sudah tidak digunakan lagi.

Dalam mendukung override onNewTokendi FirebaseMessagingService. Setelah itu diterapkan, layanan ini dapat dihapus dengan aman.

Anehnya JavaDoc untuk FirebaseMessagingServicetidak menyebutkan onNewTokenmetode belum. Sepertinya tidak semua dokumentasi yang diperbarui telah diterbitkan. Saya telah mengajukan masalah internal untuk mendapatkan pembaruan untuk dokumen referensi yang diterbitkan, dan untuk mendapatkan sampel dalam panduan ini diperbarui juga.

Sementara itu panggilan lama / usang, dan yang baru harus berfungsi. Jika Anda mengalami masalah dengan salah satu, posting kode dan saya akan lihat.

Frank van Puffelen
sumber
7
The Firebase Docs juga belum diperbarui belum.
Rosário Pereira Fernandes
1
Ya @ jujur, metode ini memang ada, tetapi dokumen terkait belum diperbarui.
Uttam Panchasara
@ kev Kedengarannya seperti pertanyaan baru (valid). Harap buat pos baru, dengan cuplikan kode lengkap minimal.
Frank van Puffelen
@ FrankrankPuffelen sudah melakukannya. Silahkan lihat. stackoverflow.com/questions/51296171/…
kev
1
Saya menemukan tentang pembaruan ini untuk Xamarin Android juga. Menambahkan metode OnNewToken di kelas yang memperluas FirebaseMessagingService. Tapi metode itu tidak kena. Saya tidak tahu apa yang harus saya lakukan. Apakah berbeda dalam file Android Manifest untuk xamarin.
Prabesh
133

Ya FirebaseInstanceIdService sudah usang

DARI DOKS: - Kelas ini sudah usang. Mendukung overriding onNewTokendalam FirebaseMessagingService. Setelah itu diterapkan, layanan ini dapat dihapus dengan aman.

Tidak perlu menggunakan FirebaseInstanceIdServicelayanan untuk mendapatkan token FCM Anda dapat menghapus FirebaseInstanceIdServicelayanan dengan aman

Sekarang kita perlu @Override onNewToken mendapatkan TokendiFirebaseMessagingService

KODE SAMPEL

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());
    }
}

EDIT

Anda perlu mendaftarkan FirebaseMessagingServicefile manifes Anda seperti ini

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

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

cara mendapatkan token dalam aktivitas Anda

.getToken(); juga ditinggalkan jika Anda perlu mendapatkan token dalam aktivitas Anda daripada Penggunaan getInstanceId ()

Sekarang kita perlu menggunakan getInstanceId ()untuk menghasilkan token

getInstanceId ()Mengembalikan IDtoken yang dihasilkan secara otomatis untuk Firebaseproyek ini .

Ini menghasilkan ID Instance jika belum ada, yang mulai mengirim informasi secara berkala ke backend Firebase.

Kembali

  • Tugas yang dapat Anda gunakan untuk melihat hasilnya melalui InstanceIdResultyang memegang IDdan token.

KODE SAMPEL

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

     }
 });

EDIT 2

Ini adalah kode kerja untuk 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())

    }
}
Nilesh Rathod
sumber
1
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Samuel Liew
mengapa tidak ada yang memperlihatkan cara mengimpor FirebaseMessagingService?
temirbek
12

Dan ini:

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()

seharusnya menjadi solusi usang:

FirebaseInstanceId.getInstance().getToken()

EDIT

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() dapat menghasilkan pengecualian jika tugas tersebut belum selesai, sehingga metode yang dijelaskan Nilesh Rathod (with .addOnSuccessListener) adalah cara yang benar untuk melakukannya.

Kotlin:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
        val newToken = instanceIdResult.token
        Log.e("newToken", newToken)
    }
Aleksandar Mironov
sumber
5

Kotlin memungkinkan kode yang lebih sederhana daripada yang ditampilkan di jawaban lain.

Untuk mendapatkan token baru setiap kali disegarkan:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Untuk mendapatkan token dari mana saja saat runtime:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
    Log.d("FMS_TOKEN", it.token)
}
Gumby The Green
sumber
5

FirebaseinstanceIdServicesudah ditinggalkan. Jadi harus menggunakan "FirebaseMessagingService"

Silakan kirim gambar:

masukkan deskripsi gambar di sini

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);
    }
}
Harunduet
sumber
4

Di KOTLIN: - Jika Anda ingin menyimpan Token ke dalam DB atau preferensi bersama, ganti onNewToken di FirebaseMessagingService

override fun onNewToken(token: String) {
        super.onNewToken(token)
    }

Dapatkan token saat dijalankan, gunakan

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }
Rahul
sumber
Sekarang override fun onNewToken(token: String)(tanpa tanda tanya).
Csaba Toth
1

Kelas implementasi FCM:

 public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
if(data != null) {
 // Do something with Token
  }
}
}
// FirebaseInstanceId.getInstance().getToken();
@Override
public void onNewToken(String token) {
  super.onNewToken(token);
  if (!token.isEmpty()) {
  Log.e("NEW_TOKEN",token);
 }
}
}

Dan sebut inisialisasi dalam Activity atau APP:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
                instanceIdResult -> {
                    String newToken = instanceIdResult.getToken();
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.i("FireBaseToken", "onFailure : " + e.toString());
                    }
                });

AndroidManifest.xml:

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

** Jika Anda menambahkan "INSTANCE_ID_EVENT" jangan lupa menonaktifkannya.

Hamed Jaliliani
sumber
1

Anda harus menggunakan FirebaseMessagingService() sebagai gantinyaFirebaseInstanceIdService

Sahil Bansal
sumber