Ini pertama kalinya saya menggunakan FCM.
Saya mendownload sampel dari firebase / quickstart-android dan menginstal FCM Quickstart. Tetapi saya tidak bisa mendapatkan token apa pun dari log bahkan menekan tombol LOG TOKEN di aplikasi.
Kemudian saya mencoba mengirim pesan dengan Firebase console dan menetapkan untuk menargetkan nama paket aplikasi saya. Saya mendapat pesan masuk.
Saya ingin tahu apakah FCM dapat digunakan? GCM semuanya baik-baik saja.
Larutan:
Karena saya bukan pengembang Android, hanya pengembang backend. Jadi saya butuh waktu untuk menyelesaikannya. Menurut saya, ada beberapa bug di aplikasi sampel.
Kode:
RegistrationIntentService.java
public class RegistrationIntentService extends IntentService {
private static final String TAG = "RegIntentService";
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String token = FirebaseInstanceId.getInstance().getToken();
Log.i(TAG, "FCM Registration Token: " + token);
}
}
MyFirebaseInstanceIDService.java
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
// String refreshedToken = FirebaseInstanceId.getInstance().getToken();
// Log.d(TAG, "Refreshed token: " + refreshedToken);
//
// // TODO: Implement this method to send any registration to your app's servers.
// sendRegistrationToServer(refreshedToken);
//
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
* <p>
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
}
}
Tambahkan ini di MainActivity.java.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
Setelah melakukan di atas, Anda mendapatkan Token di Logcat. Tapi akhirnya, saya menemukan cara yang mudah untuk mendapatkannya. Cukup gunakan mode debug untuk menginstal aplikasi sampel dan Anda bisa mendapatkan token saat pertama kali menginstalnya.
Tetapi saya tidak tahu mengapa itu tidak dapat mencetak log ketika saya menginstalnya. Mungkin terkait dengan sistem seluler.
Dan mengapa saya tidak bisa mendapatkan Notifikasi. FirebaseMessagingService.onMessageReceived tidak memanggil sendNotification
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
Jawaban:
TERCEPAT DAN BAGUS UNTUK PROTOTYPE
Solusi cepatnya adalah menyimpannya di sharedPrefs dan menambahkan logika ini ke
onCreate
metode di MainActivity atau kelas Anda yang memperluas Aplikasi.FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> { String newToken = instanceIdResult.getToken(); Log.e("newToken", newToken); getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply(); }); Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));
CARA BERSIH
Pilihan yang lebih baik adalah membuat layanan dan tetap menggunakan logika yang serupa. Pertama buat Layanan baru
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String s) { super.onNewToken(s); Log.e("newToken", s); getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply(); } @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); } public static String getToken(Context context) { return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty"); } }
Dan kemudian tambahkan ke file AndroidManifest
<service android:name=".MyFirebaseMessagingService" android:stopWithTask="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Terakhir, Anda dapat menggunakan metode statis dari Layanan Anda
MyFirebaseMessagingService.getToken(Context);
YANG TERCEPAT TAPI TIDAK DIGUNAKAN LAGI
Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());
Ini masih berfungsi saat Anda menggunakan pustaka firebase yang lebih lama dari versi 17.xx
sumber
FirebaseInstanceId.getInstance().getInstanceId()
alih-alihFirebaseInstanceId.getInstance().getToken()
, lihat jawaban inionNewToken
akan selalu dipicu, dari dokumentasi di sini firebase.google.com/docs/cloud-messaging/android/…Tim di balik Firebase Android SDK sedikit mengubah API. Saya telah menerapkan logika "Token to Server" seperti ini:
Dalam contoh saya di FirebaseMessagingService:
public class FirebaseCloudMessagingService extends FirebaseMessagingService { ... @Override public void onNewToken(String token) { // sending token to server here } ... }
Perlu diingat bahwa token berlaku untuk setiap perangkat, dan dapat diupdate oleh Firebase terlepas dari logika login Anda. Jadi, jika Anda memiliki fungsi Masuk dan Keluar, Anda harus mempertimbangkan kasus tambahan:
Menggunakan API baru, Anda bisa mendapatkan token seperti ini:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String token = instanceIdResult.getToken(); // send it to server } });
Semoga berhasil!
sumber
Informasi penting.
Jika layanan bermain bekerja dengan baik maka
FirebaseInstanceId.getInstance().getToken()
metode kembalitoken
Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());
sumber
Menurut dok
Migrasikan aplikasi klien GCM ke FCM
onTokenRefresh()
Jadi itu akan menelepon hanya pada saat pertama kali Anda memasang aplikasi ke perangkat Anda.
Jadi saya sarankan tolong hapus instalan aplikasi Anda secara manual dan coba jalankan lagi
pasti kamu akan mendapatkan TOKEN
sumber
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
onTokenRefresh
tidak memanggil setiap login. bagaimana saya bisa mendapatkan token di layar login saya?Coba ini. Mengapa Anda menggunakan
RegistrationIntentService
?public class FirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { } }
sumber
Baris ini akan memberi Anda token FCM firebase.
String token = FirebaseInstanceId.getInstance().getToken(); Log.d("MYTAG", "This is your Firebase token" + token);
Lakukan Log.d untuk mencetaknya ke monitor android.
sumber
Daripada ini:
// [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. // String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Log.d(TAG, "Refreshed token: " + refreshedToken); // // TODO: Implement this method to send any registration to your app's servers. // sendRegistrationToServer(refreshedToken); // Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } // [END refresh_token]
Melakukan hal ini:
// [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Log.d(TAG, "Refreshed token: " + refreshedToken); // Implement this method to send token to your app's server sendRegistrationToServer(refreshedToken); } // [END refresh_token]
Dan satu hal lagi:
MEMPERBARUI:
Token Firebase baru dibuat (
onTokenRefresh()
dipanggil) ketika:sumber
FirebaseInstanceId.getInstance().deleteInstanceId()
di Thread lainPada saat yang sama, jangan lupa untuk memasukkan ini ke dalam file manifes Anda untuk menerima id token
<service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>
sumber
Metode
getToken()
ini tidak digunakan lagi. Anda bisa menggunakangetInstanceId()
sebagai gantinya.Jika Anda ingin menangani hasil saat meminta
instanceId(token)
, periksa kode ini.FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> { if (instanceIdResult != null) { String token = instanceIdResult.getToken(); if (!TextUtils.isEmpty(token)) { Log.d(TAG, "retrieve token successful : " + token); } } else{ Log.w(TAG, "instanceIdResult should not be null.."); } }).addOnFailureListener(e -> { //do something with e }).addOnCanceledListener(() -> { //request has canceled }).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));
sumber
Di
firebase-messaging:17.1.0
FirebaseInstanceIdService dan yang lebih baru tidak digunakan lagi, Anda bisa mendapatkanonNewToken
diFirebaseMessagingService
kelas seperti yang dijelaskan di https://stackoverflow.com/a/51475096/1351469Tetapi jika Anda ingin mendapatkan token kapan saja, maka sekarang Anda dapat melakukannya seperti ini:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(), new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("newToken",newToken); } });
sumber
Jika menggunakan beberapa fungsi autentikasi firebase, Anda dapat mengambil token menggunakan ini:
//------GET USER TOKEN------- FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser(); mUser.getToken(true) .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { public void onComplete(@NonNull Task<GetTokenResult> task) { if (task.isSuccessful()) { String idToken = task.getResult().getToken(); // ... } } });
Bekerja dengan baik jika pengguna masuk. getCurrentUser ()
sumber
coba ini
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult -> fcm_token = instanceIdResult.token}
sumber
bagi yang mendarat di sini, sampai sekarang
FirebaseInstanceIdService
sudah usang, gunakan saja:public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String token) { Log.d("MY_TOKEN", "Refreshed token: " + token); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. // sendRegistrationToServer(token); } }
dan nyatakan di AndroidManifest
<application... > <service android:name=".fcm.MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application>
sumber
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (!task.isSuccessful()) { Log.w(TAG, "getInstanceId failed", task.getException()); return; } // Get new Instance ID token String **token** = task.getResult().getToken(); } });
sumber
The
FirebaseInstanceId.getInstance().getInstanceId()
adalah usang . Berdasarkan dokumen firebase , Anda dapat mengambil token pendaftaran saat ini menggunakan kode berikut:FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // Get new FCM registration token String token = task.getResult(); // Log and toast String msg = getString(R.string.msg_token_fmt, token); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
sumber
Anda dapat menggunakan berikut ini di Firebase (FCM) untuk mendapatkan token:
FirebaseInstanceId.getInstance().getToken();
sumber
Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
sumber