iOS での Firebase Cloud Messaging クライアント アプリの設定

iOS クライアント アプリの場合、次の 2 通りの補完的な用途で Firebase Cloud Messaging を実装できます。

  • Firebase Cloud Messaging APNs インターフェースを介して最大 4 KB の基本的なプッシュ メッセージを受信する。

  • フォアグラウンドで動作しているアプリで、メッセージをアップストリームに送信するか、最大 4 KB のペイロードをダウンストリームで受信する。

Objective-C や Swift でクライアント コードを記述するには、FIRMessaging API を使用することをおすすめします。クイックスタート サンプルでは両方の言語のサンプルコードをご覧いただけます。

Firebase Cloud Messaging でのメソッドの実装入れ替え

FCM SDK では、FCM 登録トークンに対する APNs トークンのマッピングと、ダウンストリーム メッセージのコールバック処理中のアナリティクス データの取得という 2 つの主要領域で、メソッドの実装を入れ替えます。入れ替えを使用しない場合、アプリの Info.plist ファイルにフラグ FirebaseAppDelegateProxyEnabled を追加し、これを NO(ブール値)に設定することによって、入れ替えを無効にできます。このガイドの関連領域には、メソッドの実装入れ替えを有効にした場合としない場合の両方のコード例が記されています。

Firebase を iOS プロジェクトに追加する

このセクションで説明しているタスクは、他の Firebase 機能をアプリですでに有効にしている場合は完了している可能性があります。特に FCM の場合は、APNs 認証キーをアップロードしてリモート通知に登録する必要があります。

前提条件

事前に次の環境を準備しておく必要があります。

  • Xcode 9.2 以降
  • iOS 8 以降をターゲットにした Xcode プロジェクト
  • Swift プロジェクトには Swift 3.0 以降を使用
  • アプリのバンドル識別子
  • CocoaPods 1.4.0 以降
  • Cloud Messaging の場合:
    • 物理 iOS 端末
    • Apple Developer アカウントの Apple Push Notification Authentication Key
    • Xcode において [App] > [Capabilities] でプッシュ通知を有効にする

Xcode プロジェクトをまだ用意していない場合に Firebase 機能を試すだけであれば、クイックスタート サンプルをダウンロードしてご利用いただけます。クイックスタートを使用する場合は、バンドル識別子が次のステップで必要になるため、プロジェクト設定からバンドル識別子を忘れずに取得してください。

アプリに Firebase を追加する

Firebase をアプリに追加するには、Firebase プロジェクトと、アプリ用の Firebase 構成ファイルが必要です。

Firebase プロジェクトを作成するには:

  1. Firebase プロジェクトをまだ用意していない場合は、Firebase コンソールで Firebase プロジェクトを作成します。[プロジェクトを追加] をクリックします。モバイルアプリと関連付けられた既存の Google プロジェクトがある場合は、[プロジェクト名] プルダウン メニューから選択します。それ以外の場合は、プロジェクト名を入力して新しいプロジェクトを作成します。
  2. 省略可: プロジェクト ID を編集します。プロジェクトには一意の ID が自動的に付与され、データベース URL や Firebase Hosting サブドメインなどの一般公開される Firebase の機能で使用されます。特定のサブドメインを使用する場合は、この時点でプロジェクト ID を変更できます(後で変更できません)。
  3. 残りの設定手順に沿って操作した後、[プロジェクトを作成](または既存のプロジェクトを使用している場合は [Firebase を追加])をクリックして、プロジェクト用のリソースのプロビジョニングを開始します。通常、この処理には数分かかります。処理が完了すると、プロジェクトの概要が表示されます。

これでプロジェクトを用意できました。プロジェクトに iOS アプリを追加できます。

  1. [iOS アプリに Firebase を追加] をクリックして設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に実行されることがあります。その場合は、構成ファイルをダウンロードするだけでかまいません。
  2. 求められたら、アプリのバンドル ID を入力します。必ずアプリで使用しているバンドル ID を入力してください。バンドル ID を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
  3. 処理中に GoogleService-Info.plist ファイルをダウンロードします。このファイルは、いつでもダウンロードできます。
  4. 初期化コードを追加してアプリを実行すると、Firebase を正常にインストールしたという確認のメッセージが Firebase コンソールに送信されます。

