iOS アプリにプッシュ通知を追加する

1. はじめに

最終更新日: 2020 年 1 月 6 日

Firebase Cloud Messaging(FCM)は、メッセージを料金なしで確実に送信するためのクロス プラットフォーム メッセージング ソリューションです。

FCM を使用すると、新しいメールやその他のデータが同期可能になったことをクライアント アプリに通知できます。通知メッセージを送信して、ユーザーの再エンゲージメントと維持を促進できます。インスタント メッセージなどのユースケースでは、メッセージで最大 4 KB のペイロードをクライアント アプリに転送できます。

仕組み

FCM の実装には、送信と受信のために次の 2 つの主要コンポーネントが含まれています。

  1. メッセージのビルド、ターゲットの設定、送信を行う Cloud Functions for Firebase やアプリサーバーなどの信頼できる環境。
  2. 対応するプラットフォーム固有のトランスポート サービスを介してメッセージを受信する iOS、Android、またはウェブ(JavaScript)のクライアント アプリ。

FCM アーキテクチャの概要

6636933bbe959ef2.png

FCM は、メッセージの作成、転送、受信を行う次のコンポーネント セットに依存しています。

  1. メッセージ リクエストを作成、構築するためのツール。Notifications Composer には、通知リクエストを作成するための GUI ベースのオプションが用意されています。すべてのメッセージ タイプを完全に自動化してサポートするには、Firebase Admin SDK または FCM サーバー プロトコルをサポートする信頼できるサーバー環境でメッセージ リクエストを構築する必要があります。この環境は、Cloud Functions for Firebase、Google App Engine、または独自のアプリサーバーです。
  2. FCM バックエンドは、他の関数の中でも特に、メッセージ リクエストを受け入れ、トピックを介してメッセージのファンアウトを実行し、メッセージ ID などのメッセージ メタデータを生成します。
  3. プラットフォーム レベルのトランスポート層は、メッセージを対象デバイスにルーティングし、メッセージ配信を処理し、必要に応じてプラットフォーム固有の設定を適用します。このトランスポート層には次のものが含まれます。
  • Google Play 開発者サービスを搭載した Android デバイス向け Android Transport Layer(ATL)
  • iOS デバイス向け Apple プッシュ通知サービス(APNs)
  • ウェブアプリ用のウェブ push プロトコル
  1. ユーザーのデバイス上の FCM SDK。この SDK では、アプリのフォアグラウンド/バックグラウンド状態と関連するアプリケーション ロジックに従って、通知が表示されるかメッセージが処理されます。

作成するアプリの概要

この Codelab では、FCM を使用してプッシュ通知を iOS サンプルアプリに追加します。

学習内容

  • プッシュ メッセージのユーザーを登録および登録解除する方法
  • 受信した push メッセージを処理する方法
  • 通知の表示方法
  • 通知のクリックに対応する方法

必要なもの

  • Xcode 11.0 以降
  • CocoaPods 1.9.0 以降
  • Apple デベロッパー アカウント
  • アプリを実行するための物理 iOS デバイス
  • Swift の基本的な知識

2. 設定方法

サンプルコードをダウンロードする

この Codelab では独自のテストアプリを作成しますが、既存のサンプルアプリを表示して実行したい場合は、クイックスタート サンプルコードをダウンロードできます。

サンプルを取得するには、次の 2 つの方法があります。

  • git リポジトリのクローンを作成します。
$ git clone https://github.com/firebase/quickstart-ios.git
  • ZIP ファイルをダウンロードします。

ソースを ZIP ファイルとしてダウンロードした場合、解凍するとルートフォルダ quickstart-ios が作成されます。

新しいアプリを作成する

次の手順で独自のテストアプリを作成します(以下の手順は XCode 12.3 にあります)。

  1. Xcode を開き、[Create a new Xcode project] を選択します。
  2. [App] を選択し、[Next] をクリックします。

e56c631b086c6d8.png

  1. プロダクト名を入力します(例:MessagingExample)
  2. [Team] を選択します(チームを作成していない場合は、Apple Developer Account で設定します)。
  3. 組織 ID を入力します(例:com.your-name)
  4. バンドル ID を入力します(例:com.your-name.MessagingExample の場合は、すべての iOS アプリで一意である必要があります)。
  5. [インターフェース] プルダウンで [Storyboard] を選択します。
  6. [Life Cycle] プルダウンで [UIKit App Delegate] を選択します。
  7. [Language] で [Swift] を選択します。
  8. [次へ] をクリックします。

