iOS でのプッシュ通知
重要
このセクションの情報は iOS 9 以前に関連しており、以前の iOS バージョンをサポートするために残されています。 iOS 10 以降については、iOS デバイスでローカルとリモート両方の通知をサポートするためのユーザー通知フレームワーク ガイドを参照してください。
プッシュ通知は簡潔に保ち、更新のためにサーバー アプリケーションに接続する必要があることをモバイル アプリケーションに通知するのに十分なデータのみを含める必要があります。 たとえば、新しいメールが届いたときに、サーバー アプリケーションは、新しいメールが到着したことのみをモバイル アプリケーションに通知します。 通知には、新しいメール自体は含まれません。 その後、モバイル アプリケーションは、適切なタイミングでサーバーから新しいメールを取得します
iOS のプッシュ通知の中心には、Apple Push Notification Gateway Service (APNS) があります。 これは、アプリケーション サーバーから iOS デバイスへの通知のルーティングを担当する Apple によって提供されるサービスです。 次の図は、iOS のプッシュ通知トポロジを示しています。
リモート通知自体は、iOS 開発者向けドキュメントの「ローカル通知およびプッシュ通知に関するプログラミング ガイド」の「通知ペイロード」セクションで指定されている形式とプロトコルに準拠する JSON 形式の文字列です。
Apple では、サンドボックスと運用環境の 2 つの APNS 環境を維持しています。 サンドボックス環境は、開発フェーズ中のテスト用であり、gateway.sandbox.push.apple.com
の TCP ポート 2195 にあります。 運用環境は、展開済みのアプリケーションで使用するためのものであり、gateway.push.apple.com
の TCP ポート 2195 にあります。
要件
プッシュ通知では、APNS のアーキテクチャによって決められた次の規則を遵守する必要があります。
- 256 バイトのメッセージ制限 - 通知のメッセージ サイズ全体が 256 バイトを超えないようにする必要があります。
- 受信確認なし - APNS は、メッセージが目的の受信者に到達したことを示す通知を送信者に提供しません。 デバイスに到達できない場合に複数の順次通知が送信されると、最新の通知を除くすべての通知が失われます。 最新の通知のみがデバイスに配信されます。
- 各アプリケーションにはセキュリティで保護された証明書が必要 - APNS との通信は SSL 経由で行う必要があります。
証明書の作成および使用
前のセクションで述べた各環境には、独自の証明書が必要です。 このセクションでは、証明書を作成し、それをプロビジョニング プロファイルに関連付け、PushSharp で使用する Personal Information Exchange 証明書を取得する方法について説明します。
証明書を作成するには、次のスクリーンショットに示すように、Apple の Web サイトの iOS プロビジョニング ポータルに移動します (左側の [アプリ ID] メニュー項目に注目してください)。
次に、以下のスクリーンショットに示すように、アプリ ID のセクションに移動し、新しいアプリ ID を作成します。
+ ボタンをクリックすると、次のスクリーンショットに示すように、アプリ ID の説明とバンドル識別子を入力できます。
[明示的なアプリ ID] を選択し、バンドル識別子の末尾が
*
でないことを確認します。 これにより、複数のアプリケーションに適した識別子が作成され、プッシュ通知証明書は 1 つのアプリケーション用である必要があります。App Services で、[プッシュ通知] を選択します。
[送信] を押して、新しいアプリ ID の登録を確定します。
次に、アプリ ID の証明書を作成する必要があります。 左側のナビゲーションで、[証明書] > [すべて] を参照し、次のスクリーンショットに示すように
+
ボタンを選択します。開発証明書と運用証明書のどちらを使用するかを選択します。
次に、先ほど作成した新しいアプリ ID を選択します。
これにより、Mac のキーチェーン アクセス アプリケーションを使用して証明書署名要求を作成する手順が表示されます。
証明書が作成されたので、Apple Push Notification Service に登録できるようにアプリケーションに署名するためのビルド プロセスの一部として使用する必要があります。 これには、証明書を使用するプロビジョニング プロファイルを作成してインストールする必要があります。
開発プロビジョニング プロファイルを作成するには、[プロビジョニング プロファイル] セクションに移動し、先ほど作成したアプリ ID を使用して作成手順に従います。
プロビジョニング プロファイルを作成したら、Xcode Organizer を開いて更新します。 作成したプロビジョニング プロファイルが表示されない場合は、iOS プロビジョニング ポータルからプロファイルをダウンロードし、手動でインポートする必要がある場合があります。 次のスクリーン ショットは、プロビジョニング プロファイルが追加された Organizer の例を示しています。
この時点で、この新しく作成されたプロビジョニング プロファイルを使用するように Xamarin.iOS プロジェクトを構成する必要があります。 これは、次のスクリーンショットに示すように、[iOS バンドル署名] タブの [プロジェクト オプション] ダイアログから行います。
この時点で、アプリケーションはプッシュ通知を操作するように構成されています。 ただし、証明書にはさらにいくつかの手順が必要です。 この証明書は、Personal Information Exchange (PKCS12) 証明書を必要とする PushSharp と互換性のない DER 形式です。 PushSharp で使用できるように証明書を変換するには、次の最後の手順を実行します。
- 証明書ファイルをダウンロードする - iOS プロビジョニング ポータルにログインして [証明書] タブを選択し、正しいプロビジョニング プロファイルに関連付けられている証明書を選択して、[ダウンロード] を選びます。
- キーチェーン アクセスを開く - このアプリケーションは、OS X のパスワード管理システムへの GUI インターフェイスです。
- 証明書をインポートする - 証明書がまだインストールされていない場合は、キーチェーン アクセス メニューから [ファイル] ... [アイテムのインポート] を選びます。 上記でエクスポートした証明書に移動し、それを選択します。
- 証明書をエクスポートする - 関連付けられている秘密キーが表示されるように証明書を展開し、キーを右クリックして [エクスポート] を選択します。 エクスポートされるファイルのファイル名とパスワードの入力を求められます。
これで、証明書については完了です。 iOS アプリケーションに署名するのに使用される証明書を作成し、その証明書を、サーバー アプリケーションの PushSharp で使用できる形式に変換しました。 次に、iOS アプリケーションが APNS と対話する方法を見てみましょう。
APNS への登録
iOS アプリケーションがリモート通知を受信するいは、APNS に登録する必要があります。 APNS によって一意のデバイス トークンが生成され、iOS アプリケーションに返されます。 その後、iOS アプリケーションはデバイス トークンを取得し、自身をアプリケーション サーバーに登録します。 これがすべて行われると、登録が完了し、アプリケーション サーバーはモバイル デバイスにプッシュ通知を送信できます。
理論的には、iOS アプリケーションが APNS に登録されるたびにデバイス トークンが変更される可能性があります。しかし、実際には、これは頻繁には発生しません。 最適化のために、アプリケーションは最新のデバイス トークンをキャッシュし、変更された場合にのみアプリケーション サーバーを更新できます。 次の図は、デバイス トークンの登録と取得のプロセスを示しています。
APNS への登録は、現在の UIApplication
オブジェクトに対して RegisterForRemoteNotificationTypes
を呼び出すことによって、アプリケーション デリゲート クラスの FinishedLaunching
メソッドで処理されます。 iOS アプリケーションが APNS に登録するときは、受信するリモート通知の種類も指定する必要があります。 これらのリモート通知の種類は、列挙型 UIRemoteNotificationType
で宣言されています。 次のコード スニペットは、iOS アプリケーションがリモート アラートとバッジ通知を受信するために登録する方法の例です。
if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
new NSSet ());
UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
UIApplication.SharedApplication.RegisterForRemoteNotifications ();
} else {
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
}
APNS 登録要求はバックグラウンドで発生します。応答を受信すると、iOS は AppDelegate
クラスの RegisteredForRemoteNotifications
メソッドを呼び出し、登録済みのデバイス トークンを渡します。 トークンは NSData
オブジェクトに格納されます。 次のコード スニペットは、APNS が提供したデバイス トークンを取得する方法を示しています。
public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
// Get current device token
var DeviceToken = deviceToken.Description;
if (!string.IsNullOrWhiteSpace(DeviceToken)) {
DeviceToken = DeviceToken.Trim('<').Trim('>');
}
// Get previous device token
var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");
// Has the token changed?
if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
{
//TODO: Put your own logic here to notify your server that the device token has changed/been created!
}
// Save new device token
NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}
何らかの理由で登録が失敗した場合 (デバイスがインターネットに接続されていない場合など)、iOS はアプリケーション デリゲート クラスで FailedToRegisterForRemoteNotifications
を呼び出します。 次のコード スニペットは、登録に失敗したことをユーザーに通知するアラートを表示する方法を示しています。
public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}
デバイス トークンのハウスキープ処理
デバイス トークンは時間の経過とともに有効期限が切れたり、変更されたりします。 このため、サーバー アプリケーションでは、何らかのハウス クリーニングを実行し、期限切れの、または変更されたトークンを消去する必要があります。 アプリケーションが、期限切れのトークンを持つデバイスにプッシュ通知を送信すると、APNS はその期限切れのトークンを記録して保存します。 その後、サーバーは APNS にクエリを実行して、有効期限が切れたトークンを確認できます。
APNS は以前はフィードバック サービスを提供していました。これは、プッシュ通知を送信するために作成された証明書を介して認証し、有効期限が切れたトークンに関するデータを返す HTTPS エンドポイントです。 これは Apple によって非推奨とされ、削除されました。
代わりに、以前はフィードバック サービスによって報告されたケース用の新しい HTTP 状態コードがあります。
410 - デバイス トークンはトピックでアクティブではなくなりました。
さらに、新しい timestamp
JSON データ キーが応答本文に含まれます。
:status ヘッダーの値が 410 の場合、このキーの値は、Apple Push Notification Service がデバイス トークンがトピックに対して有効でなくなったことを確認した最後の時刻です。
デバイスがそれ以降のタイムスタンプを持つトークンをプロバイダーに登録するまで、プッシュ通知を停止します。
まとめ
このセクションでは、iOS でのプッシュ通知に関する主要な概念について紹介しました。 Apple Push Notification Gateway Service (APNS) の役割について説明しました。 その後、APNS に不可欠なセキュリティ証明書の作成と使用について取り上げました。 最後に、このドキュメントでは、アプリケーション サーバーが "フィードバック サービス" を使用して期限切れのデバイス トークンの追跡を停止する方法について説明しました。