iOS でのプッシュ通知
大事な
このセクションの情報は iOS 9 以前に関連しており、古い iOS バージョンをサポートするためにここに残されています。 iOS 10 以降については、iOS デバイスでローカル通知とリモート通知の両方をサポートするための ユーザー通知フレームワーク ガイドの を参照してください。
プッシュ通知は簡潔に保ち、更新プログラムをサーバー アプリケーションに接続する必要があることをモバイル アプリケーションに通知するのに十分なデータのみを含める必要があります。 たとえば、新しい電子メールが届くと、サーバー アプリケーションは、新しい電子メールが到着したことをモバイル アプリケーションにのみ通知します。 通知には、新しいメール自体は含まれません。 その後、モバイル アプリケーションは、適切な場合にサーバーから新しい電子メールを取得します
iOS のプッシュ通知の中心には、Apple Push Notification Gateway Service (APNS)があります。 これは、アプリケーション サーバーから iOS デバイスへの通知のルーティングを担当する Apple によって提供されるサービスです。
次の図は、iOS のプッシュ通知トポロジを示しています。 のプッシュ通知トポロジを示しています
リモート通知自体は、iOS 開発者向けドキュメントの「ローカルおよびプッシュ通知プログラミング ガイド」 の 通知ペイロード セクションで指定された形式とプロトコルに準拠する JSON 形式の文字列です。
Apple は、APNS の 2 つの環境 (サンドボックス と Production 環境) を維持しています。 サンドボックス環境は、開発フェーズ中のテスト用であり、TCP ポート 2195 の gateway.sandbox.push.apple.com
にあります。 運用環境は、展開済みのアプリケーションで使用することを目的としており、TCP ポート 2195 の gateway.push.apple.com
にあります。
必要条件
プッシュ通知では、APNS のアーキテクチャによって決定される次の規則を遵守する必要があります。
- 256 バイトのメッセージ制限 - 通知のメッセージ サイズ全体が 256 バイトを超えないようにする必要があります。
- 受信確認なし - APNSは、メッセージが指定した受信者に届いたことを示す通知を送信者に提供しません。 デバイスに到達できない場合、複数の順次通知が送信されると、最新の通知を除くすべての通知が失われます。 最新の通知のみがデバイスに配信されます。
- 各アプリケーションには、セキュリティで保護された証明書 が必要です。APNS との通信は SSL 経由で行う必要があります。
証明書の作成と使用
前のセクションで説明した各環境には、独自の証明書が必要です。 このセクションでは、証明書を作成し、それをプロビジョニング プロファイルに関連付け、PushSharp で使用する個人情報交換証明書を取得する方法について説明します。
証明書を作成するには、次のスクリーンショットに示すように、Apple の Web サイトの iOS プロビジョニング ポータルに移動します (左側の [アプリ ID] メニュー項目に注目してください)。
次に、次のスクリーンショットに示すように、アプリ ID のセクションに移動し、新しいアプリ ID を作成します。
+ ボタンをクリックすると、次のスクリーンショットに示すように、アプリ ID の説明とバンドル識別子を入力できます。
明示的なアプリ ID 選択し、バンドル識別子が
*
で終わらないことを確認します。 これにより、複数のアプリケーションに適した識別子が作成され、プッシュ通知証明書は 1 つのアプリケーション用である必要があります。App Services で、プッシュ通知 選択します。
次に、[送信] を押して、新しいアプリ ID の登録を確認します。
次に、アプリ ID の証明書を作成する必要があります。 左側のナビゲーションで 証明書 > すべて を参照し、次のスクリーンショットに示すように
+
ボタンを選択します。開発証明書と運用証明書のどちらを使用するかを選択します。
次に、先ほど作成した新しいアプリ ID を選択します。
これにより、Mac の Keychain Access アプリケーションを使用して 証明書署名要求 を作成する手順が表示されます。
証明書が作成されたので、API に登録できるようにアプリケーションに署名するためのビルド プロセスの一部として使用する必要があります。 これには、証明書を使用するプロビジョニング プロファイルを作成してインストールする必要があります。
開発プロビジョニング プロファイルを作成するには、プロビジョニング プロファイル セクションに移動し、先ほど作成したアプリ ID を使用して作成する手順に従います。
プロビジョニング プロファイルを作成したら、Xcode オーガナイザー 開いて更新します。 作成したプロビジョニング プロファイルが表示されない場合は、iOS プロビジョニング ポータルからプロファイルをダウンロードし、手動でインポートする必要があります。 次のスクリーン ショットは、プロビジョニング プロファイルが追加された開催者の例を示しています。
この時点で、この新しく作成されたプロビジョニング プロファイルを使用するように Xamarin.iOS プロジェクトを構成する必要があります。 これは、次のスクリーンショットに示すように、[プロジェクト オプション] ダイアログ [iOS バンドル署名] タブで行います。
この時点で、アプリケーションはプッシュ通知を操作するように構成されます。 ただし、証明書にはさらにいくつかの手順が必要です。 この証明書は、個人情報交換 (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 の場合、このキーの値は、APN がデバイス トークンがトピックに対して有効でなくなったことを確認した最後の時刻です。
デバイスが後のタイムスタンプを持つトークンをプロバイダーに登録するまで、プッシュ通知を停止します。
概要
このセクションでは、iOS でのプッシュ通知に関する主要な概念について説明します。 Apple プッシュ通知ゲートウェイ サービス (APNS) の役割について説明しました。 その後、APNS に不可欠なセキュリティ証明書の作成と使用について説明しました。 最後に、アプリケーション サーバーが Feedback Services を使用して期限切れのデバイス トークンの追跡を停止する方法について説明しました。
関連リンク
- 開発者向けのローカル通知とプッシュ通知
- の UIApplication
- UIRemoteNotificationType