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

iOS クライアント アプリの場合、次の 2 通りの方法を補完的に行うことで Firebase Cloud Messaging を実装できます。

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

  • メッセージをアップストリームに送信するか、最大 4 KB のペイロードをダウンストリームで受信する。

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

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

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

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

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

事前準備

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

  • Xcode 7.0 以降
  • iOS 7 以降をターゲットにした Xcode プロジェクト
  • アプリのバンドル識別子
  • CocoaPods 1.0.0 以降
  • クラウド メッセージングの場合
    • 物理 iOS 端末
    • プッシュ通知を有効にした APNs 証明書
    • Xcode で [App] > [Capabilities] を選択してプッシュ通知を有効にする

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

アプリに Firebase を追加する

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

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

SDK を追加する

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

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

クイックスタート サンプルをダウンロードして実行することにした場合は、Xcode プロジェクトと Podfile が既に存在します。Firebase ライブラリをプロジェクトに統合する場合は、使用するライブラリ用のポッドをインストールする必要があります。

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

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

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

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

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

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

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

APNs 証明書をアップロード

APNs 証明書を Firebase にアップロードします。 まだ APNs 証明書を用意していない場合は、APNs の SSL 証明書のプロビジョニング手順を確認してください。

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

  2. 開発用証明書、本番用証明書、またはその両方の [証明書をアップロード] ボタンを選択します。少なくとも 1 つ選択する必要があります。

  3. 証明書ごとに .p12 ファイルを選択し、必要に応じてパスワードを入力します。この証明書のバンドル ID はアプリのバンドル ID と一致させてください。[保存] を選択します。

アプリで Firebase を初期化する

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

  1. Firebase モジュールを UIApplicationDelegate サブクラスにインポートします。

    Objective-C

    @import Firebase;
    

    Swift

    import Firebase
    
  2. FIRApp 共有インスタンスを設定します。通常はアプリケーションの application:didFinishLaunchingWithOptions: メソッドを使用します。

    Objective-C

     verbatim f4837415eb98478ae53b9bc9796b0226 // Use Firebase library to configure APIs
    [FIRApp configure]; endverbatim f4837415eb98478ae53b9bc9796b0226 
    

    Swift

     verbatim 2ac23ab3ab1009da8a019fb5469208e7 // Use Firebase library to configure APIs
    FIRApp.configure() endverbatim 2ac23ab3ab1009da8a019fb5469208e7 
    

リモート通知に登録する

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

Objective-C

 verbatim aa5edcafd309b6a13d515cfcfe63368e if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
  // iOS 10 or later
  #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
  UNAuthorizationOptions authOptions =
      UNAuthorizationOptionAlert
      | UNAuthorizationOptionSound
      | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) {
      }];

  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  // For iOS 10 data message (sent via FCM)
  [FIRMessaging messaging].remoteMessageDelegate = self;
  #endif
}

[[UIApplication sharedApplication] registerForRemoteNotifications]; endverbatim aa5edcafd309b6a13d515cfcfe63368e 

Swift

 verbatim 3522a9bf8d31feb57becbf87e271a1fb if #available(iOS 10.0, *) {
  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: {_, _ in })

  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self
  // For iOS 10 data message (sent via FCM)
  FIRMessaging.messaging().remoteMessageDelegate = self

} else {
  let settings: UIUserNotificationSettings =
  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()
 endverbatim 3522a9bf8d31feb57becbf87e271a1fb 

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

デフォルトでは、FCM SDK はアプリが初めて起動されたときにクライアント アプリのインスタンスの登録トークンを生成します。 単一の端末を対象とするか、FCM の端末グループを作成する場合は、このトークンにアクセスする必要があります。

このセクションでは、トークンを取得する方法、およびトークンに対する変更をモニタリングする方法について説明します。トークンは最初の起動後にローテーションされている可能性があるため、現在のトークンを直接取得する特定のニーズがある場合を除き、更新された最新の登録トークンを取得することを強くおすすめします。

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

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

現在の登録トークンの取得

現在のトークンを取得する必要がある場合は、[[FIRInstanceID instanceID] token] を呼び出します。 トークンがまだ生成されていない場合、このメソッドは null を返します。

Objective-C

NSString *refreshedToken = [[FIRInstanceID instanceID] token];

Swift

let token = FIRInstanceID.instanceID().token()!

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

kFIRInstanceIDTokenRefreshNotification をリッスンするオブザーバーを追加することでトークンの更新値にアクセスし、その後オブザーバーのセレクタからトークンを取得することができます。この例では、tokenRefreshNotification がコールバックの処理に使われるセレクタになります。

Objective-C

 verbatim f60d8cec95463724503ca1ac0eaab71b - (void)tokenRefreshNotification:(NSNotification *)notification {
  // Note that this callback will be fired everytime a new token is generated, including the first
  // time. So if you need to retrieve the token as soon as it is available this is where that
  // should be done.
  NSString *refreshedToken = [[FIRInstanceID instanceID] token];
  NSLog(@"InstanceID token: %@", refreshedToken);

  // Connect to FCM since connection may have failed when attempted before having a token.
  [self connectToFcm];

  // TODO: If necessary send token to application server.
} endverbatim f60d8cec95463724503ca1ac0eaab71b 

Swift

 verbatim 45027ce7014579b133c25ccf45397e2f func tokenRefreshNotification(_ notification: Notification) {
  if let refreshedToken = FIRInstanceID.instanceID().token() {
    print("InstanceID token: \(refreshedToken)")
  }

  // Connect to FCM since connection may have failed when attempted before having a token.
  connectToFcm()
} endverbatim 45027ce7014579b133c25ccf45397e2f 

トークンが生成されると kFIRInstanceIDTokenRefreshNotification が呼び出されるため、そのコンテキストで [[FIRInstanceID instanceID] token] を呼び出すことにより、利用可能な現在の登録トークンに確実にアクセスできます。

API の詳細については、インスタンス ID API リファレンスをご覧ください。

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

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

APNs トークンとトークンタイプを setAPNSToken:type: に指定します。 type の値が正しく設定されていることを確認します。 サンドボックス環境用は FIRInstanceIDAPNSTokenTypeSandbox、本番環境用は FIRInstanceIDAPNSTokenTypeProd です。 正しいタイプを設定していない場合、メッセージはアプリに配信されません。

Objective-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
             [[FIRInstanceID instanceID] setAPNSToken:deviceToken
                                                type:FIRInstanceIDAPNSTokenTypeSandbox];
}

Swift

func application(application: UIApplication,
                   didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
  FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenTypeSandbox)
}

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

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

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

次のステップ

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

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