サーバー構築不要!スマートフォンアプリ向けの新クラウド

トップ >ドキュメント >SDKガイド(iOS):プッシュ通知

SDKガイド(iOS)

ドキュメント内検索

プッシュ通知

このドキュメントは更新されていません。
こちらから最新版をご覧ください。

iOS端末へのプッシュ通知について

アプリにプッシュ通知機能を組み込むための準備として、以下の2つが必要です。

  • ダッシュボードでGCM/APNsと連携するための設定
  • アプリ側でプッシュ通知を受信する処理を用意

APNsと連携するための証明書の取得方法については、APNsとの連携に必要な準備をご覧ください。
ダッシュボードの設定については、ダッシュボードの使いかた:プッシュ通知をご覧ください。
このページでは、SDKを使ったプッシュ通知の送受信について説明します。

ペイロードの内容について

iOS端末へのプッシュ通知では、以下のペイロードが受信されます。

パラメータ名 説明 データ型
com.nifty.PushId プッシュ通知ID 16文字の文字列
com.nifty.RichUrl リッチプッシュ通知用URL 文字列
aps プッシュ通知の設定(別表) オブジェクト
- ユーザー設定値 オブジェクト

apsには通知音やバッジ数についての設定が含まれています。

パラメータ名 説明 データ型
sound プッシュ通知音のファイル名 文字列
alert メッセージ 文字列
category アクション用のカテゴリ名 文字列
badge バッジ数 数値
content-available サイレントプッシュ通知 1(固定)

プッシュ通知を受信する

プッシュ通知をmobile backendで送受信するためには、端末情報をmobile backendに登録する必要があります。

配信端末情報の登録

アプリ起動時に、デバイストークンの取得を行う設定が必要です。
AppDelegateファイル内のapplication:didFinishLaunchingWithOptionsメソッド内に、
mobile backendの初期化とともに以下の処理を追加してください。

※iOS8よりデバイストークンの取得方法が変更になりましたのでご注意ください

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1){
    UIUserNotificationType type = UIUserNotificationTypeAlert |
        UIUserNotificationTypeBadge |
        UIUserNotificationTypeSound;
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type
                                                                            categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeAlert |
      UIRemoteNotificationTypeBadge |
      UIRemoteNotificationTypeSound)];
}

プッシュ通知を行う端末を、配信端末情報としてmobile backendに登録します。

// 配信端末情報を登録する。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NCMBInstallation *currentInstallation = [NCMBInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation save:nil];
}

リッチプッシュ通知を行う

リッチプッシュ通知とは、プッシュ通知配信時に指定したWebページを受信後に開くものです。
リッチプッシュ通知を表示するためには、handleRichPushを利用します。

プッシュ通知のペイロード内にURLが含まれているかを判断し、通常のプッシュ通知か、リッチプッシュ通知のどちらかを表示する必要があります。
また、リッチプッシュ通知の画面は、必ずWebViewが開くので、アプリで何かを操作しているときに表示してしまうと、リッチプッシュ通知が邪魔になってしまいます。
以下の例では、アプリが起動中であり、バックグラウンドで動作しているときにのみ、リッチプッシュ通知を表示するようにしています。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    if ([userInfo.allKeys containsObject:@"com.nifty.RichUrl"]){
        if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive){
            [NCMBPush handleRichPush:userInfo];
        }
    }
}

アプリ起動時にリッチプッシュ通知を表示したい場合は、
application:didFinishLaunchingWithOptions:メソッドでもhandleRichPushを呼び出すようにしてください。

// NCMBの初期化をしてるメソッド内
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

    (略)

    [NCMBPush handleRichPush:[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]];

    return YES;
}

ペイロードからデータを取得する

プッシュ通知にはJSON形式で任意のデータを含めることができるので、
以下のようにプッシュ通知を受信した時に、そのデータを受け取って処理を行うことができます。
アプリの状態によって、プッシュ通知を受信したときのメソッドが異なっており、
ペイロードを取得するためのキーも名前が違ってきます。

