Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Quản lý cài đặt Firebase

Dịch vụ cài đặt Firebase (FIS) cung cấp ID cài đặt Firebase (FID) cho mỗi phiên bản được cài đặt của ứng dụng Firebase. ID cài đặt Firebase được sử dụng nội bộ bởi các dịch vụ Firebase như Nhắn tin trong ứng dụng hoặc Cấu hình từ xa mà không yêu cầu nhà phát triển tương tác trực tiếp với API FIS. Tuy nhiên, có những trường hợp các nhà phát triển ứng dụng có thể muốn gọi trực tiếp API FIS, chẳng hạn như:

  • Để xóa cài đặt Firebase và dữ liệu liên quan đến cài đặt.
  • Để truy xuất số nhận dạng (ID cài đặt Firebase) nhằm nhắm mục tiêu các lượt cài đặt ứng dụng cụ thể.
  • Để truy xuất mã thông báo xác thực cài đặt để xác thực cài đặt Firebase.

Để bắt đầu gọi trực tiếp API FIS, hãy thêm SDK vào ứng dụng của bạn.

Thêm SDK cài đặt Firebase vào ứng dụng của bạn

iOS

  1. Thêm phụ thuộc cho việc cài đặt căn cứ hỏa lực để Podfile của bạn:
    pod 'Firebase/Installations'
  2. Run pod install và mở tạo .xcworkspace tập tin.
  3. Nhập module căn cứ hỏa lực trong bạn UIApplicationDelegate :

    Nhanh

    import Firebase

    Objective-C

    @import Firebase;
  4. Cấu hình một FirebaseApp chia sẻ Ví dụ, điển hình là trong ứng dụng của bạn application:didFinishLaunchingWithOptions: phương pháp:

    Nhanh

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];

Android

Thêm phụ thuộc cho các cài đặt căn cứ hỏa lực Android SDK để mô-đun của bạn (ứng dụng cấp) tập tin Gradle (thường là app/build.gradle ):

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

JavaScript

Tùy thuộc vào cách ứng dụng web của bạn được lưu trữ, cấu hình của bạn có thể được xử lý tự động hoặc bạn có thể cần phải cập nhật của bạn đối tượng cấu hình căn cứ hỏa lực .

Ví dụ: nếu phần phụ thuộc của bạn được thêm vào index.html, hãy thêm phần phụ thuộc vào phần tử <head>:

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

Xóa cài đặt Firebase

Dữ liệu gắn với một cài đặt căn cứ hỏa lực nói chung là không nhận dạng cá nhân. Tuy nhiên, có thể hữu ích nếu cung cấp cho người dùng một tùy chọn để quản lý và xóa dữ liệu này.

ID cài đặt Firebase khác nhau đối với mọi cài đặt của mọi ứng dụng; các ứng dụng khác nhau trên cùng một thiết bị có ID cài đặt Firebase khác nhau. ID cài đặt Firebase xác định các lượt cài đặt ứng dụng và dữ liệu liên quan đến các lượt cài đặt ứng dụng đó.

Khi bạn xóa ID cài đặt, dữ liệu liên kết với ID cài đặt đó sẽ bị xóa khỏi hệ thống trực tiếp và sao lưu của tất cả các dịch vụ Firebase sử dụng ID cài đặt Firebase để xác định các cài đặt trong vòng 180 ngày. Quá trình này được mô tả ở mức cao trong của Google tuyên bố về xóa và duy trì .

Trừ khi bạn tắt tất cả các dịch vụ tạo FID trong ứng dụng của mình, FIS sẽ tạo một ID mới trong vòng vài ngày. Firebase coi ID mới tạo là một bản cài đặt Firebase mới và không liên kết nó với ID hoặc dữ liệu trước đó theo bất kỳ cách nào.

Xóa FID bằng lệnh gọi API ứng dụng khách

Để xóa các FID được tạo bởi các dịch vụ Firebase, hãy gọi phương thức thích hợp từ SDK cài đặt Firebase:

Nhanh

Installations.installations().delete { error in
  if let error = error {
    print("Error deleting installation: \(error)")
    return
  }
  print("Installation deleted");
}

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

Xóa FID bằng lệnh gọi API máy chủ

Để xóa một FID với một máy chủ cuộc gọi API, thêm căn cứ hỏa lực SDK quản trị máy chủ của bạn , nếu bạn chưa có.

Sau khi SDK được thêm, hãy xóa FID thông qua lệnh gọi hàm xóa bằng ngôn ngữ bạn chọn (lưu ý: Ngoại trừ Node.js, các phương thức này phản ánh việc đặt tên Instance ID. Tuy nhiên, tất cả chúng đều thực sự xóa FID khi được gọi bằng bất kỳ Firebase hiện tại nào SDK).

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)

