push通知の取得方法の3通り&バッジとノティフケーションの消し方

push通知でdeviceTokenを登録してサーバーに送れば、アプリ側の開発は一段落します。

というのもdevicetokenさえわかればサーバーからその端末のそのアプリまでデータを送信する事は可能です。

で、そのあと取得に際して、気をつけなくてはならない事があります。

アプリが起動している状態か?アプリがバックグラウンドにいる状態か?アプリは停止している状態か?

でふるまいが異なります。

※appdelegateに記載する前提ですすめます

アプリが起動している状態、もしくはバックグラウンドにいる状態では

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    NSLog(@"サーバーから届いている中身一覧: %@",[userInfo description]);
    if(application.applicationState == UIApplicationStateInactive){
        //バックグラウンドにいる状態
        
    }else if(application.applicationState == UIApplicationStateActive){
        //ばりばり動いている時
        
    }
}

のように分岐ができます。

上記の2つの振る舞いに関して、大きな違いが一点だけあって、通知領域といわれる、一番上のステータスバーを引っ張ったところに出る情報や、ロック画面で表示が、Activeの時に出ません。

ですが、バックグラウンドにいる場合には、出るので、出た場合には、消す方法なども実装しなくてはいけません。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

で、この場合には、didReceiveRemoteNotificationに上記を記載すると、バッジ(アプリの右上に出る数字)を消す事はできるのですが、なぜか通知領域を消す事ができません。

なので、通知領域はapplicationDidBecomeActiveに記載をします(バックグランドのアプリを戻した時の関数)

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

で、完成としたいところですが、didReceiveRemoteNotificationの関数が起動してない場合にpush通知を受け取ると実行されません。そのかわりdidFinishLaunchingWithOptionsにuserInfoが紛れ込んでくるので

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
        NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if(userInfo){
            //プッシュ通知から呼ばれた
        }
}

のようにすると、プッシュ通知を受け取れます。

結構面倒な事も多いのですが、実装する時には必要に迫られているかと思いますので、お役にたてればと思います。

同じカテゴリーの記事

前後の記事

前の記事:

次の記事:

Page top↑