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

トップ >ドキュメント >プッシュ通知(iOS):基本的な使い方

プッシュ通知(iOS)

基本的な使い方

概要

このページでは、プッシュ通知の基本的な使い方について説明していきます。

設定の流れ

ニフティクラウド mobile backendのプッシュ通知機能は、
Appleが提供しているApple Push Notification Service(以下、APNs)
と連携することで、通知の配信を行っています。
iOSアプリでプッシュ通知を受信するまでの設定は以下のような流れとなっています。

  1. APNsの設定と証明書の取得
  2. ニフティクラウド mobile backendでの設定
  3. アプリでの設定

APNsの設定と証明書の取得

まずはじめに、Appleの開発者サイトでAPNsを有効にして、
ニフティクラウド mobile backendと連携させるための証明書を取得する必要があります。
以下のドキュメントを参考に、Appleの開発者サイトでの設定を行ってください。

ニフティクラウド mobile backendでの設定

次に、ニフティクラウド mobile backendでプッシュ通知の設定を行います。

プッシュ通知の有効化

アプリ設定から、左メニューのプッシュ通知の項目を選択してください。
プッシュ通知の許可設定を行う部分があるので、「許可する」に変更して変更を保存してください。

プッシュ通知の有効化

APNs用証明書のアップロード

Appleの開発者サイトで取得した証明書をアップロードすることで、
APNsとニフティクラウド mobile backendが連携できるようになります。
証明書の追加

APNsの証明書は、開発用とリリース用の2種類があります。
以下のように、別の証明書を用意してニフティクラウド mobile backendに設定する必要があります。

  • 開発用:Apple Push Notification service SSL (Sandbox) を選択
  • 本番用:Apple Push Notification service SSL (Sandbox & Production) を選択
    • 本来は開発用と本番用を兼ねた証明書ですが、ニフティクラウド mobile backendに設定する場合は本番用として設定してください。

ニフティクラウド mobile backendに登録される端末情報は、
その時設定されていた証明書と紐付いているため、証明書を変更すると
mobile backendに登録されているデバイストークン(端末固有の文字列)が
無効になってしまい、端末にプッシュ通知が配信されなくなります。

iOSへのプッシュ通知を行う場合は、
開発用とリリース用でニフティクラウド mobile backend上にアプリを2つ作成し、
それぞれに開発用・リリース用の証明書を設定してください。

以上の設定で、ニフティクラウド mobile backendとAPNsを連携することができました。
ここからは、アプリ側でプッシュ通知を受信するための実装を行っていきます。

アプリでの設定

アプリ側では、端末をニフティクラウド mobile backendに登録する処理を
実装していきます。

なお、ニフティクラウド mobile backendのiOS SDKは
インストールと初期化が済んでいるものとして説明しますので、
未実施の場合はクイックスタートをご覧ください。

Xcode8での対応

TARGETS -> CapabilitiesからPush NotificationsをONに設定してください。
正常に設定された場合、.entitlementsファイルにaps-environmentが追加されます。

Push NotificationsをON

配信端末情報の登録

APNsでは、プッシュ通知の配信端末を一意に識別するDevice Tokenを利用し、
各端末への配信を行っています。

そのため、APNsからDevice Tokenを取得したあとで、
データストアに配信端末情報として登録する必要があります。
AppDelegateファイル内のapplication:didFinishLaunchingWithOptionsメソッド内で
Device Tokenの要求をAPNsに対して行います。

・サンプルコード
iOS10以降ではFrameworkのimportが必要となります。

#import <UserNotifications/UserNotifications.h>

iOS10以降、iOS8以降でそれぞれDevice Tokenの取得方法が異なりますので
OSのバージョンによって処理を分岐させています。

if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10, 0, 0}]){

    //iOS10以上での、DeviceToken要求方法
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert |
                                             UNAuthorizationOptionBadge |
                                             UNAuthorizationOptionSound)
                        completionHandler:^(BOOL granted, NSError * _Nullable error) {
                            if (error) {
                                return;
                            }
                            if (granted) {
                                //通知を許可にした場合DeviceTokenを要求
                                [[UIApplication sharedApplication] registerForRemoteNotifications];
                            }
                        }];
} else if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){8, 0, 0}]){

    //iOS10未満での、DeviceToken要求方法

    //通知のタイプを設定したsettingを用意
    UIUserNotificationType type = UIUserNotificationTypeAlert |
    UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound;
    UIUserNotificationSettings *setting;
    setting = [UIUserNotificationSettings settingsForTypes:type
                                                categories:nil];

    //通知のタイプを設定
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];

    //DeviceTokenを要求
    [[UIApplication sharedApplication] registerForRemoteNotifications];
} else {

    //iOS8未満での、DeviceToken要求方法
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
    (UIRemoteNotificationTypeAlert |
     UIRemoteNotificationTypeBadge |
     UIRemoteNotificationTypeSound)];
}

Device Tokenが取得できた場合は、同じAppDelegate.mの
application:didRegisterForRemoteNotificationsWithDeviceTokenメソッド
が呼び出されますので、端末情報をデータストアに登録します。

//端末情報を扱うNCMBInstallationのインスタンスを作成
NCMBInstallation *installation = [NCMBInstallation currentInstallation];

//Device Tokenを設定
[installation setDeviceTokenFromData:deviceToken];

//端末情報をデータストアに登録
[installation saveInBackgroundWithBlock:^(NSError *error) {
    if(!error){
        //端末情報の登録が成功した場合の処理
    } else {
        //端末情報の登録が失敗した場合の処理
    }
}];

