ניהול ההתקנות ב-Firebase

שירות ההתקנות (FIS) מספק מזהה התקנה (FID) לכל מופע מותקן של אפליקציית Firebase. מזהה ההתקנה משמש באופן פנימי בשירותי Firebase הבאים:FirebaseFirebaseFirebase

שירות Firebase Firebase התקנות
Firebase Cloud Messaging

Firebase Cloud Messaging משתמש במזהי התקנה כדי לטרגט מכשירים למסירת הודעות.Firebase

Firebase Crashlytics

הערך Firebase Crashlytics מסתובב Firebase Crashlytics בהתקנה UUID על סמך שינויים במזהה ההתקנה של מופע האפליקציה ב-Firebase.Crashlytics בעתיד, יכול להיות שנשתמש במזהה ההתקנה כדי להפעיל תכונות שישפרו את הדיווח על קריסות ואת שירותי ניהול הקריסות.

Firebase In-App Messaging

Firebase In-App Messaging משתמש במזהי התקנה כדי לטרגט מכשירים למסירת הודעות.Firebase

Firebase Performance Monitoring

Performance Monitoring משתמש במזהי התקנה של Firebase כדי לחשב את מספר ההתקנות הייחודיות של Firebase שניגשות למשאבי הרשת, כדי לוודא שדפוסי הגישה אנונימיים מספיק. המערכת משתמשת גם בFirebase מזהי התקנה עם Firebase Remote Config כדי לנהל את קצב הדיווח של אירועי הביצועים.

Firebase Remote Config

Remote Config משתמש במזהי התקנה של Firebase כדי לבחור ערכי הגדרה להחזרה למכשירי משתמשי הקצה.

Firebase ML

פרטי הכניסה שנקראים אסימוני אימות להתקנה משמשים את Firebase ML לאימות המכשיר בזמן אינטראקציה עם מופעים של אפליקציות, למשל כדי להפיץ מודלים למפתחים למופעים של אפליקציות.

אחסון של פילוח משתמשים ב-Firebase

ב-Firebase User Segmentation Storage מאוחסנים Firebase מזהי התקנה ותכונות ופלחים קשורים, כדי לספק מידע על טירגוט לשירותים אחרים של Firebase שמשתמשים בהם.

בדרך כלל, שירותי Firebase משתמשים בשירות Firebase installations בלי שמפתחים צריכים לבצע אינטראקציה ישירה עם FIS API. עם זאת, יש מקרים שבהם מפתחי אפליקציות ירצו להפעיל ישירות את FIS API, למשל:

  • כדי למחוק התקנה של Firebase ונתונים שקשורים להתקנה.
  • כדי לאחזר מזהים (Firebase מזהי התקנה) כדי לטרגט התקנות ספציפיות של אפליקציות.
  • כדי לאחזר אסימוני אימות של התקנות ולאמת התקנות של Firebase.

כדי להתחיל להשתמש ב-FIS API ישירות, צריך להוסיף את ה-SDK לאפליקציה.

הוספת Firebase installations SDK לאפליקציה

‫iOS+

  1. מוסיפים את יחסי התלות של התקנות Firebase לקובץ Podfile:
    pod 'FirebaseInstallations'
  2. מריצים את הפקודה pod install ופותחים את הקובץ .xcworkspace שנוצר.
  3. מייבאים את המודול FirebaseCore ב-UIApplicationDelegate, וגם את כל מודולי Firebase האחרים שמשמשים את נציג האפליקציה. לדוגמה, כדי להשתמש ב-Cloud Firestore וב-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. מגדירים מופע משותף בשיטה application(_:didFinishLaunchingWithOptions:) של נציג האפליקציה:FirebaseApp

    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. אם אתם משתמשים ב-SwiftUI, אתם צריכים ליצור נציג אפליקציה ולצרף אותו למבנה App באמצעות UIApplicationDelegateAdaptor או NSApplicationDelegateAdaptor. צריך גם להשבית את החלפת הפונקציות של נציג האפליקציה. מידע נוסף זמין בהוראות ל-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

