مدیریت تاسیسات Firebase

سرویس نصب Firebase (FIS) برای هر نمونه نصب شده یک برنامه Firebase یک شناسه نصب Firebase (FID) ارائه می‌کند. شناسه نصب 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

نظارت بر عملکرد از شناسه‌های نصب 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 بدون نیاز به برنامه‌نویسان برای تعامل مستقیم با 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
    // ...
          

    سریع

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    هدف-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. یک نمونه اشتراک‌گذاری شده FirebaseApp را در روش برنامه نماینده برنامه application(_:didFinishLaunchingWithOptions:) پیکربندی کنید:

    SwiftUI

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

    سریع

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

    هدف-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. اگر از SwiftUI استفاده می‌کنید، باید یک نماینده برنامه ایجاد کنید و آن را از طریق UIApplicationDelegateAdaptor یا NSApplicationDelegateAdaptor به ساختار App خود متصل کنید. همچنین باید swizzling نمایندگی برنامه را غیرفعال کنید. برای اطلاعات بیشتر، دستورالعمل های SwiftUI را ببینید.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

اندروید

وابستگی نصب‌های Firebase Android SDK را به فایل Gradle ماژول (سطح برنامه) خود اضافه کنید (معمولا app/build.gradle ):

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

جاوا اسکریپت

بسته به نحوه میزبانی برنامه وب شما، ممکن است پیکربندی شما به صورت خودکار مدیریت شود یا ممکن است نیاز به به روز رسانی شی پیکربندی Firebase خود داشته باشید.

به عنوان مثال، اگر وابستگی های شما در index.html اضافه شده است، وابستگی را در عنصر <head> اضافه کنید:

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

بال بال زدن

  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 برای شناسایی نصب‌ها در عرض ۱۸۰ روز استفاده می‌کنند، حذف می‌شود. این فرآیند در بیانیه Google در مورد حذف و حفظ در سطح بالایی توضیح داده شده است.

مگر اینکه تمام خدمات تولید کننده 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");
}

هدف-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")
    }
}

جاوا اسکریپت

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

یک FID را با تماس API سرور حذف کنید

برای حذف یک FID با تماس API سرور، Firebase Admin SDK را به سرور خود اضافه کنید ، اگر قبلاً این کار را نکرده‌اید.

هنگامی که SDK اضافه شد، FID ها را از طریق فراخوانی تابع حذف در زبان انتخابی خود حذف کنید (توجه: به جز Node.js، این روش ها منعکس کننده نام گذاری Instance ID هستند. با این حال، همه آنها در واقع 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();

پایتون

  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 این کار را انجام دهید. به عنوان مثال، برای انجام آزمایش در طول توسعه پیام‌رسانی درون‌برنامه Firebase، می‌توانید دستگاه آزمایشی صحیح را با استفاده از شناسه نصب 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)")
}

هدف-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")
    }
}

جاوا اسکریپت

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

بازیابی نشانه های تأیید اعتبار نصب

سرویس های Firebase می توانند نصب های Firebase را با توکن های احراز هویت بازیابی شده از FIS تأیید کنند. به عنوان مثال، هنگام طراحی تست‌های A/B برای Remote Config، می‌توانید با استفاده از یک نشانه تأیید اعتبار نصب، یک دستگاه آزمایش هدفمند را احراز هویت کنید.

یک نشانه تأیید اعتبار نصب، یک توکن حامل کوتاه مدت در قالب توکن وب JSON (JWT) است که حاوی اطلاعات زیر برای نصب است:

  • شناسه نصب Firebase
  • پروژه مرتبط ( projectNumber )
  • شناسه برنامه Firebase مرتبط ( appId )
  • تاریخ انقضای توکن

نشانه تأیید اعتبار نصب قابل ابطال نیست و تا تاریخ انقضا معتبر باقی می ماند. طول عمر توکن پیش فرض یک هفته است.

برای بازیابی رمز تأیید نصب:

