Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

管理 Firebase 安裝

Firebase 安裝服務 (FIS) 為每個已安裝的 Firebase 應用實例提供一個 Firebase 安裝 ID (FID)。 Firebase 安裝 ID 由 Firebase 服務(例如應用內消息傳遞或遠程配置)在內部使用,而無需開發人員直接與 FIS API 交互。但是,在某些情況下,應用程序開發人員可能希望直接調用 FIS API,例如:

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

要開始直接調用 FIS API,請將 SDK 添加到您的應用程序。

將 Firebase 安裝 SDK 添加到您的應用

iOS

  1. 添加依賴於火力地堡安裝到您的Podfile:
    pod 'Firebase/Installations'
  2. 運行pod install並打開創建.xcworkspace文件。
  3. 導入火力地堡模塊在UIApplicationDelegate

    迅速

    import Firebase

    目標-C

    @import Firebase;
  4. 配置一個FirebaseApp共享實例,通常在你的應用程序的application:didFinishLaunchingWithOptions:方法:

    迅速

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

    目標-C

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

安卓

添加依賴的火力地堡安裝Android SDK中你的模塊(應用程序級)搖籃文件(通常是app/build.gradle ):

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

JavaScript

根據您的Web應用程序是如何託管,您的配置可以自動處理,或者您可能需要更新您的火力地堡的配置對象

例如,如果您的依賴項添加在 index.html 中,則在 <head> 元素中添加依賴項:

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

刪除 Firebase 安裝

數據綁定到火力地堡安裝一般個人識別。儘管如此,為用戶提供管理和刪除這些數據的選項還是很有幫助的。

每個應用程序的每次安裝的 Firebase 安裝 ID 都不同;同一設備上的不同應用程序具有不同的 Firebase 安裝 ID。 Firebase 安裝 ID 標識應用安裝以及與這些應用安裝相關的數據。

當您刪除安裝 ID 時,與該安裝 ID 相關的數據將從所有使用 Firebase 安裝 ID 來識別安裝的 Firebase 服務的實時和備份系統中移除 180 天內。這個過程在谷歌的高級別描述上刪除和保留聲明

除非您禁用應用程序中的所有 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");
}];

爪哇

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

科特林+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();

使用服務器 API 調用刪除 FID

要刪除與服務器API調用的FID,添加火力地堡管理SDK到您的服務器,如果您還沒有。

添加 SDK 後,通過調用您選擇的語言的刪除函數來刪除 FID(注意:除了 Node.js,這些方法反映了實例 ID 命名。但是,當使用任何當前 Firebase 調用時,它們實際上都刪除了 FID SDK)。

節點.js

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

admin.installations().deleteInstallation(idToDelete);

爪哇

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

爪哇

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

科特林+KTX

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

JavaScript

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

檢索安裝身份驗證令牌

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

安裝身份驗證令牌是 JSON Web 令牌 (JWT) 格式的短期不記名令牌,其中包含以下安裝信息:

  • Firebase 安裝 ID
  • 相關項目( projectNumber
  • 相關聯的火力地堡應用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]);
}];

爪哇

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

科特林+KTX

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

JavaScript

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

監控 Firebase 安裝 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];
}];

一個NSNotification命名NSNotificationName.InstallationIDDidChange發布到每當一個新的FID被分配默認NSNotificationCenter。

安卓

Kotlin 和 Java 客戶端應添加重試邏輯以響應失敗的調用以檢索新 FID。

JavaScript

Web應用程序可以訂閱onIdChange鉤。

每當創建新的 FID 時,都會觸發訂閱的回調:

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

從實例 ID 遷移到 Firebase 安裝

在引入 Firebase 安裝之前,Firebase 依賴 Instance ID SDK 來獲取應用安裝的標識符。 Firebase 安裝在可靠性、性能和安全性方面比實例 ID 具有顯著優勢。依賴於 Instance ID SDK 的 Firebase 應用應遷移到 Firebase 安裝。

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

  • 不直接調用實例ID的API應用程序可以通過遷移更新他們的SDK版本。大多數 Firebase 應用都屬於這一類別。

  • 應用程序明確地進行API調用,以實例ID必須更新SDK版本修改代碼以他們的火力地堡安裝或FCM等價物來代替實例ID的方法。如果您的應用程序使用實例 ID 來檢索 FCM 註冊令牌或明確使用實例 ID 來定位應用程序實例或用於任何其他目的,您將需要更新您的應用程序代碼。

目前,FIS 向後兼容舊標識符 Firebase 實例 ID。刪除IID是請求與這些火力地堡的SDK數據刪除的另一種方法:

  • iOS 6.14.0 及更低版本
  • 早於 2020 年 2 月 27 日的 Android SDK

這意味著,應用程序並不需要遷移到火力地堡裝置;但是,強烈建議您這樣做。

升級到 Firebase 安裝的最低 SDK 版本

要從實例 ID 遷移到 Firebase 安裝,請確保您的應用程序至少使用以下 Firebase SDK 的所列最低版本號:

Firebase SDK最低安卓版本最低 iOS 版本
Firebase 雲消息傳遞v20.3.0 v6.34.0
遠程配置v19.2.0 v6.24.0
谷歌分析\(測量SDK) v17.4.4 v6.18.0
應用內消息v19.0.7 v6.24.0
性能監控v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
機器學習套件v22.1.2 v6.28.0

更新顯式調用實例 ID API 的代碼

如果您的 Android 或 iOS 應用直接使用實例 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;
   }
 }];

爪哇

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

科特林+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);
}];

爪哇

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

科特林+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;

爪哇

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

科特林+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 提供了檢索註冊令牌的方法。

爪哇

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

科特林+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;
   }
 }];

爪哇

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

科特林+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;
  }
}];