管理 Firebase 安裝作業

Firebase 安裝服務 (FIS) 提供 每個已安裝執行個體的 Firebase 安裝 ID (FID) Firebase 應用程式的後盾這些 Firebase 內部會使用 Firebase 安裝 ID 服務:

Firebase 服務 Firebase 安裝功能
Firebase 雲端通訊

Firebase 雲端通訊的用途 Firebase 安裝 ID 可指定訊息傳送目標裝置。

Firebase Crashlytics

Firebase Crashlytics 會輪替 Crashlytics 安裝作業 以應用程式執行個體 Firebase 變更為依據的 UUID 安裝 ID。日後 安裝 ID 可用來啟用 強化當機回報和當機管理服務。

Firebase 應用程式內通訊

Firebase 應用程式內通訊會使用 Firebase 安裝 ID 可指定訊息傳送目標裝置。

Firebase Performance Monitoring

Performance Monitoring 使用 Firebase 安裝 ID 來計算存取的不重複 Firebase 安裝次數 確保存取模式 以及充分的匿名資料此架構也採用 含 Firebase 遠端設定的 Firebase 安裝 ID 管理成效事件報表的比率

Firebase 遠端設定

遠端設定會使用 Firebase 安裝 ID 即可選取設定 傳回至使用者裝置

Firebase ML

已呼叫憑證 Firebase ML 會將安裝驗證權杖用於 與應用程式互動時的裝置驗證 將開發人員模型發布至應用程式執行個體

Firebase 使用者區隔儲存空間

Firebase 使用者區隔儲存空間會儲存 Firebase 安裝 ID 以及相關的屬性和區隔 供其他 Firebase 服務使用

一般而言,Firebase 服務會使用 Firebase 安裝服務,而不需要 要求開發人員直接與 FIS API 互動。 不過,在某些情況下,應用程式開發人員可能會想直接呼叫 FIS API,例如:

  • 如何刪除 Firebase 安裝項目和與安裝作業相關的資料。
  • 擷取 ID (Firebase 安裝 ID),以便指定 特定應用程式安裝。
  • 擷取安裝驗證權杖以驗證 Firebase 安裝。

如要開始使用直接通話功能 ,將 SDK 加入您的應用程式。

在應用程式中加入 Firebase Installs SDK

iOS+

  1. 將 Firebase 安裝項目的依附元件新增至 Podfile:
    pod 'FirebaseInstallations'
  2. 執行 pod install,然後開啟建立的 .xcworkspace 檔案。
  3. FirebaseCore 模組匯入至 UIApplicationDelegate和任何其他 應用程式委派所用的 Firebase 模組。 例如,如要使用 Cloud Firestore 和驗證功能:

    SwiftUI

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

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. 設定 FirebaseApp 共用執行個體 application(_:didFinishLaunchingWithOptions:) 方法:

    SwiftUI

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

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. 如果您使用 SwiftUI,則必須建立並附加應用程式委派 透過 UIApplicationDelegateAdaptorApp NSApplicationDelegateAdaptor。您也必須停用應用程式委派功能切換功能。適用對象 詳情請參閱 SwiftUI 操作說明

    SwiftUI

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

Android

將 Firebase 安裝 Android SDK 的依附元件新增至 模組 (應用程式層級) Gradle 檔案 (通常是 app/build.gradle):

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

JavaScript

視網頁應用程式的託管方式而定,您的設定可能會 否則可能需要更新 Firebase 設定物件

舉例來說,如果您的依附元件已新增至 index.html,請將 <head> 中的依附元件元素:

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

Flutter

  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 相關聯的資料 安裝 ID 會從所有 使用 Firebase 安裝 ID 識別安裝項目的 Firebase 服務 180 天內。這項程序會在 Google 刪除與保留的聲明

除非您停用 後,FIS 會在幾天內建立新 ID。Firebase 系統會將新建立的 ID 視為新的 Firebase 安裝,且 未以任何方式將資料庫與先前的 ID 或資料建立關聯。

透過用戶端 API 呼叫刪除 FID

如要刪除 Firebase 服務產生的 FID,請按照下列步驟操作: 從 Firebase 安裝 SDK 呼叫適當的方法:

Swift

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

Objective-C

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

Java

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

Kotlin+KTX

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

JavaScript

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

使用伺服器 API 呼叫刪除 FID

如何使用伺服器 API 刪除 FID 呼叫,請將 Firebase Admin SDK 新增至伺服器 (如果尚未這麼做)。

新增 SDK 後,請呼叫 以您選擇的語言刪除函式 (注意:除了 Node.js 之外,這些函式 方法反映執行個體 ID 的命名方式然而,他們實際上會刪除 FID )。

Node.js

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

admin.installations().deleteInstallation(idToDelete);

Java

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

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

Python

  from firebase_admin import instance_id

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

  instance_id.delete_instance_id(id_to_delete)

Go

client, err := app.InstanceId(ctx)
if err != nil {
  log.Fatalln("error initializing client", err)
}

iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
  log.Fatalln("error deleting FID", err)
}

刪除使用伺服器 API 呼叫的 Firebase 安裝 ID 時,Firebase 服務會啟動刪除該安裝 ID 關聯的資料, 接受 1 至 2 天內針對該 ID 的新資料,然後通知 用戶端應用程式 ID 遭到刪除。直到 Firebase 通知用戶端應用程式為止 應用程式的服務仍可能指定該 ID,例如 Firebase 系統可能會在以下幾個情況下繼續收到 FCM 通知: 所以客戶只會在 TAM 當地的服務時間獲得回應

