管理 Firebase 安裝

Firebase 安裝服務 (FIS) 為 Firebase 應用程式的每個已安裝實例提供 Firebase 安裝 ID (FID)。 Firebase 安裝 ID 由下列 Firebase 服務在內部使用:

Firebase 服務Firebase 安裝功能
Firebase 雲端訊息傳遞

Firebase Cloud Messaging 使用 Firebase 安裝 ID 來決定訊息傳遞的目標裝置。

Firebase Crashlytics

Firebase Crashlytics 根據應用程式實例的 Firebase 安裝 ID 的變更輪替 Crashlytics 安裝 UUID。將來,安裝 ID 可能會用於啟用增強崩潰報告和崩潰管理服務的功能。

Firebase 應用程式內訊息傳遞

Firebase 應用程式內訊息傳遞使用 Firebase 安裝 ID 來定位訊息傳遞的目標裝置。

Firebase 效能監控

效能監控使用 Firebase 安裝 ID 來計算存取網路資源的唯一 Firebase 安裝數量,以確保存取模式足夠匿名。它還將 Firebase 安裝 ID 與 Firebase Remote Config 結合使用來管理效能事件報告的速率。

Firebase 遠端配置

遠端配置使用 Firebase 安裝 ID 來選擇配置值以返回最終用戶設備。

Firebase 機器學習

Firebase ML 在與應用程式執行個體互動時使用稱為安裝驗證令牌的憑證進行裝置驗證,例如將開發人員模型分發到應用程式實例。

Firebase 用戶細分存儲

Firebase 使用者細分儲存儲存 Firebase 安裝 ID 以及相關屬性和細分,以便為使用它們的其他 Firebase 服務提供定位資訊。

通常,Firebase 服務使用 Firebase 安裝服務,無需開發人員直接與 FIS API 互動。但是,在某些情況下,應用程式開發人員可能希望直接呼叫 FIS API,例如:

  • 刪除 Firebase 安裝以及與該安裝相關的資料。
  • 檢索標識符(Firebase 安裝 ID)以定位特定的應用安裝。
  • 檢索安裝身份驗證令牌以對 Firebase 安裝進行身份驗證。

要開始直接呼叫 FIS API,請將 SDK 新增到您的應用程式。

將 Firebase 安裝 SDK 新增到您的應用

iOS+

  1. 將 Firebase 安裝的依賴項新增至您的 Podfile:
    pod 'FirebaseInstallations'
  2. 運行pod install並開啟建立的.xcworkspace檔。
  3. UIApplicationDelegate中導入FirebaseCore模組,以及應用程式委託使用的任何其他Firebase 模組。例如,要使用 Cloud Firestore 和身份驗證:

    斯威夫特使用者介面

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    迅速

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. 在應用程式委託的application(_:didFinishLaunchingWithOptions:)方法中設定FirebaseApp共享實例:

    斯威夫特使用者介面

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

    迅速

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. 如果您使用 SwiftUI,則必須建立應用程式委託並透過UIApplicationDelegateAdaptorNSApplicationDelegateAdaptor將其附加到您的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.2.0'

JavaScript

根據您的 Web 應用程式的託管方式,您的配置可能會自動處理,或者您可能需要更新您的Firebase 設定物件

例如,如果您的依賴項新增在index.html中,請在 <head> 元素中新增依賴項:

<script src="/__/firebase/10.9.0/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 安裝 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 呼叫適當的方法:

迅速

do {
  try await Installations.installations().delete()
  print("Installation deleted");
} catch {
  print("Error deleting installation: \(error)")
}

Objective-C

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

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin+KTX

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

JavaScript

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

透過伺服器 API 呼叫刪除 FID

若要透過伺服器 API 呼叫刪除 FID,請將 Firebase Admin SDK 新增至您的伺服器(如果尚未新增)。

新增SDK 後,透過以您選擇的語言呼叫刪除函數來刪除FID(注意:除了Node.js 之外,這些方法反映了實例ID 命名。但是,當使用任何目前的Firebase 呼叫時,它們實際上都會刪除FID) SDK)。

