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

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

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

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

Firebase Crashlytics

Firebase Crashlytics מבצע רוטציה של מזהה ה-UUID של ההתקנה Crashlytics על סמך שינויים במזהה ההתקנה של מופע האפליקציה ב-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 בלי שמפתחים יצטרכו לבצע אינטראקציה ישירה עם FIS API. עם זאת, יש מקרים שבהם מפתחי אפליקציות עשויים לרצות להפעיל ישירות את FIS API, למשל:

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

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

הוספת ה-SDK למעקב אחר התקנות של Firebase לאפליקציה

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. מגדירים מופע משותף של 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/11.0.2/firebase-installations.js"></script>

Flutter

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

    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 יום. התהליך הזה מתואר ברמה גבוהה בהצהרת Google בנושא מחיקה ושמירה.

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

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

אסימון אימות של התקנה הוא אסימון למוכ"ז לטווח קצר בפורמט 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+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

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

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

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

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

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

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

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

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

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

Firebase SDK גרסת Android מינימלית גרסת iOS מינימלית
העברת הודעות בענן ב-Firebase v20.3.0 v6.34.0
הגדרת תצורה מרחוק v19.2.0 v6.24.0
Google Analytics for Firebase‏ (Measurement 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 נעשה שימוש ישיר בשיטות של SDK של מזהה מופע, תוכלו להחליף את השימוש הזה בחלופות זהות ב-SDK של Firebase להתקנות או ב-SDK של FCM.

אחזור מזהה

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

לפני

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 Installations, לקוחות FCM אחזו בטוקני רישום מ-Instance ID. עכשיו, ה-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;
  }
}];