アプリが起動されたときにプッシュ通知の情報(ペイロード)からデータを取得する

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // プッシュ情報の取得
    NSDictionary *payload = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];

    NSDictionary *data = [payload objectForKey:@"name"];
    if (data != NULL){
        //値を取得した後の処理
        NSLog(@"data:%@", data);
    }

    return YES;
}

アプリが起動中のときにプッシュ通知を受信した場合

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSDictionary *data = [userInfo objectForKey:@"name"];
    if (data != NULL){
        //値を取得した後の処理
        NSLog(@"data:%@", data);
    }
}

プッシュ通知をアプリから送信する

ダッシュボードだけでなく、アプリからも他の端末へプッシュ通知を送信することができます。

プッシュ通知の設定を行う

iOS端末へのプッシュ通知を行う場合は、バッジの増加フラグや、着信音の設定などが可能です。
content-availableとバッジ数増加フラグは、どちらかしか設定できません。
(参考)REST APIリファレンス:プッシュ通知登録

NCMBPush *push = [NCMBPush push];

NSDictionary *data = @{@"contentAvailable":[NSNumber numberWithBool:NO],
                       @"badgeIncrementFlag":[NSNumber numberWithBool:YES],
                       @"sound":@"default"};

[push setData:data];
[push setMessage:@"testSendPush"];
[push setImmediateDeliveryFlag:true];
[push setPushToIOS:true];

[push sendPushInBackgroundWithBlock:nil];

Android端末へのプッシュ通知を行う場合は、タイトルや起動画面、ダイアログプッシュ通知の有効フラグを設定できます。

NCMBPush *push = [NCMBPush push];

NSDictionary *data = @{@"action":@"ReceiveActivity",
                       @"title":@"testPush"};

[push setData:data];
[push setMessage:@"testSendPush"];
[push setImmediateDeliveryFlag:true];
[push setDialog:true];
[push setPushToAndroid:true];

[push sendPushInBackgroundWithBlock:nil];

プッシュ通知のスケジューリング

プッシュ通知の配信時刻を指定することができます。
配信時刻を指定するか、即時配信を指定しないと、プッシュ通知を登録することができません。
(参考)REST APIリファレンス:プッシュ通知登録

NCMBPush *push = [NCMBPush push];

[push setDeliveryTime:[NSDate dateWithTimeIntervalSinceNow:3*60]];
[push setMessage:@"testSendPushScheduling"];
[push sendPushInBackgroundWithBlock:nil];

配信端末の絞り込み

setSearchConditionメソッドでクエリを設定することにより、プッシュ通知の配信端末を絞り込むことができます。
端末情報をmobile backendに登録する時に任意の値を設定可能ですので、
Installationクラスの既存フィールド以外でも絞り込み条件を設定することができます。

以下の例は、端末情報登録時にOSのバージョンを設定しているとして、その情報で配信端末を絞り込んでいる例です。

//OSのバージョンでプッシュ通知の配信端末を絞り込む
- (void)testSendPushWithSearchCondition {

    NCMBPush *push = [NCMBPush push];
    NCMBQuery *query = [NCMBInstallation query];
    [query whereKey:@"osVersion" greaterThan:@"7"];
    [push setSearchCondition:query];
    [push setMessage:NSStringFromSelector(_cmd)];
    [push setImmediateDeliveryFlag:true];
    [push setPushToIOS:true];

    [push sendPushInBackgroundWithBlock:nil];

}

プッシュ通知の開封通知

プッシュ通知の開封通知を登録しておくことで、
ダッシュボードからプッシュ通知の開封率を閲覧することができます。

この開封通知の登録処理も、プッシュ通知を受信したときのアプリの状態によって、
処理されるメソッドが異なるので、2カ所に処理を記述します。