מוסיפים את התלות ב-Firebase Installations Android SDK לקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל app/build.gradle):

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

JavaScript

בהתאם לאופן האירוח של אפליקציית האינטרנט, יכול להיות שההגדרה תטופל אוטומטית או שתצטרכו לעדכן את אובייקט ההגדרה של Firebase.

לדוגמה, אם יחסי התלות שלכם נוספו בקובץ index.html, מוסיפים את יחסי התלות ברכיב <head>:

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

Flutter

  1. מתיקיית השורש של פרויקט Flutter, מריצים את הפקודה הבאה כדי להתקין את הפלאגין Firebase installations:

    flutter pub add firebase_app_installations
    
  2. בנייה מחדש של הפרויקט:

    flutter run
    
  3. מייבאים את הפלאגין Firebase installations:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

מחיקת התקנה של Firebase

נתונים שקשורים להתקנה של Firebase בדרך כלל לא מאפשרים זיהוי אישי. עם זאת, כדאי לתת למשתמשים אפשרות לנהל ולמחוק את הנתונים האלה.

Firebase מזהי ההתקנה שונים לכל התקנה של כל אפליקציה. לאפליקציות שונות באותו מכשיר יש מזהי התקנה שונים.Firebase מזהי התקנה של אפליקציות משמשים לזיהוי התקנות של אפליקציות ונתונים שקשורים להתקנות האלה.Firebase

כשמוחקים מזהה התקנה, הנתונים שמשויכים למזהה ההתקנה הזה מוסרים ממערכות פעילות וממערכות גיבוי של כל שירותי Firebase שמשתמשים במזהי התקנה של Firebase כדי לזהות התקנות, תוך 180 יום. התהליך הזה מתואר ברמה גבוהה בהצהרה של Google בנושא מחיקה ושמירה.

אם לא תשביתו את כל השירותים שיוצרים מזהי FID באפליקציה, מערכת FIS תיצור מזהה חדש תוך כמה ימים. מערכת Firebase מתייחסת למזהה החדש שנוצר כFirebaseהתקנה חדשה, ולא מקשרת אותו למזהה הקודם או לנתונים הקודמים בשום צורה.

מחיקת FID באמצעות קריאה ל-API של הלקוח

כדי למחוק מזהי Firebase שנוצרו על ידי שירותי Firebase, צריך להפעיל את השיטה המתאימה מ-Firebase installations SDK:

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

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

מחיקת FID באמצעות קריאה ל-API של השרת

כדי למחוק מזהה FID באמצעות קריאה ל-API של השרת, מוסיפים את SDK של Firebase לאדמינים לשרת, אם עדיין לא עשיתם זאת.

אחרי שמוסיפים את ה-SDK, מוחקים את מזהי ה-FID באמצעות קריאה לפונקציית המחיקה בשפה הרצויה (הערה: השיטות האלה משקפות את השמות של מזהי המופעים, למעט Node.js). אבל בפועל, כל הפונקציות האלה מוחקות את ה-FID כשקוראים להן עם כל גרסה עדכנית של Firebase 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)

המשך

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

כשמוחקים מספר התקנה של Firebase באמצעות קריאה ל-API של השרת, שירותי Firebase מתחילים בתהליך למחיקת הנתונים שקשורים למספר ההתקנה הזה, מפסיקים לקבל נתונים חדשים למספר הזה במהלך יום או יומיים, ואז מודיעים לאפליקציית הלקוח שהמספר נמחק. עד ש-Firebase ישלח הודעה לאפליקציית הלקוח, יכול להיות שחלק מהשירותים של האפליקציה עדיין יטרגטו את המזהה – לדוגמה, יכול להיות שהתקנה של Firebase תמשיך לקבל FCMהתראות למשך כמה שעות.

אם רוצים למחוק את מזהה ההתקנה הנוכחי של Firebase ולהשתמש מיד בשירותי Firebase עם מזהה חדש שלא קשור למזהה הקודם, צריך להשתמש ב-API של הלקוח כדי לטפל במחיקה.

