Think Big Act Local

iPhone開発を軸にブレブレの記事を書いていきます。

PUSH通知機能を持ったiPhoneアプリを作る(デバイストークンの登録とメッセージの受信)

FacebookTwitter、LINEなど多くのサービスで使われている
PUSH通知機能を実装してみます。

証明書の準備やサーバ側の実装などの説明は省きますので、
詳細に知りたい方はこちらをご参考下さい。
iPhoneアプリにPush通知機能を実装する方法のまとめ - もとまか日記

【2013/5/6 追記】
PUSH通知の証明書準備編の記事書きました。
PUSH通知機能を持ったiPhoneアプリを作る(証明書の作成)

バイスの登録

「デバイストークン」をサーバ側へ送信します。
PUSH通知を送る際には、このデバイストークンを指定してメッセージを送ります。

// アプリ起動時
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // PUSH通知を登録
  [[UIApplication sharedApplication]
    registerForRemoteNotificationTypes:
   (UIRemoteNotificationTypeBadge|
    UIRemoteNotificationTypeSound|
    UIRemoteNotificationTypeAlert)];
}

// デバイストークン発行成功
- (void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)devToken{
  NSLog(@"deviceToken: %@", devToken);

  // デバイストークンをサーバに送信し、登録する
}

// デバイストークン発行失敗
- (void)application:(UIApplication*)app didFailToRegisterForRemoteNotificationsWithError:(NSError*)err{
  NSLog(@"Errorinregistration.Error:%@",err);
}

アプリ起動時にregisterForRemoteNotificationTypesを呼び出し、デバイストークンの発行をリクエストします。
成功するとdidRegisterForRemoteNotificationsWithDeviceToken:が呼ばれます。引数としてdevTokenが渡されるので、これをサーバに送信して登録処理を行います。
また、デバイストークンの発行に失敗した場合はdidFailToRegisterForRemoteNotificationsWithErrorが呼ばれます。

メッセージの受信

PUSH通知を受け取った際には、以下のいずれかのメソッドが呼ばれます。

  • didFinishLaunchingWithOptions
  • didReceiveRemoteNotification

アプリが起動していない時に、PUSH通知からアプリを起動した場合

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  ...
  NSDictionary *userInfo
  = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
  if (userInfo != nil) {
    // ここに処理        
  }
  ...
}

アプリがフォアグラウンドで起動している時にPUSH通知を受信した場合

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{  
  if (application.applicationState == UIApplicationStateActive)
  {
    ...
    // ここに処理
    ...
  }    
}

アプリがバックグラウンドで起動している時に、PUSH通知からアクティブになった場合

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{  
  if (application.applicationState == UIApplicationStateInactive)
  {
    ...
    // ここに処理
    ...
  }    
}

PUSH通知に含まれるメッセージを取り出す

PUSH通知で送るメッセージにはKey-Valueの形でデータを持たせることができます。
userInfoオブジェクトに格納されているので、そこから取り出して扱います。

アプリが起動していない時に、PUSH通知からアプリ起動

    NSDictionary *userInfo
    = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo != nil) {
      NSDictionary *message = [userInfo objectForKey:@"message"];
      // messageを使った処理
    }

アプリがフォアグランドで起動時にPUSH通知を受信 or バックグラウンドで起動時に、PUSH通知からアクティブに

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
  NSDictionary *message = [userInfo objectForKey:@"message"];   
  // messageを使った処理
}

このようにしてデータを取り出すことができます。
ここで、messageというキーはサーバ側でデータを格納する時に決めた任意の文字列です。

参考リンク

関連書籍

Objective-Cの基礎文法をマスターするならこれ。