LoginSignup
107
106

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-05-07

FacebookやTwitter、LINEなど多くのサービスで使われているPUSH通知機能を実装してみます。証明書の準備やサーバ側の実装などの説明は省きますので、詳細に知りたい方は下記をご参考下さい。

* PUSH通知機能を持ったiPhoneアプリを作る(証明書の作成)
* iPhoneアプリにPush通知機能を実装する方法のまとめ - もとまか日記

デバイスの登録

「デバイストークン」をサーバ側へ送信します。 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というキーはサーバ側でデータを格納する時に決めた任意の文字列です。

参考リンク

元ネタ

107
106
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
107
106