سریع

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

هدف-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")
        }
    }

جاوا اسکریپت

const installationToken = await firebase.installations()
    .getToken(/* forceRefresh */ true);
console.log(installationToken);

Dart

String token = await FirebaseInstallations.instance.getToken();

چرخه عمر ID نصب 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()
}

هدف-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 جدید اختصاص داده شود.

اندروید

کلاینت های Kotlin و Java باید منطق تلاش مجدد را برای پاسخ دادن به تماس های ناموفق برای بازیابی FID جدید اضافه کنند.

جاوا اسکریپت

برنامه های وب می توانند در قلاب 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');
});

از Instance ID به تاسیسات Firebase مهاجرت کنید

قبل از معرفی نصب‌های Firebase، Firebase برای شناسه‌های نصب برنامه بر روی Instance ID SDK تکیه می‌کرد. نصب Firebase مزایای قابل توجهی نسبت به Instance ID در قابلیت اطمینان، عملکرد و امنیت دارد. برنامه‌های Firebase که به Instance ID SDK وابسته هستند باید به تأسیسات Firebase منتقل شوند.

فرآیند مهاجرت بر اساس برنامه شما متفاوت است:

  • برنامه‌هایی که مستقیماً با Instance ID API تماس نمی‌گیرند، می‌توانند با به‌روزرسانی نسخه‌های SDK خود مهاجرت کنند. اکثر برنامه های Firebase در این دسته قرار می گیرند.

  • برنامه‌هایی که صراحتاً با Instance ID تماس‌های API برقرار می‌کنند باید نسخه‌های SDK را به‌روزرسانی کنند و کد را تغییر دهند تا روش‌های Instance ID را با نصب‌های Firebase یا معادل‌های FCM خود جایگزین کنند. اگر برنامه شما از Instance ID برای بازیابی نشانه‌های ثبت FCM استفاده می‌کند یا صراحتاً از Instance ID برای هدف‌یابی نمونه‌های برنامه یا هر هدف دیگری استفاده می‌کند، باید کد برنامه خود را به‌روزرسانی کنید.

در حال حاضر، FIS با شناسه قدیمی Firebase Instance ID سازگار است. حذف یک IID یک روش جایگزین برای درخواست حذف داده با این SDK های Firebase است:

  • iOS 6.14.0 و پایین تر
  • Android SDK زودتر از 27 فوریه 2020

این بدان معناست که برنامه‌ها نیازی به مهاجرت به نصب‌های Firebase ندارند. با این حال، انجام این کار به شدت توصیه می شود.

ارتقاء به حداقل نسخه های SDK برای نصب های Firebase

برای انتقال از Instance ID به نصب‌های Firebase، مطمئن شوید که برنامه‌های شما حداقل از حداقل شماره‌های نسخه فهرست‌شده SDK‌های Firebase زیر استفاده می‌کنند:

Firebase SDK حداقل نسخه اندروید حداقل نسخه iOS
Firebase Cloud Messaging نسخه 20.3.0 نسخه 6.34.0
پیکربندی از راه دور نسخه 19.2.0 نسخه 6.24.0
Google Analytics برای Firebase \ (Measurement SDK) نسخه 17.4.4 نسخه 6.18.0
پیام رسانی درون برنامه ای نسخه 19.0.7 نسخه 6.24.0
نظارت بر عملکرد نسخه 19.0.8 نسخه 6.21.0
Crashlytics نسخه 17.2.1 نسخه 6.23.0
کیت ام ال نسخه 22.1.2 نسخه 6.28.0

به‌روزرسانی کدی که به صراحت از APIهای Instance ID فراخوانی می‌کند

اگر برنامه Android یا Apple شما مستقیماً از روش‌های Instance ID SDK استفاده می‌کند، می‌توانید آن استفاده را با جایگزین‌های مشابه در 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)"
  }
}

هدف-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)
        }

بعد از

سریع

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

