Mengelola penginstalan Firebase

Layanan penginstalan Firebase (FIS) menyediakan ID penginstalan Firebase (FID) untuk setiap instance aplikasi Firebase yang diinstal. ID penginstalan Firebase digunakan secara internal oleh layanan Firebase ini:

Layanan Firebase Fungsionalitas penginstalan Firebase
Firebase Cloud Messaging

Firebase Cloud Messaging menggunakan ID penginstalan Firebase guna menarget perangkat untuk pengiriman pesan.

Firebase Crashlytics

Firebase Crashlytics merotasi UUID penginstalan Crashlytics berdasarkan perubahan pada ID penginstalan Firebase instance aplikasi. Ke depannya, ID penginstalan dapat digunakan untuk mengaktifkan fitur guna meningkatkan layanan pelaporan error dan pengelolaan error.

Firebase In-App Messaging

Firebase In-App Messaging menggunakan ID penginstalan Firebase guna menarget perangkat untuk pengiriman pesan.

Firebase Performance Monitoring

Performance Monitoring menggunakan ID penginstalan Firebase untuk menghitung jumlah penginstalan Firebase unik yang mengakses resource jaringan, guna memastikan bahwa pola akses cukup anonim. Fitur ini juga menggunakan ID penginstalan Firebase dengan Firebase Remote Config untuk mengelola laju pelaporan peristiwa performa.

Firebase Remote Config

Remote Config menggunakan ID penginstalan Firebase untuk memilih nilai konfigurasi yang akan ditampilkan ke perangkat pengguna akhir.

Firebase ML

Kredensial yang disebut token autentikasi penginstalan digunakan oleh Firebase ML untuk autentikasi perangkat saat berinteraksi dengan instance aplikasi, misalnya, untuk mendistribusikan model developer ke instance aplikasi.

Firebase User Segmentation Storage

Firebase User Segmentation Storage menyimpan ID penginstalan Firebase serta atribut dan segmen terkait untuk memberikan informasi penargetan ke layanan Firebase lain yang menggunakannya.

Biasanya, layanan Firebase menggunakan layanan penginstalan Firebase tanpa mengharuskan developer berinteraksi langsung dengan FIS API. Namun, dalam kasus berikut, developer aplikasi dapat langsung memanggil FIS API:

  • Untuk menghapus penginstalan Firebase dan data terkait penginstalan.
  • Untuk mengambil ID (ID penginstalan Firebase) guna menargetkan penginstalan aplikasi tertentu.
  • Untuk mengambil token autentikasi penginstalan guna mengautentikasi penginstalan Firebase.

Untuk memulai panggilan langsung FIS API, tambahkan SDK ke aplikasi Anda.

Menambahkan SDK penginstalan Firebase ke aplikasi

iOS+

  1. Tambahkan dependensi untuk penginstalan Firebase ke Podfile Anda:
    pod 'FirebaseInstallations'
  2. Jalankan pod install, lalu buka file .xcworkspace yang dibuat.
  3. Impor modul FirebaseCore dalam UIApplicationDelegate Anda, serta semua modul Firebase lainnya yang digunakan oleh delegasi aplikasi Anda. Misalnya, untuk menggunakan Cloud Firestore dan Authentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. Konfigurasikan instance bersama FirebaseApp di metode application(_:didFinishLaunchingWithOptions:) delegasi aplikasi Anda:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. Jika menggunakan SwiftUI, Anda harus membuat delegasi aplikasi dan menambahkannya ke struct App melalui UIApplicationDelegateAdaptor atau NSApplicationDelegateAdaptor. Anda juga harus menonaktifkan swizzling delegasi aplikasi. Untuk mengetahui informasi lebih lanjut, baca petunjuk SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

Android

Tambahkan dependensi untuk Android SDK penginstalan Firebase ke file Gradle modul (level aplikasi), biasanya app/build.gradle:

implementation 'com.google.firebase:firebase-installations:18.0.0'

JavaScript

Bergantung pada cara aplikasi web Anda dihosting, konfigurasi Anda dapat ditangani secara otomatis atau Anda mungkin perlu memperbarui objek konfigurasi Firebase.

Misalnya, jika dependensi Anda ditambahkan dalam index.html, tambahkan dependensi dalam elemen <head>:

<script src="/__/firebase/11.0.2/firebase-installations.js"></script>

Flutter

  1. Dari direktori root project Flutter Anda, jalankan perintah berikut untuk menginstal plugin penginstalan Firebase:

    flutter pub add firebase_app_installations
    
  2. Build ulang project Anda:

    flutter run
    
  3. Impor plugin penginstalan Firebase:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Menghapus penginstalan Firebase