אחזור מזהי לקוחות

אם אתם צריכים לזהות התקנות ספציפיות של האפליקציה, אתם יכולים לעשות זאת על ידי אחזור Firebase מזהה ההתקנה. לדוגמה, כדי ליצור פלחים של התקנות אפליקציות לייבוא ל-BigQuery, או כדי לבצע בדיקות במהלך פיתוח, אפשר לזהות ולטרגט את המכשירים הנכונים באמצעות מזהי ההתקנה המתאימים.Firebase In-App MessagingFirebase

כדי לאחזר מזהה התקנה של 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

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

אחזור טוקנים של אימות להתקנה

שירותי Firebase יכולים לאמת התקנות של Firebase באמצעות טוקנים לאימות שנשלפים מ-FIS. לדוגמה, כשמעצבים בדיקות A/B ל-Remote Config, אפשר לאמת מכשיר בדיקה מטורגט באמצעות טוקן אימות של התקנה.

אסימון אימות להתקנה הוא אסימון bearer לזמן קצר בפורמט JSON Web Token‏ (JWT) שמכיל את הפרטים הבאים להתקנה:

  • מזהה ההטמעה Firebase
  • הפרויקט המשויך (projectNumber)
  • מזהה האפליקציה המשויכת ב-Firebase‏ (appId)
  • תאריך התפוגה של הטוקן

אי אפשר לבטל את טוקן ההרשאה להתקנה, והוא נשאר בתוקף עד לתאריך התפוגה שלו. משך החיים של האסימון הוא שבוע כברירת מחדל.

כדי לאחזר טוקן אימות של התקנה:

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

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

מעקב אחרי מחזור החיים של מזהה ההתקנה של Firebase

במהלך הפעולה הרגילה של אפליקציה, Firebaseמזהי התקנה (FIDs) לא דורשים מעקב מיוחד. עם זאת, אפליקציות שמחלצות ומשתמשות במזהי FID באופן מפורש צריכות להוסיף לוגיקה למעקב אחרי מחיקה או החלפה פוטנציאלית של מזהה ה-FID. הנה כמה מקרים שבהם יכול להיות שנמחק או נסובב מזהה FID:

  • הסרה או התקנה מחדש של האפליקציה, למשל כשמשתמש קצה מתקין אותה במכשיר חדש.
  • משתמש הקצה מנקה את המטמון של האפליקציה או של המכשיר.
  • מחיקת מזהה FID מופעלת בקצה העורפי בגלל חוסר פעילות באפליקציה (נכון לעכשיו, הסף לכך הוא 270 ימים של חוסר פעילות).

כשמזהה ה-FID של אפליקציות עובר רוטציה או נמחק במקרים כאלה, מוקצה להן מזהה FID חדש. בנוסף, אסימון ההרשאה להתקנה שמשויך למזהה FID שנמחק נמחק, ללא קשר למידת הבגרות שלו, ומוחלף באסימון הרשאה חדש להתקנה.

אפליקציות יכולות לעקוב אחרי השינויים האלה ולהגיב בהתאם.

כדי לעקוב אחרי סבב ה-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 בשם NSNotificationName.InstallationIDDidChange נשלחת אל NSNotificationCenter שמוגדר כברירת מחדל בכל פעם שמוקצה FID חדש.

Android

לקוחות Kotlin ו-Java צריכים להוסיף לוגיקה של ניסיון חוזר כדי להגיב לקריאות שנכשלו לאחזור ה-FID החדש.

JavaScript

אפליקציות אינטרנט יכולות להירשם ל-hook‏ onIdChange.

בכל פעם שנוצר FID חדש, מתבצעת הפעלה של הקריאה החוזרת (callback) שאליה נרשמתם:

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

Dart

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

העברה מהתקנות של Instance ID אל Firebase

לפני שהשקנו את Firebaseההתקנות, Firebase הסתמך על Instance ID SDK כדי לזהות התקנות של אפליקציות. Firebase installations מספקת יתרונות משמעותיים על פני Instance ID מבחינת אמינות, ביצועים ואבטחה. אפליקציות Firebase שתלויות ב-SDK של מזהה המופע צריכות לעבור אל Firebase התקנות.