هدف-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 جایگزین می‌شوند. مثلا:

قبل از

سریع

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

هدف-C

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

اندروید

FirebaseInstanceId.deleteInstanceId();

بعد از

سریع

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

هدف-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 بازیابی می کردند. اکنون، 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+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)"
  }
}

هدف-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()
})

سریع

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

هدف-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;
  }
}];
،

سرویس نصب Firebase (FIS) برای هر نمونه نصب شده یک برنامه Firebase یک شناسه نصب Firebase (FID) ارائه می‌کند. شناسه نصب 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

نظارت بر عملکرد از شناسه‌های نصب 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 بدون نیاز به برنامه‌نویسان برای تعامل مستقیم با 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
    // ...
          

    سریع

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    هدف-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. یک نمونه اشتراک‌گذاری شده FirebaseApp در روش برنامه نماینده برنامه application(_:didFinishLaunchingWithOptions:) پیکربندی کنید:

    SwiftUI

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

    سریع

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

    هدف-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. اگر از SwiftUI استفاده می‌کنید، باید یک نماینده برنامه ایجاد کنید و آن را از طریق UIApplicationDelegateAdaptor یا NSApplicationDelegateAdaptor به ساختار App خود متصل کنید. همچنین باید swizzling نمایندگی برنامه را غیرفعال کنید. برای اطلاعات بیشتر، دستورالعمل های SwiftUI را ببینید.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

اندروید

وابستگی نصب‌های Firebase Android SDK را به فایل Gradle ماژول (سطح برنامه) خود اضافه کنید (معمولا app/build.gradle ):

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

جاوا اسکریپت

بسته به نحوه میزبانی برنامه وب شما، ممکن است پیکربندی شما به صورت خودکار مدیریت شود یا ممکن است نیاز به به روز رسانی شی پیکربندی Firebase خود داشته باشید.

به عنوان مثال، اگر وابستگی های شما در index.html اضافه شده است، وابستگی را در عنصر <head> اضافه کنید:

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

بال بال زدن

  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 برای شناسایی نصب‌ها در عرض ۱۸۰ روز استفاده می‌کنند، حذف می‌شود. این فرآیند در بیانیه Google در مورد حذف و حفظ در سطح بالایی توضیح داده شده است.

مگر اینکه تمام خدمات تولید کننده 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");
}

هدف-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")
    }
}

جاوا اسکریپت

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

یک FID را با تماس API سرور حذف کنید

برای حذف یک FID با تماس API سرور، Firebase Admin SDK را به سرور خود اضافه کنید ، اگر قبلاً این کار را نکرده‌اید.

هنگامی که SDK اضافه شد، FID ها را از طریق فراخوانی تابع حذف در زبان انتخابی خود حذف کنید (توجه: به جز Node.js، این روش ها منعکس کننده نام گذاری Instance ID هستند. با این حال، همه آنها در واقع 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();

پایتون

  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 این کار را انجام دهید. به عنوان مثال، برای انجام آزمایش در طول توسعه پیام‌رسانی درون‌برنامه Firebase، می‌توانید دستگاه آزمایشی صحیح را با استفاده از شناسه نصب 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)")
}

هدف-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")
    }
}

جاوا اسکریپت

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

بازیابی نشانه های تأیید اعتبار نصب

سرویس های Firebase می توانند نصب های Firebase را با توکن های احراز هویت بازیابی شده از FIS تأیید کنند. به عنوان مثال، هنگام طراحی تست‌های A/B برای Remote Config، می‌توانید با استفاده از یک نشانه تأیید اعتبار نصب، یک دستگاه آزمایش هدفمند را احراز هویت کنید.

یک نشانه تأیید اعتبار نصب، یک توکن حامل کوتاه مدت در قالب توکن وب JSON (JWT) است که حاوی اطلاعات زیر برای نصب است:

  • شناسه نصب Firebase
  • پروژه مرتبط ( projectNumber )
  • شناسه برنامه Firebase مرتبط ( appId )
  • تاریخ انقضای توکن