Data terkait penginstalan Firebase biasanya bukan merupakan informasi identitas pribadi. Namun, ada baiknya pengguna diberi opsi untuk mengelola dan menghapus data ini.

ID penginstalan Firebase berbeda untuk setiap penginstalan setiap aplikasi. Aplikasi yang berbeda di perangkat yang sama akan memiliki ID penginstalan Firebase yang berbeda pula. ID penginstalan Firebase mengidentifikasi penginstalan aplikasi dan data terkait penginstalan aplikasi tersebut.

Saat Anda menghapus ID penginstalan, data terkait ID penginstalan tersebut akan dihapus dari sistem live dan cadangan di semua layanan Firebase yang menggunakan ID penginstalan Firebase untuk mengidentifikasi penginstalan dalam 180 hari. Proses ini dijelaskan secara umum di dalam pernyataan Google terkait penghapusan dan retensi.

Jika Anda tidak menonaktifkan semua layanan yang membuat FID pada aplikasi, FIS akan membuat ID baru dalam beberapa hari. Firebase menganggap ID yang baru dibuat sebagai penginstalan Firebase baru, dan tidak mengaitkannya dengan ID atau data sebelumnya.

Menghapus FID dengan panggilan API klien

Untuk menghapus FID yang dihasilkan oleh layanan Firebase, panggil metode yang sesuai dari SDK penginstalan Firebase:

Swift

do {
  try await Installations.installations().delete()
  print("Installation deleted");
} catch {
  print("Error deleting installation: \(error)")
}

Objective-C

[[FIRInstallations installations] deleteWithCompletion:^(NSError *error) {
   if (error != nil) {
     NSLog(@"Error deleting Installation %@", error);
     return;
   }
   NSLog(@"Installation deleted");
}];

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

JavaScript

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

Menghapus FID dengan panggilan API server

Untuk menghapus FID dengan panggilan API server, tambahkan Firebase Admin SDK ke server, jika Anda belum melakukannya.

Setelah SDK ditambahkan, hapus FID melalui panggilan ke fungsi penghapusan dalam bahasa pilihan Anda (catatan: Kecuali untuk Node.js, metode ini mencerminkan penamaan ID Instance. Namun, metode tersebut sebenarnya menghapus FID saat dipanggil dengan Firebase SDK apa pun saat ini).

Node.js

// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';

admin.installations().deleteInstallation(idToDelete);

Java

// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";

FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();

Python

  from firebase_admin import instance_id

  # An FID sent from a client service SDK
  id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'

  instance_id.delete_instance_id(id_to_delete)

Go

client, err := app.InstanceId(ctx)
if err != nil {
  log.Fatalln("error initializing client", err)
}

iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
  log.Fatalln("error deleting FID", err)
}

Saat Anda menghapus ID penginstalan Firebase dengan panggilan API server, layanan Firebase akan memulai proses penghapusan data terkait ID penginstalan tersebut, berhenti menerima data baru untuk ID tersebut selama 1-2 hari, lalu memberi tahu aplikasi klien bahwa ID telah dihapus. Beberapa layanan aplikasi mungkin masih menarget ID tersebut sebelum Firebase memberi tahu aplikasi klien. Misalnya, penginstalan Firebase mungkin akan terus menerima notifikasi FCM selama beberapa jam.

Jika Anda ingin menghapus ID penginstalan Firebase yang ada saat ini dan segera menggunakan layanan Firebase dengan ID baru yang tidak berkaitan, gunakan API klien untuk menangani penghapusan.

Mengambil ID klien

Jika perlu mengidentifikasi penginstalan tertentu aplikasi, Anda dapat melakukannya dengan mengambil ID penginstalan Firebase. Misalnya, untuk membuat segmen penginstalan aplikasi untuk impor BigQuery, atau untuk melakukan pengujian selama pengembangan Firebase In-App Messaging, Anda dapat mengidentifikasi dan menarget perangkat yang tepat menggunakan ID penginstalan Firebase yang sesuai.

Untuk mengambil ID penginstalan Firebase:

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

JavaScript

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

Mengambil token autentikasi penginstalan

Layanan Firebase dapat mengautentikasi penginstalan Firebase dengan token autentikasi yang diambil dari FIS. Misalnya, saat mendesain pengujian A/B untuk Remote Config, Anda dapat mengautentikasi perangkat uji yang ditargetkan menggunakan token autentikasi penginstalan.