アプリが起動していない場合

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    [NCMBAnalytics trackAppOpenedWithLaunchOptions:launchOptions];
    //引数にnilを渡した場合は開封通知をしない
}

アプリが起動している場合

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    if (application.applicationState == UIApplicationStateActive) {
        // アプリがすでに起動していた場合
    } else {
        // アプリがバックグラウンドで動作中にプッシュ情報からフォアグラウンド状態になった場合
        [NCMBAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];
    }
}

アプリの再インストールを考慮した端末情報の登録

アプリが再インストールされた場合などに、前回のインストール時に保存された端末情報が
mobile backend上に残ったままの場合が考えられます。
その場合には端末情報の登録でdeviceTokenの重複エラーが発生するため、
エラーが発生したときの処理を実装する必要があります。

端末情報でエラーが発生した場合にエラーコードを取得し、
409001(重複してはいけない値を登録しようとした場合に発生するエラーコード)かを判定し、
データストアに保存されている端末情報を上書きするようにします。

NCMBInstallation *installation = [NCMBInstallation currentInstallation];
[installation setDeviceTokenFromData:deviceToken];
[installation saveInBackgroundWithBlock:^(NSError *error) {
    if(!error){
        //端末情報の登録が成功した場合の処理
    } else {
        //端末情報の登録が失敗した場合の処理
        if (error.code == 409001){
            //失敗した原因がdeviceTokenの重複だった場合
            [self updateExistInstallation:installation];
        } else {
            //deviceTokenの重複以外のエラーが返ってきた場合
        }
    }
}];

端末情報を上書き保存するupdateExistInstallation:は以下のようにします。

//deviceTokenの重複で端末情報の登録に失敗した場合に上書き処理を行う
-(void)updateExistInstallation:(NCMBInstallation*)currentInstallation{
    NCMBQuery *installationQuery = [NCMBInstallation query];
    [installationQuery whereKey:@"deviceToken" equalTo:currentInstallation.deviceToken];

    NSError *searchErr = nil;
    NCMBInstallation *searchDevice = [installationQuery getFirstObject:&searchErr];

    if (!searchErr){
        //上書き保存する
        currentInstallation.objectId = searchDevice.objectId;
        [currentInstallation saveInBackgroundWithBlock:^(NSError *error) {
            if (!error){
                //端末情報更新に成功したときの処理
            } else {
                //端末情報更新に失敗したときの処理
            }
        }];
    } else {
        //端末情報の検索に失敗した場合の処理
    }
}

端末登録時に現在の位置情報も登録する

端末登録時に現在の位置情報について登録することにより、
位置情報から配信端末を絞り込んでプッシュ通知を送信することができます。

以下のサンプルコードが、位置情報を端末情報に含めて登録する場合の例です。
位置情報の詳細な取得方法については、SDKガイドの位置情報検索をご覧ください。

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //iOS8の場合、位置情報の利用をリクエストする
    //別途Info.plistの編集も必要なので、SDKガイドの位置情報検索をご覧ください。
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        [locationManager requestWhenInUseAuthorization];
    }

    //現在地を非同期処理で取得する
    [NCMBGeoPoint geoPointForCurrentLocationInBackground:^(NCMBGeoPoint *geoPoint, NSError *error) {
        if (error){
            //位置情報取得に失敗したエラー処理
            NSLog(@"error:%@", error);
        } else {
            //位置情報が取得できた場合の処理
            NCMBInstallation *installation = [NCMBInstallation currentInstallation];
            [installation setDeviceTokenFromData:deviceToken];
            [installation setObject:geoPoint forKey:@"geoPoint"];

            [installation saveInBackgroundWithBlock:^(NSError *e) {
                if (e){
                    //端末情報の登録に失敗した場合の処理
                    //必要であれば再インストール時を考慮した実装にする
                } else {
                    NSLog(@"currentInstallation:%@", installation);
                }
            }];
        }
    }];
}

