Firebase インストール サービス(FIS)は、Firebase アプリのインストール インスタンスごとに Firebase インストール ID(FID)を提供します。Firebase インストール ID は、次の Firebase サービスで内部的に使用されます。
Firebase サービス | Firebase インストール機能 |
---|---|
Firebase Cloud Messaging |
Firebase Cloud Messaging は Firebase インストール ID を使用して、メッセージを配信するデバイスを特定します。 |
Firebase Crashlytics |
Firebase Crashlytics では、アプリ インスタンスの Firebase インストール ID の変更に基づいて、Crashlytics のインストール UUID をローテーションします。今後インストール ID は、クラッシュ レポートやクラッシュ管理サービスを強化する機能を有効にする際に使用される可能性があります。 |
Firebase In-App Messaging |
Firebase In-App Messaging は、Firebase インストール ID を使用して、メッセージを配信するデバイスを特定します。 |
Firebase Performance Monitoring |
Performance Monitoring は、Firebase インストール ID を使用して、ネットワーク リソースにアクセスする一意の Firebase インストールの数を計算します。その際にアクセス パターンの匿名性は十分に確保されます。Firebase Remote Config と連携し、Firebase インストール ID に基づいてパフォーマンス イベントの報告率を管理します。 |
Firebase Remote Config |
Remote Config は、Firebase インストール ID を使用してエンドユーザーのデバイスに返す構成値を選択します。 |
Firebase ML |
Firebase ML では、インストール認証トークンと呼ばれる認証情報を使用して、アプリ インスタンスを操作する際のデバイスの認証を行います(デベロッパー モデルをアプリ インスタンスに配布する場合など)。 |
Firebase User Segmentation Storage |
Firebase User Segmentation Storage は、Firebase インストール ID、および関連する属性とセグメントを保存し、それらを使用する他の Firebase サービスにターゲティング情報を提供します。 |
通常、Firebase サービスで Firebase インストール サービスを使用する際には、デベロッパーは FIS API を直接呼び出す必要はありません。ただし、アプリデベロッパーが次のことを行うために、FIS API を直接呼び出す場合もあります。
- Firebase インストールとインストールに関連するデータを削除する。
- アプリの特定のインストールを対象にするために識別子(Firebase インストール ID)を取得する。
- Firebase インストールを認証するためにインストール認証トークンを取得する。
FIS API の直接呼び出しを開始するには、SDK をアプリに追加します。
アプリに Firebase インストール SDK を追加する
iOS+
- Podfile に Firebase インストールの依存関係を追加します。
pod 'FirebaseInstallations'
pod install
を実行し、作成された.xcworkspace
ファイルを開きます。UIApplicationDelegate
にFirebaseCore
モジュールと、アプリのデリゲートが使用する他の Firebase モジュールをインポートします。たとえば、Cloud Firestore と Authentication を使用するには、次のようにします。SwiftUI
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Swift
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Objective-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- アプリ デリゲートの
application(_:didFinishLaunchingWithOptions:)
メソッドで、FirebaseApp
共有インスタンスを構成します。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];
- SwiftUI を使用している場合は、アプリケーション デリゲートを作成し、
UIApplicationDelegateAdaptor
またはNSApplicationDelegateAdaptor
を介してApp
構造体に接続する必要があります。また、アプリ デリゲートのメソッドの実装入れ替えを無効にする必要があります。詳細については、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:17.2.0'
JavaScript
ウェブ アプリケーションのホスト方法によっては、構成が自動的に処理されない場合があります。その場合は、Firebase 構成オブジェクトの更新を手動で行う必要があります。
たとえば、依存関係を index.html に追加する場合は、<head> 要素に依存関係を追加します。
<script src="/__/firebase/10.7.0/firebase-installations.js"></script>
Flutter
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 に関連付けられているデータは、Firebase インストール ID を使用してインストールを識別するすべての Firebase サービスのライブシステムとバックアップ システムから、180 日以内に削除されます。このプロセスの概要については、データの削除と保持に関する Google の方針説明をご覧ください。
アプリで FID 生成サービスをすべて無効にしない限り、FIS によって数日以内に新しい ID が作成されます。Firebase は、新しく作成された ID を新しい Firebase インストールであるとみなし、以前の ID やデータには関連付けません。
クライアント API 呼び出しで FID を削除する
Firebase サービスによって生成された FID を削除するには、Firebase インストール SDK から適切なメソッドを呼び出します。
Swift
Installations.installations().delete { error in if let error = error { print("Error deleting installation: \(error)") return } print("Installation deleted"); }
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 SDK で呼び出しが行われた際に、実際に 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 通知を受信する場合があります。
現在の Firebase インストール ID を削除し、関連のない新しい ID で Firebase サービスをすぐに使用する場合は、クライアント API を使用して削除を処理します。
クライアント ID を取得する
アプリの特定のインストールを識別する必要がある場合は、Firebase インストール ID を取得して識別します。たとえば、BiqQuery インポート用にアプリ インストールのセグメントを作成したり、Firebase In-App Messaging の開発中にテストを行ったりするには、対応する Firebase インストール ID を使用して正しいデバイスを識別し、対象に設定します。
Firebase インストール ID を取得するには:
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") } }
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 Token(JWT)形式の署名なしトークンで、インストールに関する以下の情報が含まれます。
- Firebase インストール ID
- 関連付けられているプロジェクト(
projectNumber
) - 関連付けられている Firebase アプリケーション ID(
appId
) - トークンの有効期限
インストール認証トークンは取り消すことができず、有効期限まで有効です。トークンのデフォルト存続期間は 1 週間です。
インストール認証トークンを取得するには:
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();
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 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 に送信されます。
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 を利用してアプリの個々のインストールを識別していました。Firebase インストールは、信頼性、パフォーマンス、セキュリティに関してインスタンス ID よりもはるかに優れています。インスタンス ID SDK を利用している Firebase アプリは、Firebase インストールに移行することをおすすめします。
移行プロセスはアプリによって異なります。
インスタンス ID API を直接呼び出していないアプリは、SDK のバージョンをアップデートすることで移行できます。ほとんどの Firebase アプリはこのカテゴリに含まれます。
インスタンス ID の API を明示的に呼び出しているアプリは、SDK のバージョンのアップデートに加えて、インスタンス ID のメソッドを Firebase インストールまたは FCM の同等のメソッドに置き換えるようコードを変更する必要があります。インスタンス ID を使用して FCM 登録トークンを取得している場合、またはアプリ インスタンスのターゲットや他の目的でインスタンス ID を明示的に使用している場合は、アプリケーション コードを更新する必要があります。
現在、FIS は以前の識別子である Firebase インスタンス ID と下位互換性があります。以下の Firebase SDK を使用している場合、データ削除をリクエストする別の方法として IID の削除があります。
- iOS 6.14.0 以下
- 2020 年 2 月 27 日より前の Android SDK
アプリを Firebase インストールに移行することは必須ではありませんが、移行を強くおすすめします。
Firebase インストールに対応した最小の SDK バージョンへのアップグレード
インスタンス ID から Firebase インストールに移行するには、以下に示す Firebase SDK の最小バージョン以上を使用する必要があります。
Firebase SDK | Android の最小バージョン | iOS の最小バージョン |
Firebase Cloud Messaging | v20.3.0 | v6.34.0 |
Remote Config | v19.2.0 | v6.24.0 |
Firebase 向け Google アナリティクス (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 |
インスタンス 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
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") } }
識別子の削除
インスタンス 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; } }];