fb860c0fa4a02818.png

バンドル ID は、APN キーを作成してアプリを Firebase プロジェクトに登録する際に必要になります。

3. APN の設定

認証キーを作成する

このセクションでは、プッシュ通知が有効になっているアプリ ID の認証キーを生成する方法について説明します。既存の鍵がある場合は、新しい鍵を生成する代わりに、その鍵を使用できます。

認証キーを作成するには:

  1. デベロッパー アカウントで、[Certificates, Identifiers &[Profiles] をクリックし、[Keys] に移動します。

19ae87d0f00402b1.png

  1. 右上にある追加ボタン(+)をクリックします。

c4acd10dbc4f721f.png

  1. APNs 認証キーの説明を入力してください
  2. [Key Services] で [APNs] チェックボックスをオンにして、[Continue] をクリックします。

6a3e8ff7457a8251.png

  1. [Register] をクリックし、[Download] をクリックします。鍵は安全な場所に保管してください。これは 1 回限りのダウンロードであり、後でキーを取得することはできません。

42c205e072fbd622.png

アプリ ID を作成する

アプリ ID は、アプリを一意に識別する識別子です。慣例として、逆ドメインで表されます。

  1. Apple Developer Member Center にアクセスしてログインします。
  2. [Certificates, Identifiers and Profiles] に移動します。
  3. [ID] に移動します。
  4. [+] ボタンをクリックして新しいアプリ ID を作成します。e04fc394c52a866f.png
  5. [App IDs] ラジオボタンを選択し、[Continue] をクリックします。

d454fd5df3b8d93d.png

  1. [App] を選択し、[Continue] をクリックします。

3bd2e836be5e0291.png

  1. 新しいアプリ ID を作成するには:
  2. アプリ ID の名前を入力します。
  3. [チーム ID] を入力します。この値は、[Membership] タブの [Team ID] と一致している必要があります。
  4. [App ID Suffix] で [Expression App ID] を選択し、[Bundle ID] にバンドル ID を入力します。7363c4d1962b486d.png
  5. [App Services] セクションで、[Push Notifications] がオンになっていることを確認します。552ea08703f7e323.png
  6. [続行] をクリックし、入力内容が正しいことを確認します。
  7. [Identifier] の値は、チーム ID とバンドル ID の値を連結したものと一致する必要があります。
  8. [Push Notifications] は [Configurable] にする必要があります。
  9. [Register] をクリックしてアプリ ID を作成します。

プロファイルを作成する

開発中にアプリをテストするには、開発用プロファイルが必要です。これにより、App Store でまだ公開されていないアプリをデバイスで実行できるようになります。

  1. Apple Developer Member Center にアクセスしてログインします。
  2. [Certificates, Identifiers and Profiles] に移動します。
  3. 左上のプルダウン メニューで、[iOS, tvOS, watchOS] が選択されていない場合は選択します。次に [プロファイル] に移動します。
  4. [+] ボタンをクリックして新しいプロファイルを作成します。1fa2342cfe45a925.png
  5. プロビジョニング プロファイルのタイプとして [iOS App Development] を選択し、[Continue] をクリックします。

507434a466220dfe.png

  1. プルダウン メニューで、使用するアプリ ID を選択し、[続行] をクリックします。
  2. 前の手順で選択したアプリ ID の iOS 開発用証明書を選択し、[Continue] をクリックします。
  3. プロビジョニング プロファイルに含める iOS デバイスを選択し、[Continue] をクリックします。テストに使用するデバイスをすべて選択するようにしてください。
  4. このプロビジョニング プロファイルの名前(MessagingExampleProfile など)を入力し、[Generate] をクリックします。

4395f04647afa997.png

  1. [Download] をクリックして、プロビジョニング プロファイルを Mac に保存します。

106761fa786ba580.png

  1. プロビジョニング プロファイル ファイルをダブルクリックしてインストールします。

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

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

Firebase を iOS アプリに追加する前に、iOS アプリに接続するための Firebase プロジェクトを作成する必要があります。Firebase プロジェクトの詳細については、Firebase プロジェクトについて理解するをご覧ください。

  1. Firebase コンソールで [プロジェクトを追加] をクリックし、[プロジェクト名] を選択または入力します。e462afd91c149238.png

既存の Google Cloud Platform(GCP)プロジェクトがある場合は、プルダウン メニューからプロジェクトを選択して Firebase リソースをそのプロジェクトに追加できます。

  1. (省略可)新しいプロジェクトを作成する場合は、プロジェクト ID を編集できます。

Firebase プロジェクトには、一意の ID が自動的に割り当てられます。Firebase がプロジェクト ID を使用する仕組みについては、「Firebase プロジェクトについて理解する」をご覧ください。

  1. [続行] をクリックします。
  2. プロジェクトに Google アナリティクスを設定すると、次のいずれかの Firebase プロダクトを使用して最適なエクスペリエンスを実現できます。
  • Firebase Crashlytics
  • Firebase Predictions
  • Firebase Cloud Messaging
  • Firebase In-App Messaging
  • Firebase Remote Config
  • Firebase A/B Testing

プロンプトが表示されたら、既存の Google アナリティクス アカウントを使用するか、新しいアカウントを作成するかを選択します。新しいアカウントを作成する場合は、アナリティクスのレポートのロケーションを選択し、プロジェクトのデータ共有設定と Google アナリティクスの規約に同意します。

1282a798556779ab.png

48ade68c8de27d2.png

  1. [プロジェクトを作成](既存の GCP プロジェクトを使用する場合は [Firebase を追加])をクリックします。

Firebase プロジェクトのリソースが自動的にプロビジョニングされます。処理が完了すると、Firebase コンソールに Firebase プロジェクトの概要ページが表示されます。

アプリを Firebase に登録する

Firebase プロジェクトを作成したら、プロジェクトに iOS アプリを追加できます。

Firebase プロジェクトにアプリを追加する際のベスト プラクティスや考慮事項(複数のビルド バリアントの扱い方など)について詳しくは、Firebase プロジェクトについて理解するをご覧ください。

  1. Firebase コンソールに移動します。
  2. プロジェクトの概要ページの中央にある iOS アイコンをクリックして、設定ワークフローを起動します。

すでに Firebase プロジェクトにアプリを追加している場合は、[アプリを追加] をクリックするとプラットフォームのオプションが表示されます。

93462beb642e8987.png

  1. アプリのバンドル ID を [iOS バンドル ID] に入力します。
  2. (省略可)その他のアプリ情報(アプリのニックネームApp Store ID)を入力します。
  3. [アプリの登録] をクリックします。

2e7a00b0008344c1.png

Firebase 構成ファイルを追加する

  1. [GoogleService-Info.plist をダウンロード] をクリックして、Firebase iOS 構成ファイル(GoogleService-Info.plist)を取得します。69004caf7d448989.png
  2. 構成ファイルを Xcode プロジェクトのルートに移動します。プロンプトが表示されたら、すべてのターゲットに構成ファイルを追加するよう選択します。

7c5e0a46d07fa9c7.png

プロジェクトに複数のバンドル ID がある場合は、Firebase コンソールで各バンドル ID を登録済みアプリに関連付けて、各アプリが独自の GoogleService-Info.plist ファイルを持つことができるようにする必要があります。

Xcode を閉じます。

アプリに Firebase SDK を追加する

Firebase ライブラリのインストールには、CocoaPods を使用することをおすすめします。ただし、CocoaPods を使用したくない場合は、SDK フレームワークを直接統合するか、Swift Package Manager ベータ版を使用できます。

  1. Podfile がない場合は作成します。クイックスタート サンプルを使用している場合、Xcode プロジェクトと Podfile(Pod を含む)はすでに存在します。
$ cd MessagingExample
$ pod init
  1. Podfile に、アプリで使用する Firebase Pod を追加します。

サポートされている Firebase プロダクトを iOS アプリに追加できます。

クイックスタート サンプルでは、Google アナリティクスと Firebase Cloud Messaging SDK が追加されています。

# Add the Firebase pod for Google Analytics
pod 'Firebase/Analytics'

# Add the pod for Firebase Cloud Messaging
pod 'Firebase/Messaging'
  1. Pod をインストールし、.xcworkspace ファイルを開いて Xcode でプロジェクトを確認します。
$ pod install
  1. MessagingExample.xcworkspace を開き、Firebase コンソールで [次へ] をクリックします。6d1f8230d16693e6.png

アプリで Firebase を初期化する

アプリケーションに Firebase 初期化コードを追加する必要があります。

Firebase モジュールをインポートして、共有インスタンスを構成します(クイックスタート サンプルでは、Firebase モジュールがすでにインポートされています)。

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

AppDelegate.swift

import UIKit
import Firebase // Add this line
  1. FirebaseApp 共有インスタンスを構成します。通常はアプリの application:didFinishLaunchingWithOptions: メソッドで構成します。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
  1. Firebase コンソールで [次へ] をクリックします。f9d37423d346ff0.png
  2. Firebase SDK がアプリに追加されます。[コンソールに進む] をクリックします。d1b1309cd3790f66.png

5. FCM クライアントの構成

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

APNs 認証キーを Firebase にアップロードします。

  1. Firebase コンソールのプロジェクト内で歯車アイコンを選択し、[プロジェクトの設定]、[Cloud Messaging] タブの順に選択します。ba8b5f95241327fe.png
  2. [iOS アプリの構成] の [APNs 認証キー] で [アップロード] ボタンをクリックします。357ddc0d4b182492.png
  3. キーを保存した場所に移動し、キーを選択して [開く] をクリックします。キーのキー ID(Apple Developer Member Center の [Certificates, Identifiers &Profiles] で確認できます)を追加し、[Upload] をクリックします。3dae27f2327daf9e.png

リモート通知に登録する

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

クイックスタート サンプルでは、registerForRemoteNotifications がすでに追加されています。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  // [START register for remote notifications]
  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()
  // [END register for remote notifications]
  return true
}

