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

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

שירות Firebase פונקציונליות של Firebase התקנות
Firebase Cloud Messaging

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

Firebase Crashlytics

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

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 מאוחסנים מזהי התקנה מסוג Firebase, מאפיינים ופלחים קשורים, כדי לספק מידע על טירגוט לשירותים אחרים של Firebase שמשתמשים בהם.

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

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

כדי להתחיל בהתקשרות ישירה מוסיפים את ה-SDK לאפליקציה.

הוספת ה-SDK של Firebase התקנות לאפליקציה

iOS+

  1. מוסיפים ל-Podfile את התלות של Firebase התקנות:
    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. מגדירים מכונה משותפת של FirebaseApp בשיטה application(_:didFinishLaunchingWithOptions:) של הנציג של האפליקציה:

    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

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

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

JavaScript

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

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

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

Flutter

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

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

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

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

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

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

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

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

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

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

כדי למחוק מזהי FID שנוצרו על ידי שירותי Firebase: קוראים לשיטה המתאימה מה-SDK של 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();

מחיקת FID עם קריאה ל-API של שרת

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

לאחר הוספת ה-SDK, מוחקים את מזהי FID באמצעות קריאה ל פונקציית המחיקה בשפה שבחרתם (הערה: מלבד Node.js, הערכים הבאים methods משקפות את השם של מזהה המכונה. אבל למעשה הם מוחקים את FID כאשר קוראים לו באמצעות כל SDK קיים של Firebase).

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

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

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

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

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

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

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

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

אסימון אימות להתקנה הוא אסימון למוכ"ז לטווח קצר בפורמט JWT בפורמט JSON שמכיל את המידע הבא התקנה:

  • מזהה ההתקנה 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+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();

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

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

  • הסרה או התקנה של האפליקציה מחדש, למשל כשמשתמש קצה התקנות במכשיר חדש.
  • משתמש הקצה מנקה את המטמון של האפליקציה או המכשיר.
  • מחיקת 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 חדש, נקרא חזרה למספר הטלפון שרשום:

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

Dart

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

העברה ממזהה מכונה ל-Firebase התקנות

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

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

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

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

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

  • iOS 6.14.0 ומטה
  • ערכות Android SDK שפורסמו לפני 27 בפברואר 2020

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

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

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

Firebase SDK גרסת Android המינימלית גרסת iOS מינימלית
העברת הודעות בענן ב-Firebase גרסה 20.3.0 גרסה 6.34.0
הגדרת תצורה מרחוק גרסה 19.2.0 גרסה 6.24.0
Google Analytics for Firebase \ (SDK למדידת ביצועים) v17.4.4 v6.18.0
העברת הודעות בתוך האפליקציה v19.0.7 גרסה 6.24.0
מעקב אחר ביצועים גרסה 19.0.8 גרסה 6.21.0
Crashlytics גרסה 17.2.1 גרסה 6.23.0
ML Kit גרסה 22.1.2 גרסה 6.28.0

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

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

אחזור מזהה

השיטות לאיתור מזהי מכונות מוחלפות בשיטות שמאפשרות להתקין התקנות ID. לדוגמה:

לפני

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

אחרי

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

מחיקת מזהה

השיטות למחיקה של מזהי מכונות מוחלפות בשיטות למחיקה 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+KTX

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

אחזור אסימון רישום של FCM

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

לפני

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

אחרי

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