Token autentikasi penginstalan adalah token pemilik jangka pendek dalam format token web JSON (JWT) yang berisi informasi berikut untuk penginstalan:

  • ID penginstalan Firebase
  • Project terkait (projectNumber)
  • ID aplikasi Firebase terkait (appId)
  • Tanggal habis masa berlaku token

Token autentikasi penginstalan tidak dapat dicabut, dan tetap valid hingga tanggal habis masa berlakunya. Masa berlaku token default adalah satu minggu.

Untuk mengambil token autentikasi penginstalan:

Swift

do {
  let result = try await Installations.installations()
    .authTokenForcingRefresh(true)
  print("Installation auth token: \(result.authToken)")
} catch {
  print("Error fetching token: \(error)")
}

Objective-C

[[FIRInstallations installations] authTokenForcingRefresh:true
                                               completion:^(FIRInstallationsAuthTokenResult *result, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation token %@", error);
    return;
  }
  NSLog(@"Installation auth token: %@", [result authToken]);
}];

Java

FirebaseInstallations.getInstance().getToken(/* forceRefresh */true)
        .addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
    @Override
    public void onComplete(@NonNull Task<InstallationTokenResult> task) {
        if (task.isSuccessful() && task.getResult() != null) {
            Log.d("Installations", "Installation auth token: " + task.getResult().getToken());
        } else {
            Log.e("Installations", "Unable to get Installation auth token");
        }
    }
});

Kotlin+KTX

val forceRefresh = true
FirebaseInstallations.getInstance().getToken(forceRefresh)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d("Installations", "Installation auth token: " + task.result?.token)
        } else {
            Log.e("Installations", "Unable to get Installation auth token")
        }
    }

JavaScript

const installationToken = await firebase.installations()
    .getToken(/* forceRefresh */ true);
console.log(installationToken);

Dart

String token = await FirebaseInstallations.instance.getToken();

Memantau siklus proses ID penginstalan Firebase

Selama operasi normal aplikasi, ID penginstalan Firebase (FID) tidak memerlukan pemantauan khusus. Namun, aplikasi yang secara eksplisit mengambil dan menggunakan FID harus menambahkan logika untuk memantau kemungkinan penghapusan atau rotasi FID. Berikut adalah beberapa kasus yang memungkinkan FID dihapus atau dirotasi:

  • Proses uninstal atau penginstalan ulang aplikasi, misalnya saat pengguna akhir menginstal aplikasi di perangkat baru.
  • Pengguna akhir menghapus cache aplikasi atau perangkat.
  • Penghapusan FID dipicu di backend karena aplikasi tidak aktif (batas tidak aktif aplikasi saat ini adalah 270 hari).

Jika mengalami rotasi atau penghapusan FID dalam kasus seperti ini, aplikasi akan diberi FID baru. Selain itu, token autentikasi penginstalan yang terkait dengan FID yang telah dihapus juga akan dihapus, terlepas dari masa berlaku token itu sendiri, dan diganti dengan token autentikasi penginstalan baru.

Aplikasi dapat memantau perubahan ini dan memberikan respons yang sesuai.

Untuk memantau rotasi FID:

Swift

installationIDObserver = NotificationCenter.default.addObserver(
        forName: .InstallationIDDidChange,
        object: nil,
        queue: nil
) { (notification) in
  // Fetch new Installation ID
  Task {
    await self.fetchInstallationToken()
  }
}

Objective-C

__weak __auto_type weakSelf = self;
self.installationIDObserver = [[NSNotificationCenter defaultCenter]
        addObserverForName: FIRInstallationIDDidChangeNotification
                    object:nil
                     queue:nil
                usingBlock:^(NSNotification * _Nonnull notification) {
    // Fetch new Installation ID
    [weakSelf fetchInstallationsID];
}];

NSNotification bernama NSNotificationName.InstallationIDDidChange diposting ke NSNotificationCenter default setiap kali FID baru ditetapkan.

Android

Klien Kotlin dan Java harus menambahkan logika coba lagi untuk merespons panggilan gagal guna mengambil FID baru.

JavaScript

Aplikasi web dapat berlangganan hook onIdChange.

Setiap kali FID baru dibuat, callback yang berlangganan akan dipicu:

await firebase.installations().onIdChange((newId) => {
  console.log(newId);
  // TODO: Handle new installation ID.
});

Dart

FirebaseInstallations.instance.onIdChange.listen((token) {
  print('FID token: $token');
});