SDK を追加する

新しいプロジェクトを設定する場合は、SDK をインストールする必要があります。この操作は、Firebase プロジェクトの作成の一環として完了済みの場合があります。

ライブラリをインストールするときは CocoaPods を使用することをおすすめします。インストール手順に沿って CocoaPods をインストールしてください。CocoaPods を使用しない場合は、CocoaPods を使用せずに SDK フレームワークを直接統合する方法もあります。

クイックスタート サンプルをダウンロードしていずれかのプログラムを実行する場合、Xcode プロジェクトと Podfile がすでに存在していても、ポッドをインストールして GoogleService-Info.plist ファイルをダウンロードする必要があります。Firebase ライブラリをプロジェクトに統合する場合は、使用するライブラリ用のポッドを追加する必要があります。

  1. Xcode プロジェクトをまだ用意していない場合は作成します。

  2. Podfile がない場合は作成します。

    $ cd your-project directory
    $ pod init
    
  3. インストールするポッドを追加します。次のようにして Podfile にポッドを含めます。

    pod 'Firebase/Core'
    pod 'Firebase/Messaging'
    

    これにより、iOS アプリで Firebase を稼働させるために必要なライブラリが、Firebase 向け Google アナリティクスとともに追加されます。現在使用可能なポッドとサブスペックのリストを以下に示します。機能固有の設定ガイドへのリンクもあります。

  4. ポッドをインストールし、.xcworkspace ファイルを開いて Xcode でプロジェクトを確認します。

    $ pod install
    $ open your-project.xcworkspace
    
  5. Firebase コンソールで GoogleService-Info.plist ファイルをダウンロードし、アプリに含めます。

APNs 認証キーをアップロードする

APNs 認証キーを Firebase にアップロードします。APNs 認証キーがない場合は、FCM での APNs の構成に関する説明をご覧ください。

  1. Firebase コンソールのプロジェクト内で歯車アイコンを選択し、[プロジェクトの設定]、[クラウド メッセージング] タブの順に選択します。

  2. [iOS アプリの設定] の下の [APNs 認証キー] で [アップロード] ボタンをクリックします。

  3. キーが保存されている場所に移動し、キーを選択して [開く] をクリックします。キーのキー ID(Apple Developer Member Center の [Certificates, Identifiers & Profiles] で確認できます)を追加し、[アップロード] をクリックします。

アプリで Firebase を初期化する

Firebase 初期化コードをアプリケーションに追加する必要があります。Firebase モジュールをインポートして、次に示すように共有インスタンスを構成します。

  1. UIApplicationDelegate で Firebase モジュールをインポートします。

    Swift

    import Firebase
    

    Objective-C

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

    Swift

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

    Objective-C

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

リモート通知に登録する

起動時またはアプリケーション フローの必要な時点で、リモート通知にアプリを登録します。次のように registerForRemoteNotifications を呼び出します。

