ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

mBaaSのはまりやすいポイント徹底解説より「インスタレーション編」

mBaaSはアプリやWebアプリケーションにおいてバックエンドをまるっとまとめて提供する仕組みですが、スクラッチでのサーバサイド開発とは異なるので慣れるまでに多少手間取る部分も存在します。ニフクラ mobile backendでは日本語のサポート(Expertプランではテクニカルサポート、Basicプランではコミュニティサポート)を提供していますが、そのサポートに寄せられる質問の中でよくあるものをeBook「mBaaSの はまりやすいポイント徹底解説」としてまとめました。

今回はその中から最も大事な指標になりえるアプリのインストールやデバイストークンに関する質問にお答えします。

アプリのキャッシュやデータを消去しても新規の Installation データが生成されない

アプリのインストールやデバイストークンに関する特別なデータストアクラスであるInstallationは次のようなデータ構成になっています。

  • objectId:ユニークなキー
  • sdkVersion:mobile backendのSDKバージョン
  • applicationName:管理画面上でつけたアプリ名
  • appVersion:アプリのバージョン
  • badge:デバイスで表示されるバッジの数
  • channels:チャンネル
  • deviceToken:デバイストークン
  • deviceType:iosやandroid
  • timeZone:Asia/Tokyoなど
  • acl:パーミッション
  • createDate:データの作成日時
  • updateDate:データの更新日時
  • osVersion:デバイスのOSバージョン

objectIdはユニークですが、同時にデバイストークンについてもユニークなIDとなっています。各デバイスについてデータが登録済みであるかどうかはデバイストークンを使っています。そのため端末のキャッシュやデータを削除するだけでなく、管理画面からもデータを削除する必要があります。

デバイストークンの重複によるエラーを回避する

前述の通りデバイストークンはユニークになっています。そのため重複して登録しようとするとE409001を返却します。これによりエラー発生を回避するためには、

  1. E409001が発生したらNCMBQueryを使ってサーバ側から同一デバイストークンを持つオブジェクトを検索します。
  2. 取得したオブジェクトのobjectIdをcurrentInstallationに設定してfetchします。

これによりcurrentInstallationが既存データのものになります。iOSの場合、次のような実装になります(アプリの再インストールを考慮した端末情報の登録より)。

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NCMBInstallation *currentInstallation = [NCMBInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation setObject:[[UIDevice currentDevice] systemVersion] forKey:@"osVersion"];
    [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if(!error){
            //端末情報の登録が成功した場合の処理
            NSLog(@"didRegisterForRemoteNotification/installation save successed.");
            NSLog(@"currentInstallation:%@", [NCMBInstallation currentInstallation]);
        } else {
            //端末情報の登録が失敗した場合の処理
            if (error.code == 409001){
                //失敗理由がdeviceTokenの重複だった場合は、登録された端末情報を取得する
                NCMBQuery *installationQuery = [NCMBInstallation query];
                [installationQuery whereKey:@"deviceToken" equalTo:[currentInstallation objectForKey:@"deviceToken"]];

                NSError *searchErr = nil;
                NCMBInstallation *searchDevice = (NCMBInstallation*)[installationQuery getFirstObject:&searchErr];
                if (!searchErr){
                    //上書き保存する
                    currentInstallation.objectId = searchDevice.objectId;
                    [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *updateError) {
                        if (updateError){
                            //端末情報更新に失敗したときの処理
                            NSLog(@"currentInstallation can't save data:%@", updateError);
                        } else {
                            //端末情報更新に成功したときの処理
                            NSLog(@"currentInstallation:%@", [NCMBInstallation currentInstallation]);
                        }
                    }];
                } else {
                    NSLog(@"Can't get first object from Installation Class.");
                }
            } else {
                NSLog(@"installation can't save:%@", error);
            }
        }
    }];
}

eBookではこの他、データの検索インポート/エクスポート、会員管理、シグネチャの生成などについて解説しています。ぜひダウンロードしていただき、mBaaSをより快適に利用するのにご活用ください。

f:id:mbaasblog:20180927114437p:plain