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

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

アプリに Firebase を追加する

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

  1. Firebase プロジェクトをまだ用意していない場合は、Firebase コンソールで Firebase プロジェクトを作成します。モバイルアプリと関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。それ以外の場合は、[プロジェクトを追加] をクリックします。
  2. [iOS アプリに Firebase を追加] をクリックして設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に実行されることがあります。その場合は、構成ファイルをダウンロードするだけでかまいません。
  3. 求められたら、アプリのバンドル ID を入力してください(必ずアプリで使用しているバンドル ID を入力してください)。バンドル ID を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
  4. GoogleService-Info.plist ファイルをダウンロードします。このファイルはいつでももう一度ダウンロードできます。
  5. このファイルを Xcode プロジェクトのルートにまだコピーしていない場合は、Xcode の [Add Files] ユーティリティ([File] メニューで [Add Files] をクリックして表示)を使用してコピーします。ファイルがアプリのビルド ターゲットに含まれていることを確認してください。

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 は各アプリの起動時に FIRMessaging デリゲートの messaging:didReceiveRegistrationToken コールバック経由で登録トークンを提供します。最初のアプリの開始時、および登録トークンが変更されるすべての状況において、FCM SDK はトークンを取得します。いずれの場合も、FCM SDK は FIRMessageDelegate プロトコル内の messaging:didReceiveRegistrationToken: を呼び出します。

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

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

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

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

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

現在の登録トークンを受け取る

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

  • 登録トークンが新規の場合、アプリケーション サーバーに送信します(トークンが新しいかどうかを判別するサーバー ロジックを実装することをおすすめします)。
  • 登録トークンをトピックに登録します。これは新規登録の場合、またはユーザーがアプリを再インストールした場合にのみ必要です。

Swift

let token = Messaging.messaging().fcmToken
print("FCM token: \(token ?? "")")

Objective-C

NSString *fcmToken = [FIRMessaging messaging].FCMToken;
NSLog(@"FCM registration token: %@", fcmToken);
このデリゲート メソッドが呼び出された後、トークン プロパティ(Objective-C では FCMToken、Swift では fcmToken)を介して登録トークンが利用可能になります。このデリゲート メソッドが呼び出される前は、このプロパティは nil である可能性があります。

トークンの生成のモニタリング

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

Swift

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

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

    // 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 トークンを取得し、さらに APNSToken プロパティを使用します。

APNs トークンは APNSToken プロパティを使用して指定します。

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

[FirebaseMessaging messaging].autoInitEnabled = YES;

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

次のステップ

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

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

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