Đi

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

Khi bạn xóa ID cài đặt Firebase bằng lệnh gọi API máy chủ, các dịch vụ Firebase sẽ bắt đầu quá trình xóa dữ liệu được liên kết với ID cài đặt đó, ngừng chấp nhận dữ liệu mới cho ID đó trong vòng 1-2 ngày và sau đó thông báo cho ứng dụng khách rằng ID đã bị xóa. Cho đến khi Firebase thông báo cho ứng dụng khách, một số dịch vụ của ứng dụng vẫn có thể nhắm mục tiêu ID — ví dụ: cài đặt Firebase có thể tiếp tục nhận được thông báo FCM trong một vài giờ.

Nếu bạn muốn xóa ID cài đặt Firebase hiện tại và sử dụng ngay các dịch vụ Firebase với ID mới, không liên quan, hãy sử dụng API ứng dụng khách để xử lý việc xóa.

Truy xuất thông tin nhận dạng khách hàng

Nếu bạn có yêu cầu xác định các cài đặt cụ thể của ứng dụng, bạn có thể thực hiện việc này bằng cách truy xuất ID cài đặt Firebase. Ví dụ: để thực hiện kiểm tra trong quá trình phát triển Nhắn tin trong ứng dụng của Firebase, bạn có thể xác định và nhắm mục tiêu thiết bị kiểm tra chính xác bằng cách sử dụng ID cài đặt Firebase của nó.

Để truy xuất ID cài đặt Firebase:

Nhanh

Installations.installations().installationID { (id, error) in
  if let error = error {
    print("Error fetching id: \(error)")
    return
  }
  guard let id = id else { return }
  print("Installation ID: \(id)")
}

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

Lấy mã thông báo xác thực cài đặt

Các dịch vụ Firebase có thể xác thực các cài đặt Firebase bằng mã thông báo xác thực được truy xuất từ ​​FIS. Ví dụ: khi thiết kế thử nghiệm A / B cho Cấu hình từ xa, bạn có thể xác thực thiết bị thử nghiệm được nhắm mục tiêu bằng mã xác thực cài đặt.

Mã thông báo xác thực cài đặt là mã thông báo không tồn tại trong thời gian ngắn ở định dạng mã thông báo web JSON (JWT) chứa thông tin sau để cài đặt:

  • ID cài đặt Firebase
  • Dự án liên quan ( projectNumber )
  • Các liên căn cứ hỏa lực ứng dụng ID ( appId )
  • Ngày hết hạn của mã thông báo

Mã thông báo xác thực cài đặt không thể bị thu hồi và vẫn có giá trị cho đến ngày hết hạn. Thời gian tồn tại của mã thông báo mặc định là một tuần.

Để truy xuất mã thông báo xác thực cài đặt:

Nhanh

Installations.installations().authTokenForcingRefresh(true, completion: { (result, error) in
  if let error = error {
    print("Error fetching token: \(error)")
    return
  }
  guard let result = result else { return }
  print("Installation auth token: \(result.authToken)")
})

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

FirebaseInstallations.getInstance().getToken(/* forceRefresh */ true)
    .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);

Theo dõi vòng đời ID cài đặt Firebase

Trong quá trình hoạt động bình thường của ứng dụng, ID cài đặt Firebase (FID) không yêu cầu giám sát đặc biệt. Tuy nhiên, các ứng dụng truy xuất và sử dụng FID rõ ràng nên thêm logic để theo dõi khả năng xóa hoặc xoay FID. Dưới đây là một số trường hợp FID có thể bị xóa hoặc xoay vòng:

  • Gỡ cài đặt hoặc cài đặt lại ứng dụng, chẳng hạn như khi người dùng cuối cài đặt trên một thiết bị mới.
  • Người dùng cuối xóa bộ nhớ cache của ứng dụng hoặc thiết bị.
  • Quá trình xóa FID được kích hoạt trong phần phụ trợ do ứng dụng không hoạt động (hiện tại ngưỡng này là 270 ngày không hoạt động).

Khi các ứng dụng gặp phải tình trạng xoay hoặc xóa FID trong những trường hợp này, chúng sẽ được gán một FID mới. Ngoài ra, mã thông báo xác thực cài đặt được liên kết với FID đã xóa sẽ bị xóa, bất kể thời hạn của chính nó và được thay thế bằng mã xác thực cài đặt mới.

Các ứng dụng có thể theo dõi những thay đổi này và phản hồi tương ứng.

Để giám sát xoay FID:

Nhanh

installationIDObserver = NotificationCenter.default.addObserver(
        forName: .InstallationIDDidChange,
        object: nil,
        queue: nil
) { (notification) in
  // Fetch new Installation ID
  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];
}];

