Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

נהל התקנות Firebase

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

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

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

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

iOS

  1. הוסף את התלות להתקנות Firebase לפודפיל שלך:
    pod 'Firebase/Installations'
  2. הפעל pod install ופתח את קובץ ה- .xcworkspace שנוצר.
  3. ייבא את מודול Firebase ל- UIApplicationDelegate שלך:

    מָהִיר

    import Firebase

    מטרה-ג

    @import Firebase;
  4. הגדר תצורה משותפת של FirebaseApp , בדרך כלל ביישום האפליקציה שלך application:didFinishLaunchingWithOptions: method:

    מָהִיר

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

    מטרה-ג

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

דְמוּי אָדָם

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

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

JavaScript

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

לדוגמה, אם התלות שלך מתווספות ב- index.html, הוסף את התלות ברכיב <head>:

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

מחק התקנת Firebase

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

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

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

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

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

למחיקת FID שנוצרו על ידי שירותי Firebase, התקשר לשיטה המתאימה מ- SDK להתקנות Firebase:

מָהִיר

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

מטרה-ג

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

ג'אווה

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

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

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

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

Node.js

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

admin.instanceId().deleteInstanceId(idToDelete);

ג'אווה

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

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

פִּיתוֹן

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

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

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

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

כדי לאחזר מזהה התקנה של Firebase:

מָהִיר

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

מטרה-ג

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

ג'אווה

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

אחזר אסימוני אימות התקנה

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

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

  • מזהה ההתקנה של Firebase
  • הפרויקט המשויך ( projectNumber )
  • מזהה היישום המשויך ל- Firebase ( appId )
  • תאריך התפוגה של האסימון

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

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

מָהִיר

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

מטרה-ג

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

ג'אווה

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

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

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

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

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

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

כדי לפקח על סיבוב FID:

מָהִיר

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

מטרה-ג

__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 חדש.

דְמוּי אָדָם

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

JavaScript

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

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

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

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

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

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

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

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

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

  • iOS 6.14.0 ומטה
  • אנדרואיד SDKs לפני 27 בפברואר 2020

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

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

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

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

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

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

אחזור מזהה

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

לפני

מָהִיר

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

מטרה-ג

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

ג'אווה

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

לאחר

מָהִיר

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

מטרה-ג

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

ג'אווה

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. לדוגמה:

לפני

מָהִיר

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

מטרה-ג

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

דְמוּי אָדָם

FirebaseInstanceId.deleteInstanceId();

לאחר

מָהִיר

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

מטרה-ג

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

ג'אווה

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

לפני

ג'אווה

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

מָהִיר

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

מטרה-ג

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

לאחר

ג'אווה

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

מָהִיר

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

מטרה-ג

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