はじめに
こんにちは、iOSアプリ開発を担当している深山です。
私が担当しているアプリでは、Firebase Analyticsで取得しているログの見直しに伴い、新規のFirebaseプロジェクトに移行する取り組みを行いました。 しかし、動作確認時に、PUSH通知に利用していたFirebase Cloud Messaging(以下、FCM)の登録トークンが取得できなくなっていることがわかりました。 今回はその問題をどのように解決したかを紹介します。
FCMとは
Firebase Cloud Messagingは、Googleが提供するメッセージ配信基盤で、Android、iOS、WebアプリケーションなどにPUSH通知を送信するためのサービスです。FCMを利用することで、開発者はユーザーにタイムリーな情報を提供し、リテンション率やエンゲージメントを向上させることができます。
FCM登録トークンについて
FCM登録トークンの概要
FCMを用いたPUSH通知を利用するには、登録トークンが必要になります。
登録トークンは、アプリケーションのインスタンスを一意に識別するための文字列です。これにより、FCMは特定のデバイスやアプリケーションにメッセージを送信することができます。以下に、登録トークンの主な特徴と役割について説明します。
- 一意性
- 登録トークンはデバイスごとに一意であり、アプリケーションのインスタンスごとに異なるため、特定のユーザーに対して個別にメッセージを送信できます。
- 有効期限
- 登録トークンには有効期限があります。期限が切れると、アプリは新しいトークンを取得する必要があります。これにより、セキュリティが強化され、無効なトークンへのメッセージ送信を防ぎます。
- 生成と更新
- トークンは初回アプリ起動時に生成され、その後必要に応じて更新されます。更新のタイミングには、トークンの有効期限切れやユーザーのアプリ再インストールなどがあります。
- 利用方法
- アプリは取得したトークンを、PUSH通知送信用の任意のサーバーに送信し、サーバーがこのトークンを使用して特定のデバイスに対してメッセージを送信します。
登録トークンの取得方法
ここではiOSアプリでの登録トークンの取得方法を説明します。
- Firebaseのセットアップ Firebaseコンソール上から取得したGoogleService-Info.plistをプロジェクトに追加し、任意の方法でFirebaseSDKをインストールします。具体的なセットアップ方法は割愛します。
AppDelegeteの設定 AppDelegate.swiftに必要な設定を行います。
import UIKit import Firebase import UserNotifications @main class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // Firebase初期化 FirebaseApp.configure() // プッシュ通知の許可をリクエスト UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: {_, _ in } ) application.registerForRemoteNotifications() // 登録トークン取得のためのデリゲートを設定 Messaging.messaging().delegate = self return true } } // MARK: - UNUserNotificationCenterDelegate extension AppDelegate : UNUserNotificationCenterDelegate { // フォアグラウンドで通知を受信したときに呼ばれる func userNotificationCenter( _ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void ) { completionHandler([.alert, .badge, .sound]) } } // MARK: - MessagingDelegate extension AppDelegate : MessagingDelegate { // 新しい登録トークンを取得したときに呼ばれる func messaging( _ messaging: Messaging, didReceiveRegistrationToken fcmToken: String? ) { guard let fcmToken else { return } // トークンをサーバーに送信する処理をここに追加 } }- トークンの更新通知を受け取り
トークンが更新されると、
messaging(_:didReceiveRegistrationToken:)メソッドが呼ばれます。このメソッド内で新しいトークンを取得し、必要に応じてサーバーに送信します。
これで、iOSアプリでFCM登録トークンを取得し、更新をハンドリングする処理が実装できます。
深山侑花