Một NSNotification tên NSNotificationName.InstallationIDDidChange được đăng tải trên NSNotificationCenter mặc định bất cứ khi nào một FID mới được giao.

Android

Các ứng dụng khách Kotlin và Java nên thêm logic thử lại để phản hồi các cuộc gọi không thành công để truy xuất FID mới.

JavaScript

Các ứng dụng Web có thể đăng ký vào onIdChange móc.

Bất cứ khi nào một FID mới được tạo, lệnh gọi lại đã đăng ký sẽ được kích hoạt:

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

Di chuyển từ ID phiên bản sang cài đặt Firebase

Trước khi giới thiệu các bản cài đặt Firebase, Firebase đã dựa vào SDK ID phiên bản để làm số nhận dạng của các lượt cài đặt ứng dụng. Việc cài đặt Firebase mang lại những lợi thế đáng kể so với ID phiên bản về độ tin cậy, hiệu suất và bảo mật. Các ứng dụng Firebase phụ thuộc vào SDK ID phiên bản sẽ chuyển sang cài đặt Firebase.

Quá trình di chuyển khác nhau dựa trên ứng dụng của bạn:

  • Apps mà không trực tiếp gọi Instance ID API có thể di chuyển bằng cách cập nhật các phiên bản SDK của họ . Hầu hết các ứng dụng Firebase đều nằm trong danh mục này.

  • Apps mà làm cho rõ ràng cuộc gọi API để Instance ID phải cập nhật phiên bản SDK thay đổi làm cho mã để thay thế các phương pháp thẩm ID với cài đặt căn cứ hỏa lực của họ hoặc FCM tương đương. Nếu ứng dụng của bạn sử dụng ID phiên bản để truy xuất mã thông báo đăng ký FCM hoặc sử dụng ID phiên bản rõ ràng để nhắm mục tiêu các phiên bản ứng dụng hoặc cho bất kỳ mục đích nào khác, bạn sẽ cần cập nhật mã ứng dụng của mình.

Hiện tại, FIS tương thích ngược với ID phiên bản Firebase nhận dạng cũ. Xóa một IID là một phương pháp thay thế yêu cầu xóa dữ liệu với những căn cứ hỏa lực SDK:

  • iOS 6.14.0 trở xuống
  • SDK Android sớm hơn ngày 27 tháng 2 năm 2020

Điều này có nghĩa rằng các ứng dụng không cần phải di chuyển đến lắp đặt căn cứ hỏa lực; tuy nhiên, làm như vậy là rất khuyến khích.

Nâng cấp lên các phiên bản SDK tối thiểu để cài đặt Firebase

Để di chuyển từ ID phiên bản sang cài đặt Firebase, hãy đảm bảo rằng các ứng dụng của bạn sử dụng ít nhất số phiên bản tối thiểu được liệt kê của các SDK Firebase sau:

SDK Firebase Phiên bản Android tối thiểu Phiên bản iOS tối thiểu
Nhắn tin qua đám mây Firebase v20.3.0 v6.34.0
Cấu hình từ xa v19.2.0 v6.24.0
Google Analytics \ (SDK đo lường) v17.4.4 v6.18.0
Nhắn tin trong ứng dụng v19.0.7 v6.24.0
Giám sát hiệu suất v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
Bộ ML v22.1.2 v6.28.0

Cập nhật mã gọi API ID phiên bản một cách rõ ràng

Nếu ứng dụng Android hoặc iOS của bạn sử dụng trực tiếp các phương pháp SDK ID phiên bản, thì bạn có thể thay thế cách sử dụng đó bằng các lựa chọn thay thế giống hệt nhau trong SDK cài đặt Firebase hoặc SDK FCM.

Truy xuất số nhận dạng

Các phương thức lấy ID phiên bản được thay thế bằng các phương thức lấy ID cài đặt. Ví dụ:

Trước

Nhanh

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

Sau

Nhanh

Installations.installations().installationID { (id, error) in
  if let error = error {
    print("Error fetching id: \(error)")
    return
  }
  guard let id = id else { return }
  print("Installation ID: \(id)")
}

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")
    }
}

Xóa số nhận dạng

Các phương pháp xóa ID phiên bản được thay thế bằng các phương pháp xóa ID cài đặt Firebase. Ví dụ:

Trước

Nhanh

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

Sau

Nhanh

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")
    }
}

Lấy mã thông báo đăng ký FCM

Trước khi ra mắt Bản cài đặt Firebase, các ứng dụng khách FCM đã truy xuất mã thông báo đăng ký từ ID phiên bản. Bây giờ, FCM SDK cung cấp các phương pháp để truy xuất mã thông báo đăng ký.

Trước

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

Nhanh

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;
   }
 }];

Sau

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

Nhanh

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;
  }
}];