Node.js

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

admin.installations().deleteInstallation(idToDelete);

Java

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

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

Python

  from firebase_admin import instance_id

  # An FID sent from a client service SDK
  id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'

  instance_id.delete_instance_id(id_to_delete)

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 來實現。例如,要建立用於 BiqQuery 匯入的應用程式安裝分段,或要在 Firebase 應用程式內訊息開發期間執行測試,您可以使用對應的 Firebase 安裝 ID 來識別並定位正確的裝置。

若要檢索 Firebase 安裝 ID:

迅速

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

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

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

JavaScript

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

Dart

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

檢索安裝身份驗證令牌

Firebase 服務可以使用從 FIS 檢索到的身份驗證令牌對 Firebase 安裝進行身份驗證。例如,在為遠端設定設計 A/B 測試時,您可以使用安裝驗證令牌對目標測試裝置進行身份驗證。

安裝驗證令牌是 JSON Web 令牌 (JWT) 格式的短期不記名令牌,包含以下安裝資訊:

  • Firebase 安裝 ID
  • 關聯項目 ( projectNumber )
  • 關聯的 Firebase 應用程式 ID ( appId )
  • 令牌的到期日期

安裝身份驗證令牌無法撤銷,並且在到期日期之前保持有效。預設令牌有效期為一周。

若要檢索安裝身份驗證令牌:

迅速

do {
  let result = try await Installations.installations()
    .authTokenForcingRefresh(true)
  print("Installation auth token: \(result.authToken)")
} catch {
  print("Error fetching token: \(error)")
}

Objective-C

[[FIRInstallations installations] authTokenForcingRefresh:true
                                               completion:^(FIRInstallationsAuthTokenResult *result, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation token %@", error);
    return;
  }
  NSLog(@"Installation auth token: %@", [result authToken]);
}];

Java

FirebaseInstallations.getInstance().getToken(/* forceRefresh */true)
        .addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
    @Override
    public void onComplete(@NonNull Task<InstallationTokenResult> task) {
        if (task.isSuccessful() && task.getResult() != null) {
            Log.d("Installations", "Installation auth token: " + task.getResult().getToken());
        } else {
            Log.e("Installations", "Unable to get Installation auth token");
        }
    }
});

Kotlin+KTX

val forceRefresh = true
FirebaseInstallations.getInstance().getToken(forceRefresh)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d("Installations", "Installation auth token: " + task.result?.token)
        } else {
            Log.e("Installations", "Unable to get Installation auth token")
        }
    }

JavaScript

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

Dart

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

監控 Firebase 安裝 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
  Task {
    await self.fetchInstallationToken()
  }
}

Objective-C

__weak __auto_type weakSelf = self;
self.installationIDObserver = [[NSNotificationCenter defaultCenter]
        addObserverForName: FIRInstallationIDDidChangeNotification
                    object:nil
                     queue:nil
                usingBlock:^(NSNotification * _Nonnull notification) {
    // Fetch new Installation ID
    [weakSelf fetchInstallationsID];
}];

每當分配新的 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 來取得應用程式安裝的識別碼。 Firebase 安裝在可靠性、效能和安全性方面比實例 ID 具有顯著優勢。依賴實例 ID SDK 的 Firebase 應用程式應遷移到 Firebase 安裝。

遷移過程因您的應用程式而異:

  • 不直接呼叫實例 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 列出的最低版本號:

Firebase 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 應用程式直接使用實例 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)"
  }
}

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

迅速

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

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

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

刪除標識符

刪除實例 ID 的方法已取代為刪除 Firebase 安裝 ID 的方法。例如:

迅速

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

安卓

FirebaseInstanceId.deleteInstanceId();

迅速

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

Objective-C

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

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin+KTX

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

檢索 FCM 註冊令牌

在引入 Firebase 安裝之前,FCM 用戶端會從實例 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)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Kotlin+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

迅速

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