プッシュ通知の配信時には、searchConditionにて位置情報を指定した検索条件を設定するか、
ダッシュボードのプッシュ通知配信画面にて条件を設定することで、
指定された位置情報を持った端末にのみ、プッシュ通知を配信することが可能となります。
ダッシュボードの使い方については、こちらをご覧ください。

Interactive Notificationの実装

iOS8から、プッシュ通知に複数のアクションを設定できる
Interactive Notificationが利用できるようになりました。

Interactive Notificationの画面

利用する手順は以下の通りです。

  1. アクションを作成する
  2. カテゴリを作成する
  3. アクションが実行された場合のハンドリングを行う
  4. プッシュ通知にカテゴリを設定して配信する

アクションの作成はUIMutableUserNotificationActionクラスで行います。

//Interactive Notifications用に承認するアクションを作成
UIMutableUserNotificationAction *acceptAction =
[[UIMutableUserNotificationAction alloc] init];
acceptAction.identifier = @"ACCEPT_IDENTIFIER";
acceptAction.title = @"Accept";
acceptAction.activationMode = UIUserNotificationActivationModeForeground;

//Interactive Notifications用に拒否アクションを作成
UIMutableUserNotificationAction *denyAction =
[[UIMutableUserNotificationAction alloc] init];
denyAction.identifier = @"DENY_IDENTIFIER";
denyAction.title = @"Deny";
denyAction.activationMode = UIUserNotificationActivationModeForeground;

カテゴリの作成はUIMutableUserNotificationCategoryクラスで行います。

//カテゴリを作成
UIMutableUserNotificationCategory *friendReqCategory =
[[UIMutableUserNotificationCategory alloc] init];

//プッシュ通知で指定するカテゴリ名を設定
friendReqCategory.identifier = @"FRIEND_REQUEST";

//表示するアクションを設定
[friendReqCategory setActions:@[acceptAction, denyAction]
                forContext:UIUserNotificationActionContextDefault];

//カテゴリを集めたNSSetを作成
NSSet *categories = [NSSet setWithObject:friendReqCategory];

//プッシュ通知のタイプとカテゴリを設定
UIUserNotificationType type = UIUserNotificationTypeAlert |
    UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound;
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type
                                                                        categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
[[UIApplication sharedApplication] registerForRemoteNotifications];

アクションが実行された場合のハンドリングは、デリゲートクラスに
application:handleActionWithIdentifier:forRemoteNotification:completionHandler:メソッド
を用意します。

//アクションが実行された場合に呼び出されるデリゲートメソッド
- (void)application:(UIApplication *) application
    handleActionWithIdentifier: (NSString *) identifier
         forRemoteNotification: (NSDictionary *) notification
             completionHandler: (void (^)()) completionHandler {

    //アクションのIdnetifierごとに処理を分けて実装する
    if ([identifier isEqualToString: @"ACCEPT_IDENTIFIER"]) {
        [self handleAcceptActionWithNotification];
    } else {
        [self handleDenyActionWithNotification];
    }

    //ハンドリングが終了する場合に必ず以下を実行する
    completionHandler();
}

//Acceptが実行された場合の処理
- (void)handleAcceptActionWithNotification{
    NSLog(@"Request accepted.");
}

//Denyが実行された場合の処理
- (void)handleDenyActionWithNotification{
    NSLog(@"Request denied.");
}

カテゴリ作成時にidentifierをFRIEND_REQUESTに設定したので、
プッシュ通知の配信時にカテゴリをFRIEND_REQUESTにして配信することで
上の画像のように、プッシュ通知から設定したアクションを実行できるようになります。







お探しの内容が見つからなかった場合はユーザーコミュニティ もご活用ください。(回答保証はいたしかねます)
なお、 Expertプラン以上のお客様はテクニカルサポートにてご質問を承らせて頂きます。

推奨画面サイズ1024×768px以上

ページの先頭へ