Push通知の実装をやってみました。
クライアントとサーバー側両方で実装が必要になるのですが、クライアント側はかなり簡単だったので拍子抜けしました。アプリ起動時にリモート通知用の登録をしてみましょう。UIApplicationクラスのregisterForRemoteNotificationTypesメソッドで登録できます。パラメータにはどの種類の通知を受けたいかとあらかじめ定義しておきます。
UIRemoteNotificationTypeBadge | バッチの値を変えたい |
UIRemoteNotificationTypeAlert | アラートを表示したい |
UIRemoteNotificationTypeSound | 音を鳴らしたい |
registerForRemoteNotificationTypesメソッドを呼ぶと、システム側は「プッシュ通知を許可しますか?」というアラートを表示させます。当然ですが、ここでユーザーがプッシュ通知の許可しないとPush通知をおこなうことができません。
// アプリケーションが起動した際の処理 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Remote Notification を受信するためにデバイスを登録する [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound)];
Push通知の登録は、Apple Push Notification Service(以下APNS)を扱うサーバーへUUIDではないユニークなデバイス情報を送信して、デバイストークンを取得して完了です。
通信が発生するため非同期処理となり登録の正否については、デリゲートにて通知されます。デバイス情報の登録が成功すれば、didRegisterForRemoteNotificationsWithDeviceTokenメソッドが呼び出されます。
サーバーからPushを送るにはデバイストークンが必要なので、APNSから得られたトークンを自前サーバーに送らないといけません。
// デバイス情報の登録に成功 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // deviceTokenをサーバーへ送信 }
デバイス情報の登録に失敗すると、以下のdidFailToRegisterForRemoteNotificationsWithErrorメソッドが呼び出されます。実際にところここでどのように振る舞えば良いか判りませんが、ほとんどアプリでは何もしていないのではないでしょうか。
// デバイス情報の登録に失敗 - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSLog(@"なんか駄目だったわー"); }
サーバーでトークンが保持できると終わりです。サーバーからAPNSにトークンとペイロードを送信して初めてPush通知が来ます。プッシュ通知を受信した際の処理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // userInfoに登録されている辞書からアラートやバッチの数を取得する事が可能 // aps // alert // sound // badge }