如要刪除目前的 Firebase 安裝 ID 並立即使用 使用不相關的新 ID 接收 Firebase 服務,或使用用戶端 API 來處理刪除作業。

擷取用戶端 ID

如果您需要辨識應用程式的特定安裝項目, 方法是擷取 Firebase 安裝 ID。舉例來說 將應用程式安裝區隔用於 BigQuery 匯入 在 Firebase 應用程式內通訊開發期間進行測試時,您可以找出 並使用相應的 Firebase 安裝 ID 來指定正確的裝置。

如何擷取 Firebase 安裝 ID:

Swift

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

Objective-C

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

Java

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

Kotlin+KTX

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

JavaScript

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

Dart

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

擷取安裝驗證權杖

Firebase 服務可以使用驗證權杖來驗證 Firebase 安裝項目 擷取的網頁。例如,設計 A/B 版本測試時 驗證目標測試裝置時,您可以使用 安裝驗證權杖

安裝驗證權杖是短期的不記名權杖 採用 JSON Web Token (JWT) 格式,其中包含下列資訊: 安裝:

  • Firebase 安裝 ID
  • 相關聯的專案 (projectNumber)
  • 相關聯的 Firebase 應用程式 ID (appId)
  • 權杖到期日

安裝驗證權杖無法撤銷,有效期限至 到期日預設權杖生命週期為一週。

如何擷取安裝驗證權杖:

Swift

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

Objective-C

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

Java

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

Kotlin+KTX

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

JavaScript

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

Dart

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

監控 Firebase 安裝 ID 的生命週期

在應用程式正常運作期間,Firebase 安裝 ID (FID) 不需要特別監控。 不過,明確擷取及使用 FID 的應用程式,應該 加入邏輯,監控 FID。以下列舉幾個 您可以刪除或輪替 FID:

  • 解除安裝或重新安裝應用程式,例如使用者操作時 安裝在新裝置上。
  • 使用者清除應用程式或裝置的快取。
  • 應用程式因故在後端觸發 FID 刪除作業 閒置 (目前期限為 270 天無活動)。

應用程式發生 FID 旋轉或刪除情形時 都會獲派新的 FID此外, 與已刪除的 FID 相關聯的安裝驗證權杖為 刪除後 (不論其成熟度為何),並由新的 安裝驗證權杖

應用程式可以監控變更,並做出相應回應。

如何監控 FID 旋轉:

Swift

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

Objective-C

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

名為「NSNotificationName.InstallationIDDidChange」的 NSNotification 為 每當有新的 已指派 FID。

Android

Kotlin 和 Java 用戶端應新增重試邏輯,以回應失敗的呼叫 擷取新的 FID。

JavaScript

網頁應用程式可以訂閱 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 是以 執行個體 ID SDK,適用於應用程式安裝的 ID。Firebase 安裝 相較於執行個體 ID,在可靠性、效能 和安全性。請遷移依附執行個體 ID SDK 的 Firebase 應用程式 到 Firebase 安裝

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

  • 未直接呼叫執行個體 ID API 的應用程式,可透過下列方式遷移執行個體: 更新 SDK 版本。 大多數的 Firebase 應用程式都屬於這個類別。

  • 如果應用程式明確對執行個體 ID 發出 API 呼叫,就必須更新 SDK 版本 以及 變更程式碼,以取代執行個體 ID 方法 Firebase 安裝或 FCM 同等項目。如果應用程式使用 用於擷取 FCM 註冊權杖或明確使用的執行個體 ID 若要指定應用程式執行個體或其他用途,您必須使用執行個體 ID 更新應用程式程式碼

目前,FIS 與舊版 ID Firebase 執行個體 ID 回溯相容。 刪除 IID 是���種要求刪除資料的替代方法 這些 Firebase SDK:

  • iOS 6.14.0 以下版本
  • 2020 年 2 月 27 日前的 Android SDK

也就是說,您「無須」將應用程式遷移至 Firebase 安裝項目。 但我們極力建議這麼做

為 Firebase 安裝項目升級至最低 SDK 版本

如要從執行個體 ID 遷移至 Firebase 安裝,請確認 應用程式至少使用現行版本編號的 以下 Firebase SDK:

Firebase SDK 最低 Android 版本 iOS 最低版本
Firebase 雲端通訊 20.3.0 版 6.34.0 版
遠端設定 19.2.0 版 6.24.0 版
Google Analytics for Firebase \ (評估 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 版

更新明確呼叫執行個體 ID API 的程式碼

如果 Android 或 Apple 應用程式直接使用執行個體 ID SDK 方法,您可以 請改用 Firebase 安裝項目中的相同替代選項來取代該用法 SDK 或 FCM SDK

擷取 ID

取得執行個體 ID 的方法會替換成取得安裝的方法 編號。例如:

之前

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

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

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                Log.d("IID_TOKEN", task.getResult().getToken());
            }
        });

Kotlin+KTX

FirebaseInstanceId.getInstance().instanceId
        .addOnSuccessListener { result ->
            Log.d("IID_TOKEN", result.token)
        }

之後

Swift

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

Objective-C

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

Java

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

Kotlin+KTX

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

刪除 ID

刪除執行個體 ID 的方法已替換成要刪除的方法 Firebase 安裝 ID。例如:

之前

Swift

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

Objective-C

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

Android

FirebaseInstanceId.deleteInstanceId();

之後

Swift

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

Objective-C

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

Java

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

Kotlin+KTX

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

擷取 FCM 註冊權杖

Firebase 安裝作業推出前 (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()
        })

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

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

之後

Java

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

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

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

Kotlin+KTX

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

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

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

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];