Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

Firebase インストールの管理

Firebase インストール サービス(FIS)は、Firebase アプリのインストール インスタンスごとに Firebase インストール ID(FID)を提供します。Firebase インストール ID は、デベロッパーが FIS API と直接やり取りする必要なく、アプリ内メッセージングや Remote Config などの Firebase サービスで内部的に使用されます。ただし、アプリ デベロッパーが次のことを行うために、FIS API を直接呼び出す場合もあります。

  • Firebase インストールとインストールに関連するデータを削除する。
  • アプリの特定のインストールを対象にするために識別子(Firebase インストール ID)を取得する。
  • Firebase インストールを認証するためにインストール認証トークンを取得する。

FIS API の直接呼び出しを開始するには、SDK をアプリに追加します。

アプリに Firebase インストール SDK を追加する

iOS

  1. Podfile に Firebase インストールの依存関係を追加します。
    pod 'Firebase/Installations'
  2. pod install を実行し、作成された .xcworkspace ファイルを開きます。
  3. Firebase モジュールを UIApplicationDelegate にインポートします。

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. FirebaseApp 共有インスタンスを構成します。通常はアプリの application:didFinishLaunchingWithOptions: メソッドで行います。

    Swift

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

    Objective-C

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

Android

Firebase インストール Android SDK の依存関係をモジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)に追加します。

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

JavaScript

ウェブ アプリケーションのホスト方法によっては、構成が自動的に処理されない場合があります。その場合は、Firebase 構成オブジェクトの更新を手動で行う必要があります。

たとえば、依存関係を index.html に追加する場合は、<head> 要素に依存関係を追加します。

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

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

サーバー 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 を使用して削除を処理します。

クライアント識別子の取得

アプリの特定のインストールを識別する必要がある場合は、Firebase インストール ID を取得して識別します。たとえば、Firebase アプリ内メッセージングの開発中にテストを行う場合、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);

インストール認証トークンを取得する

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

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 が削除またはローテーションされる可能性があるのは、次のような場合です。

  • アプリをアンインストールまたは再インストールした(エンドユーザーが新しいデバイスにインストールするときなど)。
  • エンドユーザーがアプリまたはデバイスのキャッシュをクリアした。
  • アプリが使用されていないことが原因で、バックエンドで 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.
});

インスタンス 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
Google アナリティクス \ (Measurement SDK) v17.4.4 v6.18.0
アプリ内メッセージング 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 または iOS のアプリでインスタンス 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;
  }
}];