Melakukan migrasi dari ID Instance ke penginstalan Firebase

Sebelum penginstalan Firebase digunakan, Firebase mengandalkan Instance ID SDK untuk ID penginstalan aplikasi. Dibandingkan dengan ID Instance, penginstalan Firebase memiliki keunggulan yang signifikan dalam hal keandalan, performa, dan keamanan. Aplikasi Firebase yang bergantung pada Instance ID SDK sebaiknya dimigrasikan ke penginstalan Firebase.

Proses migrasi berbeda berdasarkan aplikasi Anda:

  • Aplikasi yang tidak secara langsung memanggil Instance ID API dapat dimigrasikan dengan mengupdate versi SDK-nya. Sebagian besar aplikasi Firebase termasuk dalam kategori ini.

  • Aplikasi yang secara eksplisit membuat panggilan API ke ID Instance harus mengupdate versi SDK dan membuat perubahan kode untuk mengganti metode ID Instance dengan penginstalan Firebase atau FCM yang setara dengannya. Jika aplikasi Anda menggunakan ID Instance untuk mengambil token pendaftaran FCM atau secara eksplisit menggunakan ID Instance untuk menarget instance aplikasi atau untuk tujuan lain, Anda harus memperbarui kode aplikasi.

Saat ini, FIS memiliki kompatibilitas mundur dengan ID Instance Firebase lama. Menghapus ID Instance merupakan metode alternatif untuk meminta penghapusan data dengan Firebase SDK berikut:

  • iOS 6.14.0 dan yang lebih rendah
  • Android SDK yang rilis sebelum 27 Februari 2020

Artinya, aplikasi tidak wajib dimigrasikan ke penginstalan Firebase, tetapi sebaiknya Anda melakukannya.

Mengupgrade ke versi SDK minimum untuk penginstalan Firebase

Untuk bermigrasi dari ID Instance ke penginstalan Firebase, pastikan aplikasi Anda menggunakan setidaknya nomor versi Firebase SDK minimum yang tercantum berikut:

Firebase SDK Versi Android minimum Versi iOS minimum
Firebase Cloud Messaging v20.3.0 v6.34.0
Remote Config v19.2.0 v6.24.0
Google Analytics for Firebase \ (Measurement SDK) v17.4.4 v6.18.0
In-App Messaging v19.0.7 v6.24.0
Performance Monitoring v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
ML Kit v22.1.2 v6.28.0

Memperbarui kode yang secara eksplisit memanggil Instance ID API

Jika aplikasi Android atau Apple Anda secara langsung menggunakan metode Instance ID SDK, Anda dapat mengganti penggunaan tersebut dengan alternatif yang sama di SDK penginstalan Firebase atau FCM SDK.

Mengambil ID

Metode untuk mendapatkan ID Instance diganti dengan metode untuk mendapatkan ID penginstalan. Contoh:

Sebelum

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                Log.d("IID_TOKEN", task.getResult().getToken());
            }
        });

Kotlin+KTX

FirebaseInstanceId.getInstance().instanceId
        .addOnSuccessListener { result ->
            Log.d("IID_TOKEN", result.token)
        }

Setelah

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

Menghapus ID

Metode untuk menghapus ID Instance diganti dengan metode untuk menghapus ID penginstalan Firebase. Contoh:

Sebelum

Swift

InstanceID.instanceID().deleteID { error in
  if let error = error {
    print("Error deleting instance ID: \(error)")
  }
}

Objective-C

[FIRInstanceID instanceID] deleteIDWithHandler:^(NSError *error) {
  if error != nil {
    NSLog(@"Error deleting instance ID: %@", error);
  }
}];

Android

FirebaseInstanceId.deleteInstanceId();

Setelah

Swift

func delete(completion: @escaping (Error?) -> Void)

Objective-C

- (void)deleteWithCompletion:(nonnull void (^)(NSError *_Nullable))completion;

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

Mengambil token pendaftaran FCM

Sebelum penginstalan Firebase digunakan, klien FCM mengambil token pendaftaran dari ID Instance. Sekarang, FCM SDK menyediakan metode untuk mengambil token pendaftaran.

Sebelum

Java

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

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

Kotlin+KTX

FirebaseInstanceId.getInstance().instanceId
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                Log.w(TAG, "getInstanceId failed", task.exception)
                return@OnCompleteListener
            }

            // Get new Instance ID token
            val token = task.result?.token

            // Log and toast
            val msg = getString(R.string.msg_token_fmt, token)
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        })

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Setelah

Java

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

Kotlin+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];