Swift

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: {_, _ in })
} else {
  let settings: UIUserNotificationSettings =
  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Objective-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

登録トークンにアクセスする

デフォルトでは、FCM SDK はアプリの起動時にクライアント アプリのインスタンスの登録トークンを生成します。APNs 端末トークンの場合と同様に、このトークンを使用すると、ターゲットとする通知をアプリの特定のインスタンスに送信できます。

iOS が通常、アプリ起動時に APNs 端末トークンを配信するのと同じ方法で、FCM は FIRMessagingDelegatemessaging:didReceiveRegistrationToken: メソッドによって登録トークンを提供します。FCM SDK は、アプリの初期起動時ならびにトークンが更新または無効化されるたびに、新規または既存のトークンを取得します。いずれの場合も、FCM SDK は有効なトークンを使用して messaging:didReceiveRegistrationToken: を呼び出します。

登録トークンは次のような場合に変更されることがあります。

  • アプリが新しい端末で復元された場合
  • ユーザーがアプリをアンインストール / 再インストールする場合
  • ユーザーがアプリのデータを消去する場合

メッセージング デリゲートを設定する

登録トークンを受信するには、メッセージ デリゲート プロトコルを実装し、[FIRApp configure] の呼び出し後に FIRMessagingdelegate プロパティを設定します。たとえば、アプリケーション デリゲートがメッセージング デリゲート プロトコルに準拠している場合は、application:didFinishLaunchingWithOptions: のデリゲートをそれ自体に設定できます。

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

現在の登録トークンを取得する

登録トークンは、メソッド messaging:didReceiveRegistrationToken: を使用して配信されます。このメソッドは通常、FCM トークンを使用してアプリが起動するごとに 1 回ずつ呼び出されます。このメソッドが呼び出されるタイミングで、以下を実行できます。

  • 登録トークンが新規の場合、そのトークンをアプリケーション サーバーに送信します。
  • 登録トークンをトピックに登録します。これは新規登録の場合、またはユーザーがアプリを再インストールした場合にのみ必要です。

instanceIDWithHandler: を使用して直接トークンを取得できます。このコールバックによって返される InstanceIDResult にトークンが含まれています。なんらかの形で InstanceID の取得に失敗した場合、null 以外のエラーが返されます。

Swift

InstanceID.instanceID().instanceID { (result, error) in
  if let error = error {
    print("Error fetching remote instange ID: \(error)")
  } else if let result = result {
    print("Remote instance ID token: \(result.token)")
    self.instanceIDTokenMessage.text  = "Remote InstanceID token: \(result.token)"
  }
}

Objective-C

[[FIRInstanceID instanceID] instanceIDWithHandler:^(FIRInstanceIDResult * _Nullable result,
                                                    NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Error fetching remote instance ID: %@", error);
  } else {
    NSLog(@"Remote instance ID token: %@", result.token);
    NSString* message =
      [NSString stringWithFormat:@"Remote InstanceID token: %@", result.token];
    self.instanceIDTokenMessage.text = message;
  }
}];

通常、トークンはローカルで使用可能になっているため、このメソッドはネットワーク接続を開きません。このメソッドを使用することで、トークンを保管せずに、いつでもトークンにアクセスできます。

トークン更新のモニタリング

トークンが更新されるたびに通知を受けるには、メッセージング デリゲート プロトコルに準拠するデリゲートを指定します。次の例では、デリゲートを登録し、適切なデリゲート メソッドを追加します。

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
  print("Firebase registration token: \(fcmToken)")

  let dataDict:[String: String] = ["token": fcmToken]
  NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

別の方法として、デリゲート メソッドを提供する代わりに、kFIRMessagingRegistrationTokenRefreshNotification という名前の NSNotification をリッスンできます。トークン プロパティの値は常に現在のトークン値です。

実装入れ替えが無効な場合の APNs トークンと登録トークンとのマッピング

メソッドの実装入れ替えを無効にした場合は、明示的に APNs トークンを FCM 登録トークンにマッピングする必要があります。メソッド didRegisterForRemoteNotificationsWithDeviceToken をオーバーライドして APNs トークンを取得してから、FIRMessagingAPNSToken プロパティを設定します。

Swift

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
  Messaging.messaging().apnsToken = deviceToken
}

Objective-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

FCM 登録トークンが生成されると、実装入れ替えを有効にしたときと同じメソッドを使用してトークンにアクセスし、更新イベントをリッスンすることができます。

既存のユーザー APNs トークンのインポート

FCM クライアント アプリにオンボードする既存のユーザー層がある場合、インスタンス ID で提供される batchImport を使用します。この API によって、既存の iOS APNs トークンを FCM に一括インポートして、新しい有効な登録トークンにマッピングできます。

自動初期化を禁止する

FCM では FCM 内で登録トークンとして使用されるインスタンス ID も生成されます。インスタンス ID が生成されると、ライブラリによりその ID と構成データが Firebase にアップロードされます。インスタンス ID を使用する前に明示的にオプトインする場合は、構成時に FCM を無効にして生成を禁止できます。禁止するには、(GoogleService-Info.plist ではなく)Info.plist にメタデータ値を追加します。

FirebaseMessagingAutoInitEnabled = NO

FCM をもう一度有効にするには、ランタイム コールを実行します。

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

この値をいったん設定すると、アプリを再起動しても維持されます。

次のステップ

iOS クライアントの設定を行うと、メッセージ処理やその他の高度な動作をアプリに割り当てられるようになります。詳細については、以下のガイドを参照してください。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。