AppDelegate.swift の末尾に次の行を追加して、UNUserNotificationCenter の delegate プロパティを割り当てます。

AppDelegate.swift

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

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

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

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  Messaging.messaging().delegate = self // Add this line
  // [START register for remote notifications]
  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()
  // [END register for remote notifications]
  return true
}

AppDelegate.swift の末尾に次の行を追加して、FIRMessaging の delegate プロパティを割り当てます。

AppDelegate.swift

extension AppDelegate : MessagingDelegate {
  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
    print("Firebase registration token: \(String(describing: fcmToken))")
    
    let dataDict:[String: String] = ["token": fcmToken ?? ""]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
  }
}

機能の追加

プッシュ通知機能は「アプリ ID の作成」セクションで追加しましたが、次の手順で XCode にもこの機能を追加する必要があります(以下の手順は XCode 12.3 にあります)。

  1. ナビゲータ エリアでプロジェクト名をクリックします。
  2. [署名と機能
  3. [+ Capability] をクリックします。

eaf41aefb3bf2c9e.png

  1. [Background Modes] をダブルクリックします。
  2. もう一度 [+ Capability] をクリックします。
  3. [Push Notifications] をダブルクリックします。
  4. [バックグラウンド モード] セクションの [リモート通知] をオンにします。

e5d0fc08651e04a9.png

6. 通知メッセージを送信する

テスト メッセージを送信する手順は次のとおりです。

  1. 対象デバイスでアプリをインストールして実行します。リモート通知を受信する権限のリクエストを承認する必要があります。
  2. Xcode ログに登録トークンを取得します。

a2e49a92f9807d34.png

  1. アプリがデバイスのバックグラウンドで動作していることを確認します。
  2. Notifications Composer を開き、[新しい通知] を選択します。
  3. メッセージのテキストを入力します。f485d7fbd2456ae0.png
  4. [テスト メッセージを送信] を選択します。
  5. [FCM 登録トークンを追加] というラベルの付いたフィールドに、手順 2 で取得した登録トークンを入力します。
  6. [テスト] をクリックします。

[テスト] をクリックすると、アプリをバックグラウンドで実行しているターゲット クライアント デバイスの通知センターに通知が届きます。

アプリへのメッセージ配信については、FCM レポート ダッシュボードをご覧ください。このダッシュボードには、iOS デバイスと Android デバイスで送信および開封されたメッセージの数が記録されています。

6570eea7b5228513.png

7. 完了

これで、テスト メッセージが正常に送信されました。

FCM には、トピック サブスクリプションなど、他にも多くの関数や構成があります。

関心をお持ちの場合は、公式のデベロッパー ドキュメントをご確認ください。

次のステップ

これらの Codelab をご確認ください。

参考資料