Firebase 安裝服務 (FIS) 為每個已安裝的 Firebase 應用實例提供一個 Firebase 安裝 ID (FID)。 Firebase 安裝 ID 由以下 Firebase 服務在內部使用:
火力地堡服務 | Firebase 安裝功能 |
---|---|
Firebase 雲消息傳遞 | Firebase 雲消息傳遞使用 Firebase 安裝 ID 來定位設備以進行消息傳遞。 |
Firebase 崩潰分析 | Firebase Crashlytics 根據對應用實例的 Firebase 安裝 ID 的更改輪換 Crashlytics 安裝 UUID。將來,安裝 ID 可能用於啟用增強崩潰報告和崩潰管理服務的功能。 |
Firebase 應用內消息 | Firebase 應用內消息使用 Firebase 安裝 ID 來定位設備以進行消息傳遞。 |
Firebase 性能監控 | 性能監控使用 Firebase 安裝 ID 來計算訪問網絡資源的唯一 Firebase 安裝數量,以確保訪問模式充分匿名。它還使用 Firebase 安裝 ID 和 Firebase Remote Config 來管理性能事件報告的速率。 |
Firebase 遠程配置 | Remote Config 使用 Firebase 安裝 ID 來選擇配置值以返回給最終用戶設備。 |
火力地堡機器學習 | 在與應用程序實例交互時,Firebase ML 使用稱為安裝身份驗證令牌的憑證進行設備身份驗證,例如,將開發人員模型分發到應用程序實例。 |
Firebase 用戶細分存儲 | Firebase User Segmentation Storage 存儲 Firebase 安裝 ID 和相關屬性和細分,以便為使用它們的其他 Firebase 服務提供定位信息。 |
通常,Firebase 服務使用 Firebase 安裝服務,無需開發人員直接與 FIS API 交互。但是,在某些情況下,應用程序開發人員可能希望直接調用 FIS API,例如:
- 刪除 Firebase 安裝和與安裝相關的數據。
- 檢索標識符(Firebase 安裝 ID)以定位特定的應用程序安裝。
- 檢索安裝身份驗證令牌以驗證 Firebase 安裝。
要開始直接調用 FIS API,請將 SDK 添加到您的應用程序。
將 Firebase 安裝 SDK 添加到您的應用
iOS+
- 將 Firebase 安裝的依賴項添加到 Podfile:
pod 'FirebaseInstallations'
- 運行
pod install
並打開創建的.xcworkspace
文件。 - 在您的
UIApplicationDelegate
中導入FirebaseCore
模塊,以及您的應用委託使用的任何其他Firebase 模塊。例如,要使用 Cloud Firestore 和身份驗證:斯威夫特用戶界面
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
迅速
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
目標-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- 在您的應用委託的
application(_:didFinishLaunchingWithOptions:)
方法中配置一個FirebaseApp
共享實例:斯威夫特用戶界面
// 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];
- 如果您使用的是 SwiftUI,則必須創建一個應用程序委託並通過
UIApplicationDelegateAdaptor
或NSApplicationDelegateAdaptor
將其附加到您的App
結構。您還必須禁用應用委託調配。有關詳細信息,請參閱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'
JavaScript
根據您的 Web 應用程序的託管方式,您的配置可能會自動處理,或者您可能需要更新您的Firebase 配置對象。
例如,如果您的依賴項添加在 index.html 中,請在 <head> 元素中添加依賴項:
<script src="/__/firebase/9.22.1/firebase-installations.js"></script>
撲
在 Flutter 項目的根目錄中,運行以下命令來安裝 Firebase 安裝插件:
flutter pub add firebase_app_installations
重建你的項目:
flutter run
導入 Firebase 安裝插件:
import 'package:firebase_app_installations/firebase_app_installations.dart';
刪除 Firebase 安裝
與 Firebase 安裝相關的數據通常無法識別個人身份。儘管如此,為用戶提供管理和刪除這些數據的選項還是很有幫助的。
每個應用程序的每次安裝的 Firebase 安裝 ID 都是不同的;同一設備上的不同應用程序具有不同的 Firebase 安裝 ID。 Firebase 安裝 ID 標識應用程序安裝以及與這些應用程序安裝相關的數據。
當您刪除安裝 ID 時,與該安裝 ID 關聯的數據會在 180 天內從使用 Firebase 安裝 ID 識別安裝的所有 Firebase 服務的實時和備份系統中刪除。 Google關於刪除和保留的聲明在較高層次上描述了此過程。
除非您在應用程序中禁用所有生成 FID 的服務,否則 FIS 會在幾天內創建一個新 ID。 Firebase 將新創建的 ID 視為新的 Firebase 安裝,並且不會以任何方式將其與以前的 ID 或數據相關聯。
使用客戶端 API 調用刪除 FID
要刪除 Firebase 服務生成的 FID,請從 Firebase 安裝 SDK 調用適當的方法:
迅速
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") } }
JavaScript
await firebase.installations().delete();
Dart
await FirebaseInstallations.instance.delete();
使用服務器 API 調用刪除 FID
要使用服務器 API 調用刪除 FID,請將 Firebase Admin SDK 添加到您的服務器(如果您還沒有的話)。
添加 SDK 後,通過在您選擇的語言中調用刪除函數來刪除 FID(注意:除了 Node.js,這些方法反映了實例 ID 命名。但是,當使用任何當前的 Firebase 調用時,它們實際上都刪除了 FID開發工具包)。
節點.js
// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';
admin.installations().deleteInstallation(idToDelete);
Java
// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";
FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();
Python
from firebase_admin import instance_id
# An FID sent from a client service SDK
id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'
instance_id.delete_instance_id(id_to_delete)
去
client, err := app.InstanceId(ctx)
if err != nil {
log.Fatalln("error initializing client", err)
}
iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
log.Fatalln("error deleting FID", err)
}
當您使用服務器 API 調用刪除 Firebase 安裝 ID 時,Firebase 服務會啟動刪除與該安裝 ID 關聯的數據的過程,在 1-2 天內停止接受該 ID 的新數據,然後通知客戶端應用程序ID被刪除了。在 Firebase 通知客戶端應用程序之前,應用程序的某些服務可能仍以該 ID 為目標——例如,Firebase 安裝可能會繼續接收 FCM 通知幾個小時。
如果您想刪除當前的 Firebase 安裝 ID 並立即使用新的、不相關的 ID 使用 Firebase 服務,請使用客戶端 API 來處理刪除操作。
檢索客戶端標識符
如果您需要識別應用的特定安裝,您可以通過檢索 Firebase 安裝 ID 來實現。例如,要在 Firebase 應用內消息開發期間執行測試,您可以使用其 Firebase 安裝 ID 識別和定位正確的測試設備。
要檢索 Firebase 安裝 ID:
迅速
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") } }
JavaScript
const installationId = await firebase.installations().getId(); console.log(installationId);
Dart
String id = await FirebaseInstallations.instance.getId();
檢索安裝授權令牌
Firebase 服務可以使用從 FIS 檢索到的身份驗證令牌對 Firebase 安裝進行身份驗證。例如,在為 Remote Config 設計 A/B 測試時,您可以使用安裝授權令牌對目標測試設備進行身份驗證。
安裝授權令牌是 JSON Web 令牌 (JWT) 格式的短期不記名令牌,包含以下安裝信息:
- Firebase 安裝 ID
- 關聯項目 (
projectNumber
) - 關聯的 Firebase 應用程序 ID (
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") } }
JavaScript
const installationToken = await firebase.installations() .getToken(/* forceRefresh */ true); console.log(installationToken);
Dart
String token = await FirebaseInstallations.instance.getToken();
監控 Firebase 安裝 ID 生命週期
在應用程序的正常運行期間,Firebase 安裝 ID (FID) 不需要特殊監控。但是,顯式檢索和使用 FID 的應用程序應該添加邏輯來監控 FID 的潛在刪除或輪換。以下是可以刪除或輪換 FID 的一些情況:
- 應用程序的卸載或重新安裝,例如當最終用戶在新設備上安裝時。
- 最終用戶清除應用程序或設備的緩存。
- 由於應用程序不活動(目前的閾值是 270 天不活動),在後端觸發 FID 刪除。
當應用程序在這些情況下經歷 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]; }];
每當分配新的 FID 時,名為NSNotificationName.InstallationIDDidChange
的 NSNotification 都會發佈到默認的 NSNotificationCenter。
安卓
Kotlin 和 Java 客戶端應添加重試邏輯以響應失敗的調用以檢索新的 FID。
JavaScript
Web 應用程序可以訂閱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');
});
從實例 ID 遷移到 Firebase 安裝
在引入 Firebase 安裝之前,Firebase 依賴 Instance ID SDK 作為應用安裝的標識符。與 Instance ID 相比,Firebase 安裝在可靠性、性能和安全性方面具有顯著優勢。依賴於 Instance ID SDK 的 Firebase 應用程序應該遷移到 Firebase 安裝。
遷移過程因您的應用而異:
不直接調用 Instance ID API 的應用程序可以通過更新其 SDK 版本進行遷移。大多數 Firebase 應用都屬於這一類。
明確對實例 ID 進行 API 調用的應用程序必須更新 SDK 版本並進行代碼更改,以將實例 ID 方法替換為其 Firebase 安裝或 FCM 等效方法。如果您的應用程序使用實例 ID 來檢索 FCM 註冊令牌或明確使用實例 ID 來定位應用程序實例或用於任何其他目的,您將需要更新您的應用程序代碼。
目前,FIS 向後兼容舊標識符 Firebase 實例 ID。刪除 IID是使用這些 Firebase SDK 請求刪除數據的替代方法:
- iOS 6.14.0 及更低版本
- 2020 年 2 月 27 日之前的 Android SDK
這意味著應用程序不需要遷移到 Firebase 安裝;但是,強烈建議這樣做。
升級到 Firebase 安裝的最低 SDK 版本
要從實例 ID 遷移到 Firebase 安裝,請確保您的應用程序至少使用以下 Firebase SDK 列出的最低版本號:
火力地堡SDK | 最低安卓版本 | 最低 iOS 版本 |
Firebase 雲消息傳遞 | v20.3.0 | v6.34.0 |
遠程配置 | v19.2.0 | v6.24.0 |
Google Analytics for Firebase \(測量 SDK) | v17.4.4 | v6.18.0 |
應用內消息 | v19.0.7 | v6.24.0 |
性能監控 | v19.0.8 | v6.21.0 |
崩潰分析 | v17.2.1 | v6.23.0 |
機器學習套件 | v22.1.2 | v6.28.0 |
更新顯式調用實例 ID API 的代碼
如果您的 Android 或 Apple 應用程序直接使用 Instance ID SDK 方法,您可以在 Firebase 安裝 SDK 或 FCM SDK 中用相同的替代方法替換該用法。
檢索標識符
獲取實例 ID 的方法被替換為獲取安裝 ID 的方法。例如:
前
迅速
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") } }
刪除標識符
刪除實例 ID 的方法已替換為刪除 Firebase 安裝 ID 的方法。例如:
前
迅速
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 安裝之前,FCM 客戶端從實例 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 安裝 ID (FID)。 Firebase 安裝 ID 由以下 Firebase 服務在內部使用:
火力地堡服務 | Firebase 安裝功能 |
---|---|
Firebase 雲消息傳遞 | Firebase 雲消息傳遞使用 Firebase 安裝 ID 來定位設備以進行消息傳遞。 |
Firebase 崩潰分析 | Firebase Crashlytics 根據對應用實例的 Firebase 安裝 ID 的更改輪換 Crashlytics 安裝 UUID。將來,安裝 ID 可能用於啟用增強崩潰報告和崩潰管理服務的功能。 |
Firebase 應用內消息 | Firebase 應用內消息使用 Firebase 安裝 ID 來定位設備以進行消息傳遞。 |
Firebase 性能監控 | 性能監控使用 Firebase 安裝 ID 來計算訪問網絡資源的唯一 Firebase 安裝數量,以確保訪問模式充分匿名。它還使用 Firebase 安裝 ID 和 Firebase Remote Config 來管理性能事件報告的速率。 |
Firebase 遠程配置 | Remote Config 使用 Firebase 安裝 ID 來選擇配置值以返回給最終用戶設備。 |
火力地堡機器學習 | 在與應用程序實例交互時,Firebase ML 使用稱為安裝身份驗證令牌的憑證進行設備身份驗證,例如,將開發人員模型分發到應用程序實例。 |
Firebase 用戶細分存儲 | Firebase User Segmentation Storage 存儲 Firebase 安裝 ID 和相關屬性和細分,以便為使用它們的其他 Firebase 服務提供定位信息。 |
通常,Firebase 服務使用 Firebase 安裝服務,無需開發人員直接與 FIS API 交互。但是,在某些情況下,應用程序開發人員可能希望直接調用 FIS API,例如:
- 刪除 Firebase 安裝和與安裝相關的數據。
- 檢索標識符(Firebase 安裝 ID)以定位特定的應用程序安裝。
- 檢索安裝身份驗證令牌以驗證 Firebase 安裝。
要開始直接調用 FIS API,請將 SDK 添加到您的應用程序。
將 Firebase 安裝 SDK 添加到您的應用
iOS+
- 將 Firebase 安裝的依賴項添加到 Podfile:
pod 'FirebaseInstallations'
- 運行
pod install
並打開創建的.xcworkspace
文件。 - 在您的
UIApplicationDelegate
中導入FirebaseCore
模塊,以及您的應用委託使用的任何其他Firebase 模塊。例如,要使用 Cloud Firestore 和身份驗證:斯威夫特用戶界面
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
迅速
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
目標-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- 在您的應用委託的
application(_:didFinishLaunchingWithOptions:)
方法中配置一個FirebaseApp
共享實例:斯威夫特用戶界面
// 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];
- 如果您使用的是 SwiftUI,則必須創建一個應用程序委託並通過
UIApplicationDelegateAdaptor
或NSApplicationDelegateAdaptor
將其附加到您的App
結構。您還必須禁用應用委託調配。有關詳細信息,請參閱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'
JavaScript
根據您的 Web 應用程序的託管方式,您的配置可能會自動處理,或者您可能需要更新您的Firebase 配置對象。
例如,如果您的依賴項添加在 index.html 中,請在 <head> 元素中添加依賴項:
<script src="/__/firebase/9.22.1/firebase-installations.js"></script>
撲
在 Flutter 項目的根目錄中,運行以下命令來安裝 Firebase 安裝插件:
flutter pub add firebase_app_installations
重建你的項目:
flutter run
導入 Firebase 安裝插件:
import 'package:firebase_app_installations/firebase_app_installations.dart';
刪除 Firebase 安裝
與 Firebase 安裝相關的數據通常無法識別個人身份。儘管如此,為用戶提供管理和刪除這些數據的選項還是很有幫助的。
每個應用程序的每次安裝的 Firebase 安裝 ID 都是不同的;同一設備上的不同應用程序具有不同的 Firebase 安裝 ID。 Firebase 安裝 ID 標識應用程序安裝以及與這些應用程序安裝相關的數據。
當您刪除安裝 ID 時,與該安裝 ID 關聯的數據會在 180 天內從使用 Firebase 安裝 ID 識別安裝的所有 Firebase 服務的實時和備份系統中刪除。 Google關於刪除和保留的聲明在較高層次上描述了此過程。
除非您在應用程序中禁用所有生成 FID 的服務,否則 FIS 會在幾天內創建一個新 ID。 Firebase 將新創建的 ID 視為新的 Firebase 安裝,並且不會以任何方式將其與以前的 ID 或數據相關聯。
使用客戶端 API 調用刪除 FID
要刪除 Firebase 服務生成的 FID,請從 Firebase 安裝 SDK 調用適當的方法:
迅速
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") } }
JavaScript
await firebase.installations().delete();
Dart
await FirebaseInstallations.instance.delete();
使用服務器 API 調用刪除 FID
要使用服務器 API 調用刪除 FID,請將 Firebase Admin SDK 添加到您的服務器(如果您還沒有的話)。
添加 SDK 後,通過在您選擇的語言中調用刪除函數來刪除 FID(注意:除了 Node.js,這些方法反映了實例 ID 命名。但是,當使用任何當前的 Firebase 調用時,它們實際上都刪除了 FID開發工具包)。
節點.js
// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';
admin.installations().deleteInstallation(idToDelete);
Java
// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";
FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();
Python
from firebase_admin import instance_id
# An FID sent from a client service SDK
id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'
instance_id.delete_instance_id(id_to_delete)
去
client, err := app.InstanceId(ctx)
if err != nil {
log.Fatalln("error initializing client", err)
}
iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
log.Fatalln("error deleting FID", err)
}
當您使用服務器 API 調用刪除 Firebase 安裝 ID 時,Firebase 服務會啟動刪除與該安裝 ID 關聯的數據的過程,在 1-2 天內停止接受該 ID 的新數據,然後通知客戶端應用程序ID被刪除了。在 Firebase 通知客戶端應用程序之前,應用程序的某些服務可能仍以該 ID 為目標——例如,Firebase 安裝可能會繼續接收 FCM 通知幾個小時。
如果您想刪除當前的 Firebase 安裝 ID 並立即使用新的、不相關的 ID 使用 Firebase 服務,請使用客戶端 API 來處理刪除操作。
檢索客戶端標識符
如果您需要識別應用的特定安裝,您可以通過檢索 Firebase 安裝 ID 來實現。例如,要在 Firebase 應用內消息開發期間執行測試,您可以使用其 Firebase 安裝 ID 識別和定位正確的測試設備。
要檢索 Firebase 安裝 ID:
迅速
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") } }
JavaScript
const installationId = await firebase.installations().getId(); console.log(installationId);
Dart
String id = await FirebaseInstallations.instance.getId();
檢索安裝授權令牌
Firebase 服務可以使用從 FIS 檢索到的身份驗證令牌對 Firebase 安裝進行身份驗證。例如,在為 Remote Config 設計 A/B 測試時,您可以使用安裝授權令牌對目標測試設備進行身份驗證。
安裝授權令牌是 JSON Web 令牌 (JWT) 格式的短期不記名令牌,包含以下安裝信息:
- Firebase 安裝 ID
- 關聯項目 (
projectNumber
) - 關聯的 Firebase 應用程序 ID (
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") } }
JavaScript
const installationToken = await firebase.installations() .getToken(/* forceRefresh */ true); console.log(installationToken);
Dart
String token = await FirebaseInstallations.instance.getToken();
監控 Firebase 安裝 ID 生命週期
在應用程序的正常運行期間,Firebase 安裝 ID (FID) 不需要特殊監控。但是,顯式檢索和使用 FID 的應用程序應該添加邏輯來監控 FID 的潛在刪除或輪換。以下是可以刪除或輪換 FID 的一些情況:
- 應用程序的卸載或重新安裝,例如當最終用戶在新設備上安裝時。
- 最終用戶清除應用程序或設備的緩存。
- 由於應用程序不活動(目前的閾值是 270 天不活動),在後端觸發 FID 刪除。
當應用程序在這些情況下經歷 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]; }];
每當分配新的 FID 時,名為NSNotificationName.InstallationIDDidChange
的 NSNotification 都會發佈到默認的 NSNotificationCenter。
安卓
Kotlin 和 Java 客戶端應添加重試邏輯以響應失敗的調用以檢索新的 FID。
JavaScript
Web 應用程序可以訂閱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');
});
從實例 ID 遷移到 Firebase 安裝
在引入 Firebase 安裝之前,Firebase 依賴 Instance ID SDK 作為應用安裝的標識符。與 Instance ID 相比,Firebase 安裝在可靠性、性能和安全性方面具有顯著優勢。依賴於 Instance ID SDK 的 Firebase 應用程序應該遷移到 Firebase 安裝。
遷移過程因您的應用而異:
不直接調用 Instance ID API 的應用程序可以通過更新其 SDK 版本進行遷移。大多數 Firebase 應用都屬於這一類。
明確對實例 ID 進行 API 調用的應用程序必須更新 SDK 版本並進行代碼更改,以將實例 ID 方法替換為其 Firebase 安裝或 FCM 等效方法。如果您的應用程序使用實例 ID 來檢索 FCM 註冊令牌或明確使用實例 ID 來定位應用程序實例或用於任何其他目的,您將需要更新您的應用程序代碼。
目前,FIS 向後兼容舊標識符 Firebase 實例 ID。刪除 IID是使用這些 Firebase SDK 請求刪除數據的替代方法:
- iOS 6.14.0 及更低版本
- 2020 年 2 月 27 日之前的 Android SDK
這意味著應用程序不需要遷移到 Firebase 安裝;但是,強烈建議這樣做。
升級到 Firebase 安裝的最低 SDK 版本
要從實例 ID 遷移到 Firebase 安裝,請確保您的應用程序至少使用以下 Firebase SDK 列出的最低版本號:
火力地堡SDK | 最低安卓版本 | 最低 iOS 版本 |
Firebase 雲消息傳遞 | v20.3.0 | v6.34.0 |
遠程配置 | v19.2.0 | v6.24.0 |
Google Analytics for Firebase \(測量 SDK) | v17.4.4 | v6.18.0 |
應用內消息 | v19.0.7 | v6.24.0 |
性能監控 | v19.0.8 | v6.21.0 |
崩潰分析 | v17.2.1 | v6.23.0 |
機器學習套件 | v22.1.2 | v6.28.0 |
更新顯式調用實例 ID API 的代碼
如果您的 Android 或 Apple 應用程序直接使用 Instance ID SDK 方法,您可以在 Firebase 安裝 SDK 或 FCM SDK 中用相同的替代方法替換該用法。
檢索標識符
獲取實例 ID 的方法被替換為獲取安裝 ID 的方法。例如:
前
迅速
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") } }
刪除標識符
刪除實例 ID 的方法已替換為刪除 Firebase 安裝 ID 的方法。例如:
前
迅速
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 安裝之前,FCM 客戶端從實例 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 安裝 ID (FID)。 Firebase 安裝 ID 由以下 Firebase 服務在內部使用:
火力地堡服務 | Firebase 安裝功能 |
---|---|
Firebase 雲消息傳遞 | Firebase 雲消息傳遞使用 Firebase 安裝 ID 來定位設備以進行消息傳遞。 |
Firebase 崩潰分析 | Firebase Crashlytics 根據對應用實例的 Firebase 安裝 ID 的更改輪換 Crashlytics 安裝 UUID。將來,安裝 ID 可能用於啟用增強崩潰報告和崩潰管理服務的功能。 |
Firebase 應用內消息 | Firebase 應用內消息使用 Firebase 安裝 ID 來定位設備以進行消息傳遞。 |
Firebase 性能監控 | 性能監控使用 Firebase 安裝 ID 來計算訪問網絡資源的唯一 Firebase 安裝數量,以確保訪問模式充分匿名。它還使用 Firebase 安裝 ID 和 Firebase Remote Config 來管理性能事件報告的速率。 |
Firebase 遠程配置 | Remote Config 使用 Firebase 安裝 ID 來選擇配置值以返回給最終用戶設備。 |
火力地堡機器學習 | 在與應用程序實例交互時,Firebase ML 使用稱為安裝身份驗證令牌的憑證進行設備身份驗證,例如,將開發人員模型分發到應用程序實例。 |
Firebase 用戶細分存儲 | Firebase User Segmentation Storage 存儲 Firebase 安裝 ID 和相關屬性和細分,以便為使用它們的其他 Firebase 服務提供定位信息。 |
通常,Firebase 服務使用 Firebase 安裝服務,無需開發人員直接與 FIS API 交互。但是,在某些情況下,應用程序開發人員可能希望直接調用 FIS API,例如:
- 刪除 Firebase 安裝和與安裝相關的數據。
- 檢索標識符(Firebase 安裝 ID)以定位特定的應用程序安裝。
- 檢索安裝身份驗證令牌以驗證 Firebase 安裝。
要開始直接調用 FIS API,請將 SDK 添加到您的應用程序。
將 Firebase 安裝 SDK 添加到您的應用
iOS+
- 將 Firebase 安裝的依賴項添加到 Podfile:
pod 'FirebaseInstallations'
- 運行
pod install
並打開創建的.xcworkspace
文件。 - 在您的
UIApplicationDelegate
中導入FirebaseCore
模塊,以及您的應用委託使用的任何其他Firebase 模塊。例如,要使用 Cloud Firestore 和身份驗證:斯威夫特用戶界面
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
迅速
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
目標-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- 在您的應用委託的
application(_:didFinishLaunchingWithOptions:)
方法中配置一個FirebaseApp
共享實例:斯威夫特用戶界面
// 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];
- 如果您使用的是 SwiftUI,則必須創建一個應用程序委託並通過
UIApplicationDelegateAdaptor
或NSApplicationDelegateAdaptor
將其附加到您的App
結構。您還必須禁用應用委託調配。有關詳細信息,請參閱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'
JavaScript
根據您的 Web 應用程序的託管方式,您的配置可能會自動處理,或者您可能需要更新您的Firebase 配置對象。
例如,如果您的依賴項添加在 index.html 中,請在 <head> 元素中添加依賴項:
<script src="/__/firebase/9.22.1/firebase-installations.js"></script>
撲
在 Flutter 項目的根目錄中,運行以下命令來安裝 Firebase 安裝插件:
flutter pub add firebase_app_installations
重建你的項目:
flutter run
導入 Firebase 安裝插件:
import 'package:firebase_app_installations/firebase_app_installations.dart';
刪除 Firebase 安裝
與 Firebase 安裝相關的數據通常無法識別個人身份。儘管如此,為用戶提供管理和刪除這些數據的選項還是很有幫助的。
每個應用程序的每次安裝的 Firebase 安裝 ID 都是不同的;同一設備上的不同應用程序具有不同的 Firebase 安裝 ID。 Firebase 安裝 ID 標識應用程序安裝以及與這些應用程序安裝相關的數據。
當您刪除安裝 ID 時,與該安裝 ID 關聯的數據會在 180 天內從使用 Firebase 安裝 ID 識別安裝的所有 Firebase 服務的實時和備份系統中刪除。 Google關於刪除和保留的聲明在較高層次上描述了此過程。
除非您在應用程序中禁用所有生成 FID 的服務,否則 FIS 會在幾天內創建一個新 ID。 Firebase 將新創建的 ID 視為新的 Firebase 安裝,並且不會以任何方式將其與以前的 ID 或數據相關聯。
使用客戶端 API 調用刪除 FID
要刪除 Firebase 服務生成的 FID,請從 Firebase 安裝 SDK 調用適當的方法:
迅速
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") } }
JavaScript
await firebase.installations().delete();
Dart
await FirebaseInstallations.instance.delete();
使用服務器 API 調用刪除 FID
要使用服務器 API 調用刪除 FID,請將 Firebase Admin SDK 添加到您的服務器(如果您還沒有的話)。
添加 SDK 後,通過在您選擇的語言中調用刪除函數來刪除 FID(注意:除了 Node.js,這些方法反映了實例 ID 命名。但是,當使用任何當前的 Firebase 調用時,它們實際上都刪除了 FID開發工具包)。
節點.js
// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';
admin.installations().deleteInstallation(idToDelete);
Java
// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";
FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();
Python
from firebase_admin import instance_id
# An FID sent from a client service SDK
id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'
instance_id.delete_instance_id(id_to_delete)
去
client, err := app.InstanceId(ctx)
if err != nil {
log.Fatalln("error initializing client", err)
}
iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
log.Fatalln("error deleting FID", err)
}
當您使用服務器 API 調用刪除 Firebase 安裝 ID 時,Firebase 服務會啟動刪除與該安裝 ID 關聯的數據的過程,在 1-2 天內停止接受該 ID 的新數據,然後通知客戶端應用程序ID被刪除了。在 Firebase 通知客戶端應用程序之前,應用程序的某些服務可能仍以該 ID 為目標——例如,Firebase 安裝可能會繼續接收 FCM 通知幾個小時。
如果您想刪除當前的 Firebase 安裝 ID 並立即使用新的、不相關的 ID 使用 Firebase 服務,請使用客戶端 API 來處理刪除操作。
檢索客戶端標識符
如果您需要識別應用的特定安裝,您可以通過檢索 Firebase 安裝 ID 來實現。例如,要在 Firebase 應用內消息開發期間執行測試,您可以使用其 Firebase 安裝 ID 識別和定位正確的測試設備。
要檢索 Firebase 安裝 ID:
迅速
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") } }
JavaScript
const installationId = await firebase.installations().getId(); console.log(installationId);
Dart
String id = await FirebaseInstallations.instance.getId();
檢索安裝授權令牌
Firebase 服務可以使用從 FIS 檢索到的身份驗證令牌對 Firebase 安裝進行身份驗證。例如,在為 Remote Config 設計 A/B 測試時,您可以使用安裝授權令牌對目標測試設備進行身份驗證。
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; } }];