نشانه تأیید اعتبار نصب قابل ابطال نیست و تا تاریخ انقضا معتبر باقی می ماند. طول عمر توکن پیش فرض یک هفته است.

برای بازیابی رمز تأیید نصب:

سریع

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

هدف-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")
        }
    }

جاوا اسکریپت

const installationToken = await firebase.installations()
    .getToken(/* forceRefresh */ true);
console.log(installationToken);

Dart

String token = await FirebaseInstallations.instance.getToken();

چرخه عمر ID نصب 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()
}

هدف-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 جدید اختصاص داده شود.

اندروید

کلاینت های Kotlin و Java باید منطق تلاش مجدد را برای پاسخ دادن به تماس های ناموفق برای بازیابی FID جدید اضافه کنند.

جاوا اسکریپت

برنامه های وب می توانند در قلاب 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');
});

از Instance ID به تاسیسات Firebase مهاجرت کنید

قبل از معرفی نصب‌های Firebase، Firebase برای شناسه‌های نصب برنامه بر روی Instance ID SDK تکیه می‌کرد. نصب Firebase مزایای قابل توجهی نسبت به Instance ID در قابلیت اطمینان، عملکرد و امنیت دارد. برنامه‌های Firebase که به Instance ID SDK وابسته هستند باید به تأسیسات Firebase منتقل شوند.

فرآیند مهاجرت بر اساس برنامه شما متفاوت است:

  • برنامه‌هایی که مستقیماً با Instance ID API تماس نمی‌گیرند، می‌توانند با به‌روزرسانی نسخه‌های SDK خود مهاجرت کنند. اکثر برنامه های Firebase در این دسته قرار می گیرند.

  • برنامه‌هایی که صراحتاً با Instance ID تماس‌های API برقرار می‌کنند باید نسخه‌های SDK را به‌روزرسانی کنند و کد را تغییر دهند تا روش‌های Instance ID را با نصب‌های Firebase یا معادل‌های FCM خود جایگزین کنند. اگر برنامه شما از Instance ID برای بازیابی نشانه‌های ثبت FCM استفاده می‌کند یا صراحتاً از Instance ID برای هدف‌یابی نمونه‌های برنامه یا هر هدف دیگری استفاده می‌کند، باید کد برنامه خود را به‌روزرسانی کنید.

در حال حاضر، FIS با شناسه قدیمی Firebase Instance ID سازگار است. حذف یک IID یک روش جایگزین برای درخواست حذف داده با این SDK های Firebase است:

  • iOS 6.14.0 و پایین تر
  • Android SDK زودتر از 27 فوریه 2020

این بدان معناست که برنامه‌ها نیازی به مهاجرت به نصب‌های Firebase ندارند. با این حال، انجام این کار به شدت توصیه می شود.

ارتقاء به حداقل نسخه های SDK برای نصب های Firebase

برای انتقال از Instance ID به نصب‌های Firebase، مطمئن شوید که برنامه‌های شما حداقل از حداقل شماره‌های نسخه فهرست‌شده SDK‌های Firebase زیر استفاده می‌کنند:

Firebase SDK حداقل نسخه اندروید حداقل نسخه iOS
Firebase Cloud Messaging نسخه 20.3.0 نسخه 6.34.0
پیکربندی از راه دور نسخه 19.2.0 نسخه 6.24.0
Google Analytics برای Firebase \ (Measurement SDK) نسخه 17.4.4 نسخه 6.18.0
پیام رسانی درون برنامه ای نسخه 19.0.7 نسخه 6.24.0
نظارت بر عملکرد نسخه 19.0.8 نسخه 6.21.0
Crashlytics نسخه 17.2.1 نسخه 6.23.0
کیت ام ال نسخه 22.1.2 نسخه 6.28.0

به‌روزرسانی کدی که به صراحت از APIهای Instance ID فراخوانی می‌کند

