チュートリアル: iOS アプリでのプッシュ通知を作成する
このチュートリアルでは、Azure Communication Services Chat SDK を使用して iOS アプリでのプッシュ通知を作成する方法について説明します。
プッシュ通知は、モバイル アプリがフォアグラウンドで動作していないときに、チャット スレッドでメッセージの着信をユーザーにアラートすることができます。 Azure Communication Services では、2 つのバージョンのプッシュ通知がサポートされています。
基本バージョン: アプリのアイコンにバッジ番号が表示され、デバイスが通知音を再生し、ポップアップ アラート バナーが表示されます。
詳細バージョン: 基本バージョンでサポートされている機能に加えて、アラート バナーのタイトルとメッセージ プレビューをカスタマイズできます。
このチュートリアルでは、次の作業を行いました。
- Apple Push Notification Service (APNs) 証明書が必要です。
- プッシュ通知用に Xcode を構成します。
- プッシュ通知の基本または詳細バージョンを実装します。
- アプリで通知をテストします。
- プッシュ通知の自動登録更新を設定します。
コードをダウンロードする
GitHub 上のこのチュートリアルに対するサンプル コードにアクセスします。
前提条件
「クイック スタート: アプリにチャットを追加する」にある前提条件の手順すべてを完了します。
Communication Services リソースと同じサブスクリプション内に Azure 通知ハブを作成し、その通知ハブを Communication Services リソースにリンクします。 「通知ハブのプロビジョニング」を参照してください。
.p12 APNs 証明書を作成し、通知ハブで設定する
Microsoft の内部顧客でない場合は、次の手順のすべてのステップを実行します。
Microsoft の内部顧客である場合は、チケットを送信し、アプリのバンドル ID を指定して .p12 証明書を取得します。 その後、次の手順の最後のステップに進みます。
Apple Developer ポータルにサインインします。
[Certificates, Identifiers & Profiles]>[Identifiers]>[App IDs] に移動し、アプリに関連付けられているアプリ ID を選択します。
アプリ ID のページで、[Capabilities]>[Push Notifications] を選択し、[Save] を選択します。
表示される [Modify App Capabilities] ダイアログで、[Confirm] を選択します。
アプリ ID のページで、[Capabilities]>[Push Notifications]>[Configure] を選び、次の選択を行います。
- iOS アプリの開発中にプッシュ通知をテストする場合は、[Development SSL Certificate] の下の [Create Certificate] ボタンを選択します。
- 運用環境でプッシュ通知を送信する場合は、[Production SSL Certificate] の下の [Create Certificate] ボタンを選択します。
[Create a New Certificate] 領域が [Certificates, Identifiers & Profiles] ページに表示されます。
この領域では、証明書署名要求 (CSR) をアップロードします。
新しいブラウザー タブで、この Apple ヘルプ ページに従って CSR を作成し、ファイルを App name.cer として保存します。 手順には、Certificate Assistant を使用して証明書を要求し、証明書情報を入力することが含まれます。
.cer ファイルを [Choose File] 領域にドラッグします。 次に、右上隅にある [Continue] を選択します。
[Download] を選択します。
ファイルを .p12 形式でローカルに保存します。
ダウンロードした .cer ファイルを開きます。 Keychain Access で、証明書を選択して右クリックし、.p12 形式で証明書をエクスポートします。
目的の通知ハブに移動します。 [Settings] で [Apple (APNS)] を選択します。 次に、証明書の詳細を入力します。
- [Authentication Mode] で [Certificate] を選択します。
- [Upload Certificate] で、先ほど作成した .p12 ファイルをアップロードします。
- [Application Mode] で、必要に応じてモードを選択します。
すべての情報の入力が完了したら、[Save] を選択します。
Xcode を構成する
Xcode で、[Signing & Capabilities]\(署名と機能\) に移動します。
[+ Capability]\(+ 機能\) を選択して機能を追加してから、[プッシュ通知] を選択します。
[+ Capability]\(+ 機能\) を選択して別の機能を追加してから、[バックグラウンド モード] を選びます。
[Background Modes] で、[Remote notifications] を選択します。
[Pod Target - AzureCore] について、[Require Only App-Extension-Safe API] を [No] に設定します。
プッシュ通知を実装する
基本バージョン
プッシュ通知の基本バージョンを実装する場合は、APNs でリモート通知に登録する必要があります。 AppDelegate.swift で関連する実装を確認するには、サンプル コードを参照してください。
詳細バージョン
詳細バージョンのプッシュ通知を実装する場合は、アプリに次の項目を含める必要があります。 その理由は、プッシュ通知ペイロードでお客様のコンテンツ (チャット メッセージの内容や送信者の表示名など) を暗号化しており、なんらかの回避策が必要になるためです。
暗号化キーのデータ ストレージ
iOS デバイスに永続的なデータ ストレージを作成します。 このデータ ストレージによって、メイン アプリとアプリ拡張機能の間でデータを共有できる必要があります。
このチュートリアルのサンプル コードでは、次のアクションを実行することで、アプリ グループをデータ ストレージとして選択します。
アプリへの機能の追加に関する Apple の記事の手順に従って、アプリのターゲット (メイン アプリとアプリ拡張機能) にアプリ グループ機能を追加します。
アプリ グループの構成に関する Apple の記事の手順に従って、アプリ グループを構成します。 メイン アプリとアプリ拡張機能のコンテナー名が同じであることを確認します。
Notification Service 拡張機能
メイン アプリにバンドルされている Notification Service 拡張機能を実装します。 このアプリ拡張機能は、プッシュ通知ペイロードをデバイスが受信したときに復号化するために使用されます。
Apple のドキュメントで、プロジェクトへのサービス アプリ拡張機能の追加に関するページに移動し、手順に従います。
Apple のドキュメントで、拡張機能のハンドラー メソッドの実装に関するページに移動します。 データを復号化するための既定のコードが Apple から提供されており、このチュートリアルの全体的な構造に従うことができます。 ただし、復号化に Chat SDK を使用しているため、
// Try to decode the encrypted message data
で始まる部分をカスタマイズしたロジックに置き換える必要があります。 NotificationService.swift で関連する実装を確認するには、サンプル コードを参照してください。
PushNotificationKeyStorage プロトコルの実装
プッシュ通知の詳細バージョンには、PushNotificationKeyStorage
プロトコルが必須です。 Chat SDK に用意されている既定の AppGroupPushNotificationKeyStorage
クラスを使用できます。 アプリ グループをキー ストレージとして使用しない場合、またはキー ストレージ メソッドをカスタマイズする場合は、PushNotificationKeyStorage
プロトコルに準拠した独自のクラスを作成します。
PushNotificationKeyStorage
には、次の 2 つのメソッドが定義されています。
onPersistKey(encryptionKey:expiryTime)
: このメソッドは、ユーザーの iOS デバイスのストレージに暗号化キーを保持するために使用されます。 Chat SDK では、暗号化キーの有効期限として 45 分が設定されます。 プッシュ通知を 45 分以上有効にする場合は、古いキーの有効期限が切れる前に新しい暗号化キーを登録できるように、chatClient.startPushNotifications(deviceToken:)
呼び出しをより頻繁に (たとえば 15 分ごとに) スケジュールする必要があります。onRetrieveKeys() -> [String]
: このメソッドは、以前に格納された有効なキーを取得するために使用されます。 先ほど選択したデータ ストレージに基づいて柔軟にカスタマイズできます。
プロトコル拡張機能では、Chat SDK により、使用できる decryptPayload(notification:) -> PushNotificationEvent
メソッドの実装が提供されます。 NotificationService.swift で関連する実装を確認するには、サンプル コードを参照してください。
通知をテストする
ユーザー A とユーザー B を使用してチャット スレッドを作成します。
サンプル アプリの GitHub リポジトリをダウンロードします。
ユーザー A の
<ACESS_TOKEN>
と<ACS_RESOURCE_ENDPOINT>
の値を AppSettings.plist に入力します。2 つのポッド ターゲット (AzureCommunicationChat と Trouter) に対して、[Enable Bitcode] を [No] に設定します。
iOS デバイスを Mac に接続し、プログラムを実行します。 デバイスでプッシュ通知を承認するように求められたら、[許可] を選択します。
ユーザー B として、チャット メッセージを送信します。 ユーザー A が iOS デバイスでプッシュ通知を受け取っていることを確認します。
登録の更新を実装する
Microsoft が安全なチャット サービスを提供できるようにするため、iOS デバイスでのプッシュ通知の登録は 45 分間のみ有効です。 プッシュ通知の機能を維持するには、クライアント アプリで登録の更新を実装する必要があります。
このチュートリアルでは、Apple の公式ガイドラインに沿った 2 つのソリューションを提案します。 両方のソリューションを一緒に実装して、有効性を高めることをお勧めします。
Note
どちらのソリューションの有効性にもさまざまな要因が影響する可能性があります。 たとえば、デバイスのバッテリーの状態、ネットワークの状態、iOS 固有の制限が、バックグラウンド タスクを実行するアプリの機能に影響する可能性があります。 詳細については、アプリのバックグラウンド実行の進歩に関するビデオと、アプリへのバックグラウンド更新のプッシュに関する Apple 提供の記事を参照してください。
ソリューション 1: バックグラウンド タスク
バックグラウンド タスクは、アプリがフォアグラウンドにない場合でもアクティビティを実行する方法を提供します。 バックグラウンド タスクを実装すると、アプリは、プッシュ通知登録の更新などの特定のタスクを完了するために、より多くの時間を要求できます。
以降のセクションでは、登録の更新にバックグラウンド タスクを使用する方法について説明します。
ユーザー アクセス トークンの自動更新を構成する
チャット サービスに中断なくアクセスできるようにするには、有効なユーザー アクセス トークンを維持する必要があります。 通常、トークンには 24 時間という既定の有効期間があり、それを過ぎると期限切れになり、更新が必要です。 自動更新メカニズムを実装すると、チャット アプリケーションがアクティブ化されるたびにトークンが有効であることを保証するのに役立ちます。
Chat SDK は、カスタム アクセス トークン リフレッシャーが実装されたときに更新プロセスを自動化することで、トークン管理を効率化します。 自動でのトークンの更新をサポートするようにチャット アプリケーションを構成するには、次の手順を実行します。
チャット アプリケーションが継続的かつ安全なユーザー アクセスを維持できるようにするには、トークン発行専用のサービス レベルを実装する必要があります。 1 つのオプションは、Azure Functions をこの目的に利用することです。
Azure 関数を作成するには、「Azure Functions を使用して、信頼できるユーザー アクセス サービスを構築する」を参照してください。 関数アプリを設定し、トークンを発行するために必要なコードを展開する方法について説明しています。
Azure 関数を構成した後:
Azure portal からトークン発行者の URL を取得します。 チャット アプリケーションでこの URL を使用して、新しいトークンを要求します。
チャット アプリケーション内でトークン リフレッシャーを作成して統合します。 このコンポーネントは、新しいトークンを要求し、シームレスな自動トークン更新のためにチャット クライアントを初期化します。
トークン リフレッシャーと、チャット クライアントとの統合のサンプル コードは、サンプル アプリの GitHub リポジトリで入手できます。
バックグラウンド タスクを有効にしてスケジュールする
iOS アプリでバックグラウンド タスクをアクティブ化してスケジュールするには、バックグラウンド タスクを使用したアプリの更新に関する Apple の記事にある手順に従います。
実際の実装については、サンプル アプリの GitHub リポジトリを参照してください。 提供されているサンプルでは、1 分後に開始するように構成された BGProcessingTask
を使用し、バックグラウンドで効率的にデータをフェッチする方法を示します。
ソリューション 2: リモート通知
リモート通知は、iOS アプリケーションが外部トリガーに応答してバックグラウンド タスクを実行するためのメカニズムです。 リモート通知は、ユーザーの介入なしに登録を更新するなどのタスクに使用できます。
リモート通知を使用してバックグラウンド タスクを実行するには:
トリガー メカニズムを実装します。
たとえば、Azure 関数アプリをトリガー メカニズムとして使用できます。 これにより、HTTP 要求を含むさまざまなトリガーに応答してコードを実行できるため、サイレント プッシュ通知を開始する場合に便利です。 関数アプリが通知をどこに配信するかを認識できるように、デバイス レジストリを実装することを忘れないでください。
通知ハブを設定します。
Azure Notification Hubs サービスには、任意のバックエンド (クラウドまたはオンプレミス) から任意のプラットフォーム (iOS、Android、Windows など) に通知を送信できる、スケーラブルなプッシュ通知インフラストラクチャが用意されています。
通常のプッシュ通知に使用するのと同じ通知ハブを再利用できます。 新しいものを設定する場合は、Azure Notification Hubs のドキュメントを参照してください。
通常の通知用に Azure Function App を構成します。
通知ハブ経由でリモート通知を定期的に送信するように関数アプリを調整します。 これらの通知は APNs に転送され、指定されたデバイスに送られます。 詳細については、「Azure Functions における Notification Hubs の出力バインド」を参照してください。
アプリで通知を処理します。
iOS アプリで、アプリケーション インスタンス メソッドを実装して、サイレント通知を受信したときに登録の自動更新をトリガーします。
詳細については、リモート通知サーバーの設定に関する Apple の記事を参照してください。