以上でアプリ側での設定は完了です。
アプリをiOS端末で実行し、端末情報がデータストアに登録されるか確認してください。

アプリの再インストール時を考慮する場合

アプリが再インストールされた場合などに、前回のインストール時に保存された端末情報が
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 {
        //端末情報の検索に失敗した場合の処理
    }
}

installationが削除された時を考慮する場合

以下の例のように、何らかの理由により有効な installation が削除されてしまった場合、通常の実装では installation の再登録は行われず、該当の端末へはプッシュ通知を配信することができなくなってしまいます。

  • 管理者の操作ミスによる削除
    • コントロールパネル上の操作ミスなど
  • 管理者が意図しない操作による削除

そのため、 installation を再度登録するには、以下の処理を追加実装する必要があります。

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

installation が削除された場合(端末情報の該当データがmoble backend 上に存在しない場合)は、以下のように installation を再作成します。

//mobile backend上に該当データがない場合に新規作成処理を行う
-(void)reRegistInstallation:(NCMBInstallation *)installation{
    //objectIdのみ削除し、installationが再生成されるようにする
    installation.objectId = nil;
    //端末情報をデータストアに登録
    [installation saveInBackgroundWithBlock:^(NSError *error) {
        if(!error){
            //端末情報の登録が成功した場合の処理
            NSLog(@"登録に成功");
        } else {
            //端末情報の登録が失敗した場合の処理
            NSLog(@"登録に失敗:%ld",(long)error.code);
        }
    }];
}

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

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

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

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];

}

ダッシュボードからプッシュ通知を配信する

ここからは、ダッシュボードからプッシュ通知を配信する方法を説明します。

プッシュ通知を送信する

ダッシュボード左側メニューのプッシュ通知をクリックし、プッシュ通知の画面を開きます。

新しいプッシュ通知ボタンをクリックすると、プッシュ通知作成画面が表示されます。
このページで新たなプッシュ通知を作成できます。タイトル、メッセージ、JSONデータを記入してください。
※プッシュ通知の設定でメッセージを入力しなかった場合は、端末にプッシュ通知が表示されません。
(上記の場合でも、プッシュ通知の受信音の設定、JSONデータの取得は可能です。)
※iOS宛プッシュ通知の設定は、iOS8未満は合計256バイトまで、iOS8以降は合計2Kバイトまでがサポート対象となります。
新規プッシュ通知作成

配信日時の指定を行います。以下の例では、作成されたプッシュ通知が即時に配信される設定になっています。

プッシュ通知送信日時を指定する場合は、配信日時の欄で日時を選択し、希望する日時を指定してください。

配信期限の指定では電源が切れているなどの事情により通知を受け取れなかった端末への再送信期間を設定できます。デフォルトの設定では再送信できる期間が10日間となっていますが1~28日間、1~24時間の間で、期間を指定できます。

また、配信期限を日時で指定する場合は、日時の指定画面が表示されます。

次に、配信を行うプラットフォームを選択してください。AndroidとiOSの両方にプッシュ通知を送信することも可能です。
Androidを選択した場合は、以下のようにアクション設定と、ダイアログ表示の設定画面が表示されます。
Android独自設定

iOSを選択した場合は、以下のようなiOS端末へのプッシュ通知を行うための設定画面が開きます。
※「バッジ件数」が「インクリメントする」に設定されている場合はInstallationクラスbadgeフィールドの値に対してインクリメントを実行し、プッシュ通知のパラメータに付加して送信しています。
※「音声ファイル名」が設定されている場合でも、プッシュ通知を受信した際にアプリがフォアグラウンド状態だと通知音が鳴りません。
※設定した「音声ファイル名」が存在しない場合は、デフォルトの通知音が鳴ります。
iOS独自設定

最後に「プッシュ通知を作成する」ボタンをクリックすると、プッシュ通知が作成されます。

配信エラーとなった場合

プッシュ通知一覧の画面で、配信状況が配信エラーになる場合がございます。
エラーが発生する場合の主な理由と対策は、以下の通りです。

  • 証明書の不具合
    • 証明書を再設定し、端末情報を再度登録したうえで、プッシュ通知をテストしてください。
  • 証明書またはAPIキーを設定していないのに、両方のOSを対象にしてプッシュ通知を登録
    • 配信対象はデフォルトでiOS/Androidの両方なので、証明書とAPIキーをどちらも設定していないとエラーになります。

配信エラーとなった場合に、ダッシュボードからmobile backend側のログについて
確認することはできませんので、ご不明な点がございましたらお気軽にお問い合わせください。

ダミーデータを登録した端末を指定してプッシュ通知を行わない

プッシュ通知を配信する端末の中に、
テスト目的などでダミーデータを入力した端末が含まれていると、
他の端末も含めてプッシュ通知が配信されない場合がございます。
アプリ側でプッシュ通知が受信されるかを確認する場合は、
ダミーデータを含んだ端末を配信対象に含めないでください。

プッシュ通知でJSONデータを取得する

プッシュ通知には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端末へのプッシュ通知では、以下のペイロードが受信されます。

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

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

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

JSONデータのパラメータには、以下の文字が使用できません。

  1. ダブルクォーテーション「"」
  2. ドット「.」
  3. 先頭にドル記号「$」

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;
setting = [UIUserNotificationSettings settingsForTypes:type
                                            categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];

//DeviceTokenの要求
[[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以上

ページの先頭へ