Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

【iOS】サーバーからのリモート通知を実施するために必要なアプリ側対応の概略

はじめに

Push通知はサービスユーザーに情報を送る上でとても有効な手段です。最近では、Firebase の Cloud Messagingの登場により、キャンペーンのプッシュや固定文言の定期PushはFirebase側で取り扱うことができるようになりましたが、ユーザー個別に動的な内容を送りたい(ユーザー個人に特化したレコメンドなど)場合などは、それだけでは十分ではないことが多く、APNsを介したリモートPush通知の仕組みはいまだに重要であり続けています。

本記事では自身の理解の整理もかねて、Push通知を送るために必要な設定を箇条書きレベルで記載していきます。

環境設定

以下の環境を使用しています。

  • Xcode10.2.1
  • Swift 5.0.1

証明書/Keys

Establishing a Certificate-Based Connection to APNs

Push通知を送ることを可能にするために専用の証明書を作成する必要があります。本番用と開発用があるため、それぞれ作成し、サーバー側に配置します。Firebase Cloud Messagingを使用する場合もこの証明書は必要であり、 Projectの設定画面からアップロードすることになります。

Establishing a Token-Based Connection to APNs

今から開発を始める場合はPush Notification Authentication keyを使用するという選択肢もあります。 JWT(JSON Web Token) をベースとして接続を形成します。証明書は1年に1回更新が必要ですが、Keysの場合は更新が必要なく、運用がより簡易的になります。

アプリ側でPush通知を行うための設定をする

アプリ側でリモートPush通知を行うため設定をします。対応内容は大まかに分けて以下です。

  • Apple Developer CenterのApp側でRemote Push Notificationの使用設定
  • プリプロジェクト側でRemote Push通知の使用設定

Apple Developer CenterのApp側でRemote Push Notificationの使用設定

developer center上でApp ID Configurationを変更します。

  1. Certificates, Identifiers & Profilesに移動
  2. 該当アプリのidentifier表示
  3. Capabilitiesの中のRemote Push Notificationにチェック

プリプロジェクト側でRemote Push通知の使用設定

Registering Your App with APNs

アプリのProject側でCapabilityを変更します。詳細な内容は上記リンクのEnable the Push Notifications Capabilityに記載があります。

  1. プロジェクトのアプリ Targetを選択
  2. Capabilitiesの中のPush Notificationsをチェック(Push起因でアプリを起動し、なんらかの処理を行いたい場合は、Background Modeの中のRemote Notificationsにもチェックを入れます)
  3. entitlementのPush Notificationsの設定を追加(ASP Environment)

3について、entitlementがまだない場合にはdevelopment環境の設定のentitlementが生成されます。 Remote Push Notificationsの設定には開発環境設定(development)、本番環境設定(production)があるため、 本番環境用のEntitlementと開発環境用のEntitlementを分けて生成することをお勧めします。

検証、本番用それぞれ作成後は、Build Settings > Code Signing EntitlementにてBuild ConfigurationsごとにEntitlementを分けます。

実装

Asking Permission to Use Notifications

アプリの実行時にPush通知の設定を行います。主な対応内容は以下です。

  1. Notificationsの利用許諾
  2. APNsにDeviceTokenの登録
  3. 自身のNotifications Provider ServerにDeviceTokenを登録

大まかな流れは以下の様になります。

  1. requestAuthorization(options:completionHandler:)を実施
  2. CompletionHandler内でerrorとgrantedで条件分岐を実施、 error == nil, granted == trueの場合に3を実施
  3. registerForRemoteNotifications()でDeviceTokenをAPNsに登録
  4. 3の成功、失敗がAppDelegateに通知される
    1. 成功 application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
    2. 失敗 application(_:didFailToRegisterForRemoteNotificationsWithError:)
  5. 4にて成功した場合に自身のサービスのPush通知発行サーバーに4で渡されたDeviceTokenを送信

AppleのドキュメントにNever cache device tokens in local storage.と記載がありますので、 Device Tokenをローカルに保存し、それを使用し続けるのは避けた方が良さそうです。

またrequestAuthorizationは初回実行時にのみダイアログが表示されます。 通知が許諾されているか否かはサービス上とても大きな意味を持ちますので、 ユーザー体験を考慮しながら初回のrequestAuthorizationが適切なタイミングで実行されるよう 体験設計を慎重に行う必要があります。

まとめ

以上でリモートPush通知を実行するためのアプリ側対応は完了です。まとめますと下記のようになります。

  • 証明書/Keys作成(サーバーへの登録は別途行う必要があります)
  • アプリの設定(Identifier・プロジェクト双方のCapabilities設定、Entitlement登録)
  • 実装(許諾確認、DeviceTokenのAPNs・サーバー双方への登録)

参考

体験設計について

動画

APNsおよび証明書、認証Keyについて

アプリ側設定について

サーバー側設定について