اگر برنامه Android یا Apple شما مستقیماً از روش‌های Instance ID SDK استفاده می‌کند، می‌توانید آن استفاده را با جایگزین‌های مشابه در 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)"
  }
}

هدف-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)
        }

بعد از

سریع

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

هدف-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 جایگزین می‌شوند. مثلا:

قبل از

سریع

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

هدف-C

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

اندروید

FirebaseInstanceId.deleteInstanceId();

بعد از

سریع

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

هدف-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 بازیابی می کردند. اکنون، 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+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)"
  }
}

هدف-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()
})

سریع

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

هدف-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;
  }
}];
،

سرویس نصب Firebase (FIS) برای هر نمونه نصب شده یک برنامه Firebase یک شناسه نصب Firebase (FID) ارائه می‌کند. شناسه نصب 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

نظارت بر عملکرد از شناسه‌های نصب 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 بدون نیاز به برنامه‌نویسان برای تعامل مستقیم با 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
    // ...
          

    سریع

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    هدف-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. یک نمونه اشتراک‌گذاری شده FirebaseApp در روش برنامه نماینده برنامه application(_:didFinishLaunchingWithOptions:) پیکربندی کنید:

    SwiftUI

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

    سریع

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

    هدف-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. اگر از SwiftUI استفاده می‌کنید، باید یک نماینده برنامه ایجاد کنید و آن را از طریق UIApplicationDelegateAdaptor یا NSApplicationDelegateAdaptor به ساختار App خود متصل کنید. همچنین باید swizzling نمایندگی برنامه را غیرفعال کنید. برای اطلاعات بیشتر، دستورالعمل های SwiftUI را ببینید.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

اندروید

وابستگی نصب‌های Firebase Android SDK را به فایل Gradle ماژول (سطح برنامه) خود اضافه کنید (معمولا app/build.gradle ):

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

جاوا اسکریپت

بسته به نحوه میزبانی برنامه وب شما، ممکن است پیکربندی شما به صورت خودکار مدیریت شود یا ممکن است نیاز به به روز رسانی شی پیکربندی Firebase خود داشته باشید.

به عنوان مثال، اگر وابستگی های شما در index.html اضافه شده است، وابستگی را در عنصر <head> اضافه کنید:

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

بال بال زدن

  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 برای شناسایی نصب‌ها در عرض ۱۸۰ روز استفاده می‌کنند، حذف می‌شود. این فرآیند در بیانیه Google در مورد حذف و حفظ در سطح بالایی توضیح داده شده است.

مگر اینکه تمام خدمات تولید کننده 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");
}

هدف-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")
    }
}

جاوا اسکریپت

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

یک FID را با تماس API سرور حذف کنید

برای حذف یک FID با تماس API سرور، Firebase Admin SDK را به سرور خود اضافه کنید ، اگر قبلاً این کار را نکرده‌اید.

هنگامی که SDK اضافه شد، FID ها را از طریق فراخوانی تابع حذف در زبان انتخابی خود حذف کنید (توجه: به جز Node.js، این روش ها منعکس کننده نام گذاری Instance ID هستند. با این حال، همه آنها در واقع 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();

پایتون

  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 این کار را انجام دهید. به عنوان مثال، برای انجام آزمایش در طول توسعه پیام‌رسانی درون‌برنامه Firebase، می‌توانید دستگاه آزمایشی صحیح را با استفاده از شناسه نصب 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)")
}

هدف-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")
    }
}

جاوا اسکریپت

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

بازیابی نشانه های تأیید اعتبار نصب

سرویس های Firebase می توانند نصب های Firebase را با توکن های احراز هویت بازیابی شده از FIS تأیید کنند. به عنوان مثال، هنگام طراحی تست‌های A/B برای Remote Config، می‌توانید با استفاده از یک نشانه تأیید اعتبار نصب، یک دستگاه آزمایش هدفمند را احراز هویت کنید.