תהליך ההעברה משתנה בהתאם לאפליקציה:

  • אפליקציות שלא קוראות ישירות לממשקי API של מזהה מופע יכולות לעבור על ידי עדכון גרסאות ה-SDK. רוב האפליקציות של Firebase נכללות בקטגוריה הזו.

  • אפליקציות שמבצעות קריאות API באופן מפורש למזהה מופע צריכות לעדכן את גרסאות ה-SDK‏ ו לבצע שינויים בקוד כדי להחליף את השיטות של מזהה המופע בשיטות המקבילות של Firebaseההתקנות או FCM. אם האפליקציה שלכם משתמשת במזהה מופע כדי לאחזר FCM טוקנים של רישום או משתמשת במזהה מופע באופן מפורש כדי לטרגט מופעים של אפליקציות או לכל מטרה אחרת, תצטרכו לעדכן את קוד האפליקציה.

נכון לעכשיו, FIS תואם לאחור למזהה מדור קודם – מזהה מופע Firebase. מחיקת מזהה מופע היא שיטה חלופית לשליחת בקשה למחיקת נתונים באמצעות ערכות ה-SDK הבאות של Firebase:

  • ‫iOS 6.14.0 ומטה
  • ‫Android SDKs מגרסאות קודמות ל-27 בפברואר 2020

כלומר, לא חובה להעביר את האפליקציות להתקנות של Firebase, אבל מומלץ מאוד לעשות זאת.

שדרוג לגרסאות SDK מינימליות להתקנות של Firebase

כדי לעבור ממזהה מופע לFirebase התקנות, צריך לוודא שהאפליקציות משתמשות לפחות במספרי הגרסאות המינימליים שמופיעים ברשימה של ערכות Firebase SDK הבאות:

Firebase SDK גרסת Android מינימלית גרסת המינימום של iOS
העברת הודעות בענן ב-Firebase v20.3.0 v6.34.0
הגדרת תצורה מרחוק v19.2.0 v6.24.0
‫Google Analytics for Firebase (SDK למדידות) v17.4.4 v6.18.0
העברת הודעות באפליקציה v19.0.7 v6.24.0
מעקב אחר ביצועים v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
ML Kit v22.1.2 v6.28.0

עדכון קוד שקורא באופן מפורש לממשקי API של מזהה מופע

אם אפליקציית Android או Apple שלכם משתמשת ישירות בשיטות של Instance ID SDK, אתם יכולים להחליף את השימוש הזה בחלופות זהות ב-Firebase installations SDK או ב-FCM SDK.

אחזור מזהה

השיטות לקבלת מזהי מופעים הוחלפו בשיטות לקבלת מזהה התקנות. לדוגמה:

לפני

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

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];
    // display message
    NSLog(@"%@", 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

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

אחרי

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

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

מחיקת מזהה

השיטות למחיקת מזהי מופעים הוחלפו בשיטות למחיקת מזהי התקנות Firebase. לדוגמה:

לפני

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

אחרי

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

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

אחזור טוקן רישום של FCM

לפני שהשקנו את Firebase Installations, FCM לקוחות קיבלו טוקנים של רישום מ-Instance ID. עכשיו, FCM SDK מספק שיטות לאחזור טוקן הרישום.

לפני

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

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

InstanceID.instanceID().instanceID { result, error in
  if let error = error {
    print("Error fetching instance ID: \(error)")
  } else if let result = result {
    print("Instance ID token: \(result.token)")
  }
}

Objective-C

[[FIRInstanceID instanceID] instanceIDWithHandler:^(FIRInstanceIDResult * _Nullable result,
                                                    NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Error fetching instance ID: %@", error);
  } else {
    NSLog(@"Instance ID token: %@", result.token);
  }
}];

אחרי

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

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 remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID 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];
    // display message
    NSLog(@"%@", message);
  }
}];