ニフクラ mobile backendでアクション付きプッシュ通知を試す

iOS8ではプッシュ通知の新機能として、通知アクション機能が追加されました。プッシュ通知の中で返信したり、いいねするような機能です。まだあまり見かけないプッシュ通知ではありますが、アプリを立ち上げる前にアクションが指定できるので、より素早くアプリ操作ができるようになります。対応アプリは今後増えていくかと思います。

最新の[ニフクラ mobile backend](http://mbaas.nifcloud.com/)のバージョンアップで、プッシュ通知がアクションに対応しました！そこで今回は簡単な例をもとに実装方法を紹介します。無料でプッシュ通知が利用できますのでぜひお試しください。

## 必要なもの

- [ニフクラ mobile backendのアカウント](http://mbaas.nifcloud.com/)（無料）
- Xcode（iOSアプリのため）
- iOS Dev Centerでの証明書など

## 証明書周り

プッシュ通知なのでiOS Dev CenterでApp IDの作成、証明書の作成、プロビジョニングのダウンロードなどを行ってください。


キーチェーンアクセスに登録した証明書は公開鍵だけを.p12ファイルとして書き出してください。


## ニフクラ mobile backendでアプリを作成

[ニフクラ mobile backend](http://mbaas.nifcloud.com/)で[ユーザを登録](https://console.mbaas.nifcloud.com/)し、管理画面にログインしたら[新規アプリ](https://console.mbaas.nifcloud.com/#/applications/new)を作成します。


アプリ名はニフクラ mobile backend上でしか使いませんので任意に決めて大丈夫です。新規作成すると、アプリケーションキーとクライアントキーが生成されますので、画面はこのままにしておきます。


## iOSアプリの作り方

続いてiOSアプリです。

今回はCocoaPodsを使います。

まずプロジェクトのルートディレクトリにPodfileを作成します。今回はアプリ名をPushWithCategoryとしていますので、適当に読み替えてください。

```text

platform :ios,'6.0'

target "PushWithCategory" do
    pod 'NCMB', :git => 'https://github.com/NIFCloud-mbaas/ncmb_ios.git'
end
```

そして `pod install` を行います。NCMBはニフクラ mobile backendの略です。

CocoaPodsを使いたくない場合は、[Releases · NIFTYCloud-mbaas/ncmb_ios](https://github.com/NIFCloud-mbaas/ncmb_ios/releases)にてFramework形式でもダウンロードができます。

NCMBのインストールが終わったら、AppDelegate.mを次のようにします。コードは [iOS8で導入されたアクション付きPush通知を試してみる | マネーフォワード エンジニアブログ](https://moneyforward.com/engineers_blog/2014/10/03/ios8%E3%81%A7%E5%B0%8E%E5%85%A5%E3%81%95%E3%82%8C%E3%81%9F%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E4%BB%98%E3%81%8Dpush%E9%80%9A%E7%9F%A5%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/) を参考にさせてもらっています。

下記コードの **APPLICATION_KEY** と **CLIENT_KEY** は先ほどニフクラ mobile backendでアプリを登録した際に作られたアプリケーションキーおよびクライアントキーに書き換えてください。

```objc
#import "AppDelegate.h"
#import <NCMB/NCMB.h> // 追加

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)
    // ここから追加
    [NCMB setApplicationKey:@"APPLICATION_KEY" clientKey:@"CLIENT_KEY"];
    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1){
        //各通知アクションの生成
        UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
        action1.title = @"はい";
        action1.identifier = @"id1";
        
        UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
        action2.title = @"いいえ";
        action2.identifier = @"id2";
        
        UIMutableUserNotificationAction *action3 = [[UIMutableUserNotificationAction alloc] init];
        action3.title = @"内容による";
        action3.identifier = @"id3";
        
        UIMutableUserNotificationAction *action4 = [[UIMutableUserNotificationAction alloc] init];
        action4.title = @"・・・";
        action4.identifier = @"id4";
        
        //通知カテゴリに各アクションを登録
        UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
        category.identifier = @"ACTION_CATEGORY";
        [category setActions:@[action1, action2, action3, action4] forContext:UIUserNotificationActionContextDefault];
        
        UIUserNotificationType types = UIUserNotificationTypeBadge |  UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
        //カテゴリをセッティングに設定
        UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:[NSSet setWithObject:category]];
        //プッシュ通知に登録
        [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeAlert |
          UIRemoteNotificationTypeBadge |
          UIRemoteNotificationTypeSound)];
    }
    // ここまで
	
    return YES;
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}

// ニフクラ mobile backendにデバイストークンを登録
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NCMBInstallation *currentInstallation = [NCMBInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation save:nil];
}

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {
    
    if ([identifier isEqualToString:@"id1"]) {
        // はい の処理
    }
    
    if ([identifier isEqualToString:@"id2"]) {
        // いいえ の処理
    }
    
    if ([identifier isEqualToString:@"id3"]) {
        // 内容による の処理
    }
    
    if ([identifier isEqualToString:@"id3"]) {
        // ・・・ の処理
    }
    
    // 終了時に必ず呼ぶこと
    completionHandler();
}
```

主な違いは UIMutableUserNotificationCategory を作って、UIMutableUserNotificationActionを登録し、それを UIUserNotificationSettings として設定する所でしょう。また、通知の中の選択肢をタップされた時には handleActionWithIdentifierが呼び出されるので、それぞれに必要な処理を実装していきます。

## アプリの起動

コードが書き終わったらコンパイルしてiOSデバイスで立ち上げます。通知の許諾を得るので、OKをタップします。


そうするとニフクラ mobile backendの管理画面、データストアのInstrationクラスにデバイストークンが登録されるはずです。


## 管理画面の設定

次にアプリ設定画面にて、プッシュ通知の設定を変更します。

1. プッシュ通知の許可
2. iOSプッシュ通知の証明書アップロード

前述のキーチェーンアクセスにて作成した証明書（.p12ファイル）をアップロードしてください。


## プッシュ通知を送ってみる

これで準備ができました。プッシュ通知メニューにてプッシュ通知を作成してみましょう。


今回はカテゴリーを指定します。上述のコードの場合、 **ACTION_CATEGORY** がカテゴリになります。プッシュ通知を送信する際に指定します。


そしてプッシュ通知を作成します！


## iOS側で確認

そうするとこんな感じでプッシュ通知が届きます。ここは普通のプッシュと変わりません。


でもこれをスワイプすると、選択肢が表示されます。ロック画面だとうまくスクリーンショットが撮れなかったので通知センターにて。


こんな感じで選択肢が出ます。この場合、最初の2つが出るようになっています。

設定アプリの通知にて、ロックされていない時の通知スタイルをダイアログにします。


そうすると、プッシュ通知にオプションというボタンが追加されます。


タップすると、こんな感じに他の選択肢が表示されるようになります。


このタップした結果は、handleActionWithIdentifierが呼び出されます。そのメソッド内で、処理分けを行う形です。

----

あまり多くの選択肢があるとユーザを混乱させてしまったり、うざいと思われる可能性があります。とはいえアプリにいかずともアクションが起こせるというのはユーザビリティが高く、アプリとしても工夫次第で様々な活用法が考えられそうです、

コードは [NIFCloud-mbaas/PushWithCategory](https://github.com/NIFCloud-mbaas/PushWithCategory) にアップしてあります。動かない時には参考にしてください。

ニフクラ mobile backendを使うとアクション付きプッシュ通知がとても簡単に実装できます。月100万プッシュまでは無料で使えますので、ぜひお試しください！

[サーバー開発不要！アプリ開発をよりスマートに、スピーディに。 | ニフクラ mobile backend](http://mbaas.nifcloud.com/)