An installation auth token is a short-lived bearer token in JSON web token (JWT) format containing the following information for an installation:

  • The Firebase installation ID
  • The associated project ( projectNumber )
  • The associated Firebase application ID ( appId )
  • The token's expiration date

An installation auth token cannot be revoked, and remains valid until its expiration date. The default token lifetime is one week.

To retrieve an installation auth token:

Swift

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

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

Monitor the Firebase installation ID lifecycle

During the normal operation of an app, Firebase installation IDs (FIDs) don't require special monitoring. However, apps that explicitly retrieve and use FIDs should add logic to monitor the potential deletion or rotation of the FID. Here are some cases where FIDs could be deleted or rotated:

  • Uninstallation or reinstallation of the app, for instance when an end user installs on a new device.
  • The end user clears the cache of the app or the device.
  • FID deletion is triggered in the backend due to app inactivity (currently the threshold for this is 270 days of inactivity).

When apps experience FID rotation or deletion in these kinds of cases, they are assigned a new FID. Also, the installation auth token associated with a deleted FID is deleted, regardless of its own maturity, and is replaced with a new installation auth token.

Apps can monitor these changes and respond accordingly.

To monitor FID rotation:

Swift

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

An NSNotification named NSNotificationName.InstallationIDDidChange is posted to the default NSNotificationCenter whenever a new FID is assigned.

Android

Kotlin and Java clients should add retry logic to respond on failed calls to retrieve the new FID.

JavaScript

Web apps can subscribe to the onIdChange hook.

Whenever a new FID is created, the subscribed callback is triggered:

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

Dart

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

Migrate from Instance ID to Firebase installations

Prior to the introduction of Firebase installations, Firebase relied on the Instance ID SDK for identifiers of app installs. Firebase installations provides significant advantages over Instance ID in reliability, performance, and security. Firebase apps that depend on the Instance ID SDK should migrate to Firebase installations.

The migration process is different based on your app:

  • Apps that don't directly call Instance ID APIs can migrate by updating their SDK versions . Most Firebase apps fall into this category.

  • Apps that explicitly make API calls to Instance ID must update SDK versions and make code changes to replace Instance ID methods with their Firebase installations or FCM equivalents. If your app uses Instance ID to retrieve FCM registration tokens or explicitly uses Instance ID to target app instances or for any other purpose, you'll need to update your application code.

Currently, FIS is backward-compatible with the legacy identifier Firebase Instance ID. Deleting an IID is an alternative method of requesting data deletion with these Firebase SDKs:

  • iOS 6.14.0 and lower
  • Android SDKs earlier than February 27, 2020

This means that apps are not required to migrate to Firebase installations; however, doing so is highly recommended.

Upgrading to minimum SDK versions for Firebase installations

To migrate from Instance ID to Firebase installations, make sure that your applications use at least the listed minimum version numbers of the following Firebase SDKs:

Firebase SDK Minimum Android version Minimum iOS version
Firebase Cloud Messaging v20.3.0 v6.34.0
Remote Config v19.2.0 v6.24.0
Google Analytics for Firebase \ (Measurement SDK) v17.4.4 v6.18.0
In-App Messaging v19.0.7 v6.24.0
Performance Monitoring v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
ML Kit v22.1.2 v6.28.0

Updating code that explicitly calls Instance ID APIs

If your Android or Apple app directly uses Instance ID SDK methods, you can replace that usage with identical alternatives in the Firebase installations SDK or the FCM SDK.

Retrieving an identifier

Methods to get Instance IDs are replaced with methods to get an installations ID. For example:

Before

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

After

Swift

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

Deleting an identifier

Methods to delete Instance IDs are replaced with methods to delete Firebase installation IDs. For example:

Before

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

After

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

Retrieving an FCM registration token

Prior to the introduction of Firebase Installations, FCM clients retrieved registration tokens from Instance ID. Now, the FCM SDK provides methods to retrieve the registration token.

Before

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

After

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