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

トップ >ドキュメント >チュートリアル:導入講座:パズうま®へのmBaaS導入方法(iOS)

チュートリアル

ドキュメント内検索

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

導入講座:パズうま®へのmBaaS導入方法

概要

このチュートリアルでは、前半と後半に分けて、パズルゲームへのニフティクラウド mobile backend導入方法を紹介しています。
前半では、3マッチパズルの作り方について、サンプルコードをもとに説明していきます。
後半では株式会社フジテレビジョンとイーグル株式会社からリリースされたパズルゲームの「パズうま®」を例として、
3マッチパズルを改良しつつニフティクラウド mobile backendを組み込む方法について解説しています。

パズルアプリの改変内容

パズうまアイコン
パズルゲームから馬育成パズルゲームへ!!
ニフティクラウド mobile backendを導入し、無料iPhoneアプリ『パズうま®』 をリリース!
Apple Storeのページへ

◎パズうま®とは?

株式会社フジテレビジョン、Eagle株式会社、株式会社スフィダンテの共同開発プロジェクトである
「怒濤のゲームアプリ1000本ノック」からリリースされたゲームアプリであり、
ニフティクラウド mobile backendを最初に導入した無料iPhoneアプリです。

【ゲーム内容】

レースやトレーニングをしながら、馬を育てて、4年に1度の世界大会『スフィダンテカップ』で優勝を目指すゲームです!
レースでは、パズルにより馬を応援することができます。引退を迎えた馬は交配をし、子供が親の夢を引き継いでいきます!

【改変内容】

『パズうま®』のパズル部分は、「1.パズルアプリを作ろう」で作成した3マッチパズルを元にされており、3マッチパズルに馬レースをプラスしたアプリとなっています。
さらにニフティクラウド mobile backendを用い、育成している馬の保存や取得を行い、アリーナなどさまざまなゲーム要素を取り入れました。
ここでは、ニフティクラウド mobile backendの導入の仕方ではなく、アプリとしてパズルゲームからの改変内容をご説明します。
パズうま 4年に1度のSFIDANTEカップで優勝を目指せ!

パズルゲームからパズル×馬レースを実現

3マッチパズル+αを考えた時に、『パズうま®』では馬レースをコラボさせています。自分のパズルの能力が馬に反映されます。
消せば消すほど早くなり、ターボを発動することもあります。これにより、パズルを消してただ得点を稼ぐゲームではなく、より消す喜びをユーザーに与え、ゲームを続けるモチベーションの向上にも繋げています。
ユーザーは馬主として一頭の馬を育てていきます。データストア機能を用い、ゲームの最初にユーザー名を保存し、ゲーム中では育てる馬の名前や能力などのデータを保存しています。( ※2-2-2.ユーザー情報を管理で解説)
簡単パズルで愛馬を応援

「パズル→得点→パズル」から「レース→トレーニング→成長→レース」のサイクルを作り出す

関係図
3マッチパズルだけでは、ユーザーは「パズル→得点→パズル」の繰り返しを行います。『パズうま®』では、レースだけでなく、トレーニングを導入し馬を成長させる場所を設けました。これにより「レース→トレーニング→馬の成長→レース」というユーザーサイクルが生まれます。さらに、4年に一度にスフィダンテカップさらに交配を設けることで、「スフィダンテカップ→交配→4年間→スフィダンテカップ」といった一回り大きなサイクルも作っています。
これにより、アプリ自体が単調にならず、ユーザーが長く楽しんでもらえるようにしています。
レースがない日はトレーニングで鍛えよう

最強馬が集うアリーナの導入

ここでは、ほかのユーザーと対戦することができます。今まで自分が育てた馬がどれだけ早いのか、自分のパズル能力はどれくらいなのか、自分を試せる場としています。さらに最強馬が集う場所ですので、一番早い馬を決める場所でもあります。スフィダンテカップを優勝したユーザーが最強を求めて集まってきます。
また、アリーナでは育ててる馬だけでなく、引退した馬も参戦することができます。『パズうま®』では4年経つと引退してしまうため、今まで育てた馬を使うことができなくなってしまいます。それをカバーするためにも、アリーナはユーザーサイクルには入っていませんが重要な役割を果たしています。
アリーナでは、ほかのユーザー情報、馬の情報を必要とするため、ニフティクラウド mobile backendのデータストア機能を用い、情報の取得を行っています。(※2-2 で解説)
全国のオーナー達と夢の対決

ほかユーザーの馬との交配システムの導入

『パズうま®』では、4年毎に馬が引退し、交配により新たな馬を育てていきます。
これは、交配による能力の継承、スキンチェンジなどでユーザーを楽しませる要素、飽きさせない要素を入れています。
アリーナ同様、ほかユーザーの馬と交配ができます。これにより弱い馬を持つユーザーが強い馬と交配するチャンスが生まれ、強い子供が生まれます。
これは、あまり成長させられないユーザーをカバーしています。
その他、実装されていませんが、馬に特殊能力をつけ継承させることや、フレンズ機能を導入しフレンズの馬とは必ず交配できることなど、交配におけるスケールアップは色々あります。
カップリングで子供を作ろう!

プッシュ通知の導入

『パズうま®』には、ニフティクラウド mobile backendの機能であるプッシュ通知が導入されています。
これにより、イベントのお知らせやアップデート通知など、ユーザーに簡単に知らせることができます。
基本的には開発者からユーザーに向けての通知を行いますが、使い方次第では、ユーザーからグループに通知することもできます。(※『パズうま®』ではそのような使い方はしておりません。)
プッシュ通知は、効果的に使えばアプリにとってかなりメリットがあります。そのゲームあった使い方を模索し、プッシュ通知を導入してみてください。
プッシュ通知
次は、ニフティクラウド mobile backendの実装例の解説をしていきます。

実際の導入箇所と実装例

実際の導入方法を見ながら、「ニフティクラウド mobile backend」の実装方法を学んでいきます。

アプリの登録方法

ニフティクラウド mobile backendにアプリを作成し、アプリケーションキーとクライアントキーを取得します。
手順に関しては、クイックスタートに記載されていますので、確認してください。

【アプリケーションキーとクライアントキーの設定】

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)laun-chOptions
{    
    [NCMB setApplicationKey:@"YOUR_APPLICATION_KEY" clientKey:@"YOUR_CLIENT_KEY"];
}

YOUR_APPLICATION_KEYと YOUR_CLIENT_KEYを今回作成したものを設定しましょう。

キーをコピーする

ユーザー情報を管理(ゲーム開始時に名前を登録)

今回、ユーザー管理を行うため、初回ゲーム開始時にユーザーの名前を取得し、保持することとします。実装に利用するクラスは、『NCMBUser』です。

NCMBUser

NCMBUserとは、NCMBObjectのサブクラスであり、ユーザーデータを管理することを目的として設計されたクラスです。
このクラスは、ユーザーの新規登録(signUpなど)やログイン認証(logInWithUsername:password:など)などユーザー管理に特化した機能を備えており、ユーザー管理を必要とするアプリを作成する際に、利用するものです。

本来、このクラスを使う際、アプリを利用するユーザーに、名前、パスワードを入力してもらうことが必要なのですが、今回導入する『パズうま®』では、そこまでの情報を入力させ、会員情報を作成することは、ユーザーにとって手間となります。
そのため、NCMBUserを用いる際に、UUIDを取得し、userNameおよびpasswordに指定し、ユーザーが決めた名前をownerNameとして、登録するように実装します。
以下に示した画面は、実際のアプリ内でユーザーが初回起動時にユーザー名を指定する画面です。この決定ボタンを押された際に、ユーザー情報を登録します。その際に呼び出されるメソッドを見ながら、実際の実装方法を解説していきます。

利用開始画面

【1. ユーザー登録時に用いるメソッド】
+(void)signUpWithOwnerName:(NSString*)name completionHandler:(void(^)(NCMBUser* user, NSError* er-
ror))handler{
    NSString* uuid = [self generateUUID];
    NCMBUser* user = [NCMBUser user];
    user.userName = uuid;
    user.password = uuid;
    [user setObject:name forKey:@"ownerName"];
    [user signUpInBackgroundWithBlock:^(NSError *error) {
        if(!error){
            NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
            [ud setObject:uuid forKey:UUID_KEY];
            [ud synchronize];
            [self logInWithCompletionHandler:handler];
        }else{
            handler(nil,error);
        }
    }];
}
【2. ユーザー作成時に用いるUUIDを作成するメソッド】
+(NSString*)generateUUID{
    CFUUIDRef uuid = CFUUIDCreate(nil);
    NSString* uuid_str = (NSString*)CFUUIDCreateString(nil, uuid);
    CFRelease(uuid);
    return [uuid_str autorelease];
}

ユーザーが名前を入力後、決定ボタンを押した際に、1のメソッドが呼ばれます。このメソッドは、ユーザー名とblock文としてhandlerを引数に持ちます。このユーザー名に今回は「佐藤」が送られてくることになります。
実際にメソッドの中を見ていきましょう。
メソッド内の一行目において、今回登録で用いるUUIDを作成します。UUIDの作成には、2のメソッドを利用します。
次に、NCMBUserを作成し、今回設定する、userName、password、ownerNameを指定します。
設定の仕方としては、NCMBUserのプロパティに設定する場合と、setObject:forKey:というメソッドを利用する2種類があります。
プロパティに関しては、userName、password、mailAddressなどがあり、今回は、userNameとpasswordをプロパティで設定します。また、NCMBUserは、親クラスであるNCMBObjectが持つメソッドを利用することができ、 setObject:forKey:というメソッドもNCMBObjectが持つメソッドです。このメソッドは、指定したキーに指定したオブジェクトを設定するために用います。
今回でいうと、キーとして、ownerName、オブジェクトとして、ユーザーが指定した名前(佐藤)を設定します。
値の設定が終わった段階で、NCMBUserの signUpInBackgroundWithBlockメソッドを呼び出します。
このメソッドは、ユーザーの新規登録を行います。新規登録が成功した時点で、今回利用したUUIDをNSuserDefaultsに保存します。
この保存した値を用い、ログインを行っていくことになります。

作成した新規ユーザーでログインし、セッショントークンを取得する方法を見ていきましょう。
ログインの際に用いるメソッドは、3のメソッドです。

【3. ユーザーログイン時に使用するメソッド】
+(void)logInWithCompletionHandler:(void(^)(NCMBUser* user, NSError* error))handler{
    NSString* uuid = [self userID];
    [NCMBUser logInWithUsernameInBackground:uuid password:uuid block:handler];
}
【4. 保存しているUUIDを返すメソッド】
+(NSString*)userID{
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    return [defaults objectForKey:UUID_KEY];
}

ログインのメソッドでは、4のメソッドを呼び出し、保存しておいたUUIDを取得します。その値を用いて、NCMBUserのメソッド( logInWithUsernameInBackground:password:block:)を呼び出し、ログインします。
その結果、ユーザーのセッショントークンを取得することができます。
このセッショントークンは、さまざまなデータにアクセスする際に必要となるもので、有効期限が24時間となっています。再ログインすることにより、ユーザーのセッショントークンが切れずに利用することができるため、『パズうま®』ではAppDelegateのapplicationDidBecomeActiveメソッドに実装し、バックグラウンドから戻ってきた際に、再ログインを行うようにしています。

馬のデータを管理する

『パズうま®』では、のユーザーの馬を用いてレースを行うアリーナ対戦機能や交配機能を実装しています。
そのためには、ほのユーザーの馬のデータを保存することが必須となります。ここでは、馬のデータを保存する方法を説明します。

まず、今回保存する馬のデータを管理するクラスとして、『NCMBObject』を利用します。

NCMBObject

NCMBObjectとは、データの送受信に関わるクラスです。
このクラスには、データの設定(setObject:forKey:など)データの保存(saveなど)など、データの管理に特化しており、
『 ニフティクラウド mobile backend』における根幹となるクラスです。
『 ニフティクラウド mobile backend』では、NCMBObjectを利用する際に、サブクラス化することで、さらに簡便に利用することができます。サブクラス化を簡便に行うために、『NCMBObject+Subclass』および『NCMBSubclassing』が準備されています。

まず、これら2つの使い方を実際のソースを元に見ていきましょう。
作成するサブクラス名は、『UmaModel』という基準となるクラス、およびレースで用いる『RaceUmaModel』、交配で用いる『CrossBreedUmaModel』の3種です。

【UmaModel.h】

#import <Foundation/Foundation.h>
#import <NCMB/NCMB.h>
@interface UmaModel : NCMBObject<NCMBSubclassing>
// 馬の名前
@property(nonatomic,retain) NSString* name;
// 馬の総合値
@property(nonatomic,readwrite) NSInteger totalPoints;
// 馬のパラメータ
@property(nonatomic,retain) NSDictionary* parameters;
// 馬の容姿
@property(nonatomic,retain) NSDictionary* aspects;
// 馬の持ち主
@property(nonatomic,retain) NCMBUser* owner;
//馬主の名前
@property(nonatomic,retain) NSString* userName;
@end
@interface RaceUmaModel : UmaModel
@end
@interface CrossBreedUmaModel : UmaModel
@end

まず、ヘッダファイルを見てみます。NCMB.frameworkの機能を利用する際の基準となる『NCMB/NCMB.h』をimportしています。
また、親クラスを示す部分には、『NCMBObject』が設定されており、サブクラスとして作成していることがわかります。プロトコルとして、『NCMBSubclassing』を設定しています。プロトコルを設定する意味については後ほど実装ファイルの説明時に行います。ここまでの設定に関しては、『NCMBObject』のサブクラスを実装する際に必ず行うので覚えておきましょう。
データストア
今回、馬のデータとして、馬の名前、馬の総合値、馬のパラメータ、馬の容姿、馬の持ち主、馬主の名前を保持することにします。それらのデータを扱う際には、@propertyを用います。実際、name、totalPoints、parameters、aspects、owner、userName、6種類のプロパティを作成しました。
この『UmaModel』を継承したアプリで実際に利用する『 RaceUmaMod-el』と『 CrossBreedUmaModel』も同時に作成しています。
では、これらの実装ファイルを見ていきましょう。

【UmaModel.m】

#import "UmaModel.h"
#import <NCMB/NCMBObject+Subclass.h>
@implementation UmaModel
@dynamic name, totalPoints, parameters, aspects, owner ,userName;
+(NSString*)ncmbClassName{
    return @"UmaModel";
}
@end
@implementation RaceUmaModel
+(NSString*)ncmbClassName{
    return @"RaceUmaModel";
}
@end
@implementation CrossBreedUmaModel
+(NSString*)ncmbClassName{
    return @"CrossBreedUmaModel";
}
@end

今回のサブクラス化において、必ず実装しなければならないメソッドが、ヘッダファイルで設定したプロトコル『NCMBSubclassing』に示されています。

【NCMBSubclassing.h】

#import <Foundation/Foundation.h>
@class NCMBQuery;
@protocol NCMBSubclassing <NSObject>
+ (id)object;
+ (id)objectWithoutDataWithObjectId:(NSString *)objectId;
+ (NSString *)ncmbClassName;
+ (NCMBQuery *)query;
+ (void)registerSubclass;
@end

『NCMBSubclassing』を見てみると、5種のメソッドがプロトコル宣言されています。この5種が最低限実装しなければならないメソッドになるのですが、ユーザーがすべてを実装するのではなく、すでに準備してあるメソッドをimportすることで、使用できるように、実装の工数を減らすことができるように、『NCMBObject+Subclass』が準備されています。
そのため、『NCMBObject+Subclass』をimportすることで、5種のうち、4種のメソッドの実装はする必要性がありません。
しかし、ncmbClassNameメソッドに関しては実装しなければいけません。このメソッドは、サーバーにデータを登録する際のクラス名を設定するメソッドです。データを管理するクラス名を設定しましょう。

また、プロパティ宣言したものに関しては、@dynamicを必ず実装しましょう。なぜなら、サブクラスを利用する際には、registarSubclassメソッドを用いてクラスを登録することで、開発者が新たに作成したクラスを利用できるようになるのですが、その際に@dynamicで実装しておくことで、プロパティの登録が成功し、利用することができるようになります。登録の方法は、registarSubclassメソッドを呼び出すことです。登録は、必ず最初に行います。
実装箇所としては、setApplicationKey:clientKeyの前に実装しましょう。

【5. サブクラスの登録】

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)laun-
chOptions
{    
    [RaceUmaModel registerSubclass];
    [CrossBreedUmaModel registerSubclass];
    [NCMB setApplicationKey:@"YOUR_APPLICATION_KEY" clientKey:@"YOUR_CLIENT_KEY"];
}
ポイント:NCMBObjecctのサブクラスの作成
  • プロトコル『NCMBSubclassing』を設定
  • 管理する値は、プロパティで指定して、@dynamicを忘れずに実装する
  • 『NCMBObject+Subclass』をimport
  • メソッド『ncmbClassName』でクラス名を設定
ポイント:サブクラスの登録
  • 必ずregisterSubclassを呼び出すこと

データを管理するクラスの準備が完成したので、ここから、実際の保存処理を見ていきます。
今回の『パズうま®』では、
『各ユーザーがレースで使用できる馬は最後にレースを行った馬1体とする』
『ローカルで使う馬自体は、通信で取得するのではなく、ローカルに保持しておく』
というルールのもと、馬のデータを保存しています。これは、通信回数の制限やサーバー上におくデータ量を制限するためです。
それでは、以下のソースを見てください。

【6. 対戦で利用する馬の保存】

+(void)saveMyRaceUmaModel:(RaceUmaModel*)uma{
    NSString* umaID = [self raceUmaID];
    if(!umaID){
        NCMBUser* user = [self currentUser];
        uma.owner = user;
    }else{
        uma.objectId = umaID;
    }
    [uma saveInBackgroundWithBlock:^(NSError *error) {
        if(!error&&!umaID){
            NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
            [ud setObject:uma.objectId forKey:RACE_UMA_ID_KEY];
            [ud synchronize];
        }else{
        }
    }];
}

【7. 保存しているレース用の馬のIDを返すメソッド】

+(NSString*)raceUmaID{
    NSUserDefaults* defaluts = [NSUserDefaults standardUserDefaults];
    return [defaluts objectForKey:RACE_UMA_ID_KEY];
}

先ほども記述してありますが、今回のルールとして、ローカルに自分の馬データは存在しています。
そのため、馬のデータを保存するメソッドは、引数に馬データのクラス(RaceUmaModel)を持ちます。
このメソッドでは、まず、ローカルに保存している馬のID(サーバー上のobjectID)を取得します。
objectIdは、データごとに必ず一意のものであり、objectIdを指定することで、データの上書きが可能になります。
そのため、ローカルに馬のIDが保持されている場合は、objectIdをセットし上書きをします、ローカルに馬のIDがない場合は、ユーザー情報(馬主情報)をセットします。その後、saveInBackgroundWithBlock:を呼び出し保存を行います。成功した場合、馬のobjectIdをローカルに保持します。
同様に交配で用いる馬も保存しています。交配用の馬の保存方法については、今回紹介しているメソッドの「クラスが変更されている」、「ローカルにobjectIdを保存する際のキーが交配用になっている」ことなど変化はありますが、基本同様のメソッドで保存しているため、今回は説明を割愛させていただきます。

ポイント:NCMBObjectの保存
  • 保存にはsaveメソッドを利用する
  • saveメソッドは新規登録、更新の2つを担う
  • 新規、更新の判定はobjectIdの有無で行う

サーバーに存在する馬のデータを取得する

『パズうま®』では、ほかのユーザーの馬を用いる場面として、レースを行うアリーナ対戦機能および交配の2カ所あります。
どちらについても、条件を指定し、馬のデータを取得してきます。ここでは、対戦相手の取得方法を見ていきましょう。取得の際に利用するクラスは、『NCMBQuery』です。

NCMBQuery

NCMBQueryとは、オブジェクト(データ)を検索する際のクエリを指定し、取得することができるクラスです。
このクラスには、検索条件として、どのクラスを検索するかを指定しなければいけません。その他にも条件に一致するもの、一致しないものなど検索条件はさまざまに設定することができる。(includeKey、whereKey:equalTo:など)また、取得するメソッドとして、findObjectsなど複数あるため、最適な検索方法を選ぶことができます。

取得のメソッドには条件を設定できるようにしています。対戦する馬が強すぎず、弱すぎない適度な強さを取得するために『RaceUmaModel』のデータの1つである”totalPoints”のminPtsとmaxPtsを指定し、調整を行っています。
また、すでに取得済みの馬のデータのobjectIdを保持したNSArray(配列)を引数に持っています。これはすでに取得した馬と同じ馬を取得しないように、クエリに条件を追加するためです。では、実際のクエリの設定部分を見ていきましょう。

【8. 対戦で利用する馬の取得】

+(void)getRaceUmaListWithMinPoints:(NSInteger)minPts maxPoints:(NSInteger)maxPts players:(NSArray *)ar-
ray handler:(void(^)(NSArray* array, NSError* error))handler{
    NCMBUser* player = [NCMBUser currentUser];
    RaceUmaModel *model = [player objectForKey:@"RaceUma"];
    NCMBQuery* query = [RaceUmaModel query];
    //検索時の条件の指定
    [query whereKey:@"totalPoints" lessThanOrEqualTo:[NSNumber numberWithInteger:maxPts]];
    [query whereKey:@"totalPoints" greaterThanOrEqualTo:[NSNumber numberWithInteger:minPts]];
    //自分自身の馬が存在していた場合
    if(model){
        NSMutableArray *ary = [NSMutableArray array];
        //馬のobjectIdを指定する
        [ary addObject:[NSString stringWithFormat:@"%@",model.objectId]];
        //すでに取得している(レースに出る)馬のobjectIdを指定する
        for (int i=0; i<[array count]; ++i) {
            [ary addObject:[NSString stringWithFormat:@"%@",[array objectAtIndex:i]]];
        }
        //arrayに指定したobjectId以外のものを検索する
        [query whereKey:@"objectId" notContainedIn:ary];
    }
    NSInteger c = 1 + arc4random()%40;
    [query countObjectsInBackgroundWithBlock:^(int number, NSError *c_error) {
        if(!c_error){
            if(number>c){
                query.skip = rand()%(number-c);
            }
            query.limit = c;
            [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *f_error) {
                handler(objects, f_error);
            }];
        }else handler(nil,c_error);
    }];
}

『NCMBQuery』ではクラス名を指定しなくては使えません。しかし、指定するものは、実際クラスごとで違うものになるため、設定する際に間違える可能性があります。そのため、『NCMBObject』には、クラス名を指定した『NCMBQuery』を返却するメソッドが準備されています。それが、queryというメソッドです。これを用いることで、取得したいクラスのクエリメソッドを呼び、間違えることなく『NCMBQuery』を作成することができます。
クラス名を指定した『NCMBQuery』を作成した後は、条件を設定していきます。
まずは、maxおよびminを決めていきましょう。
使用するメソッドは、whereKey:lessThanOrEqualTo:とwhereKey:greaterThanOrEqualTo:メソッドの2種類です。
このメソッドは、前者は、キー(totalPoints)に設定されている値が設定された値(maxPts)以下であるか、
後者は、 キー(totalPoints)に設定されている値が設定された値(minPts)以上であるかを設定するものです。
これにより、適度な難易度の馬を取得しています。

今回設定する項目として、同じ馬は取得しないという条件です。条件を設定するのに使うメソッドが、whereKey:notContainedTo:メソッドです。これは、キー(objectId)が設定されたNSArray(配列)に含まれているもの以外を取得するものです。そのため、すでに選ばれている馬のobjectIdを設定することで同じ馬を取得しないようにしています。

条件の設定が終わった後は取得を行います。まず、その条件で何体の馬がサーバー上に存在するのか、個数を取得します。
そのメソッドが、countObjectsInBackgroundWithBlock:メソッドです。
このメソッドは、非同期で検索条件の個数を取得する際に使います。個数を取得した際、どこから取得し、どれだけの数を取得するかをさらに『NCMBQuery』に設定します。
これは、すべてを取得するには多少なりとも時間がかかるため制限をかける、基本検索した場合、同様の結果が返ってくるようになっているので、取得し始めるオブジェクトを変更することでランダム性を生み出しています。ランダム条件の指定が終わった後に実際のオブジェクトを取得します。取得に利用するメソッドは、findObjectsInBackgroundWithBlock:メソッドです。
このメソッドにより、検索条件に適した馬のデータが取得できるため、最適な難易度の馬のデータを用い、レースを行うことができます。
交配においても同様に、交配に適した条件を指定し、馬のデータを取得しています。実装方法がほぼ同様のため、説明を割愛させていただきます。

ポイント:NCMBQueryを用いた検索
  • NCMBQueryはクラス名の指定が必須。
  • NCMBObject系は、それ自身を検索するNCMBQueryを返すメソッドが存在。
  • 検索、取得の条件は様々なものが指定することができる。

交配で馬を利用してくれた際のプレゼント機能

自分の馬が他ユーザーの馬の交配相手として利用された場合、プレゼント(『パズうま®』では「にんじん」)される機能を実装しています。プレゼントをもらえることで、自分の馬を育てる意欲、使ってもらえた満足感を与えることで、さらなる強い馬を作成する意欲を生み出そうと考え、実装しています。
実際の実装方法は、今までに出てきた『NCMBObject』とそのサブクラス、『NCMBQuery』を用いて実装します。

【PresentItemModel.h】

#import <Foundation/Foundation.h>
#import <NCMB/NCMB.h>
@interface PresentItemModel : NCMBObject<NCMBSubclassing>
// プレゼントするアイテムのID番号
@property(nonatomic,readwrite) NSInteger itemID;
// 送り手
@property(nonatomic,retain) NCMBUser* sender;
// 送り先
@property(nonatomic,retain) NCMBUser* receiver;
// 送り手の名前
@property(nonatomic,retain) NSString* userName;
// 使われた馬の名前
@property(nonatomic,retain) NSString* umaName;
@end
                        
                        


#import "PresentItemModel.h"
#import <NCMB/NCMBObject+Subclass.h>
@implementation PresentItemModel
@dynamic itemID, sender, receiver ,userName ,umaName;
+(NSString*)ncmbClassName{
    return @"PresentItemModel";
}
@end

今回のプレゼントでは、データとして、プレゼントするアイテムの番号、送り手、送り先、送り手の名前、使われた馬の名前を登録します。もちろんこのクラスを用いる際も、registarSubclassを呼び出し、クラスの登録を行う必要があります。
実際の登録、プレゼントの取得についてみていきましょう。

【9. 交配で馬を利用した際に呼び出されるメソッド】 

+(void)sendPresentItemWithID:(NSString*)itemID receiver:(NCMBUser*)user umaName:(NSString*)umaName 
completionHandler:(void(^)(NSError* error))handler{
    NCMBUser* sender = [self currentUser];
    PresentItemModel* present = [PresentItemModel object];
    present.itemID = itemID;
    present.receiver = user;
    present.sender = sender;
    present.userName = USER_NAME;
    present.umaName = umaName;
    [present saveInBackgroundWithBlock:handler];
}

ここでは、メソッドの引数に設定すべき値をすべて送り、プロパティに設定しています。その後、サーバーに保存することにより、アイテムをほかのユーザーに送ることができます。
では、次に取得を見ていきます。

【10. プレゼントがあるかないかをチェックし、受け取るメソッド】

+(void)getReachedPresentItemListWithBlock:(void(^)(NSArray* array, NSError* error))handler{
    NCMBUser* player = [NCMBUser currentUser];
    NCMBQuery* query = [PresentItemModel query];
    NCMBQuery* userQuery = [NCMBUser query];
    [userQuery whereKey:@"objectId" equalTo:player.objectId];
    [query whereKey:@"receiver" matchesQuery:userQuery];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        handler(objects, error);
    }];
}

取得には、『NCMBQuery』を利用します。『NCMBQuery』は2種類準備をします。『NCMBUser』のクラスを検索するための『NCMBQuery』と『PresentItemModel』のクラスを検索するための『NCMBQuery』です。ユーザーのクラスを検索するものに、条件としてobjectIdが自分自身のobjectIdと一致しているかを設定します。その後、『PresentItemModel』のクラスを検索するためのものには、whereKey:matchesQuery:メソッドを用い、条件を設定します。このメソッドは、キー(receiver)に設定されたものが、引数で渡した『NCMBQuery』の条件を満たすものを検索することができます。
この条件で取得することにより、自分自身のobjectIdが設定されているプレゼントの項目をすべて取得することができます。
このように『NCMBQuery』には、メイン、サブクエリの関係を設定し、検索条件をさらに詳しく絞ることもできます。
検索する際は、最も最適な検索方法を模索していきましょう。

プッシュ通知機能の実装

プッシュ通知は、ユーザーの活性化やアクティブを向上させるうえで、現状欠かすことのできない機能となっています。
プッシュ通知を送信するには、デバイスの情報を取得することが必要です。
デバイスの情報の取得、登録には、『NCMBInstallation』クラスを利用します。

NCMBInstallation

NCMBInstallationは配信端末を登録、管理するクラスです。プッシュ通知を送信するのに必須なデバイストークンを設定したり(setDeviceTokenFromData:)、チャネルリストを作成したりします。

まずは、デバイストークンの取得および登録を行います。
デバイストークンは、取得メソッド(registerForRemoteNotificationTypes:)を呼ぶことで取得します。

【11. デバイストークンの取得】

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)laun-
chOptions
{    
    [RaceUmaModel registerSubclass];
    [CrossBreedUmaModel registerSubclass]; 
    [PresentItemModel registerSubclass];
    [NCMB setApplicationKey:@"YOUR_APPLICATION_KEY" clientKey:@"YOUR_CLIENT_KEY"];
    [[UIApplication sharedApplication]
     registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge|
      UIRemoteNotificationTypeSound|
      UIRemoteNotificationTypeAlert)];
}

デバイストークンの取得に成功すると、以下のメソッドが呼ばれます。

【12. デバイストークンの取得成功した際に呼ばれるメソッド】

- (void)application:(UIApplication *)application 
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NCMBInstallation *currentInstallation = [NCMBInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation save];
}

ここで、NCMBInstallationを作成し、デバイストークンを設定するメソッド(setDeviveTokenFromData:)を呼び出します。
設定後に、保存メソッド(save)を呼び出し保存します。これにより、サーバーにデバイストークンを保存することができるため、プッシュ通知を送信する準備ができました。

実際にプッシュ通知を送信する方法は2つあります。
1つが、アプリ内で『NCMBPush』クラスを用い送信する方法、もう1つがダッシュボード上(web)のプッシュ通知の画面でプッシュ通知を作成し、送信する方法です。今回の『パズうま®』においては、後者の送信方法をとっています。

1.新しいプッシュ通知を作成する
新しいプッシュ通知を作成

2.各種設定を登録する
iOS向けのプッシュ通知で用いる、メッセージ、JSON、配信日時、配信期間、パーミッション、配信端末、配信先(iOS、Android)を設定します。設定が終わった段階で、『プッシュ通知を作成する』を押すことで、プッシュ通知を作成し、配信日時に合わせて送信されます。
プッシュ通知の設定

『パズうま®』におけるプッシュ通知の送信は以上になりますが、アプリ内から送信する方法も説明します。

NCMBPush

NCMBPushは、プッシュ通知を管理するクラスです。
プッシュ通知の送信(sendPushなど)や削除(deleteなど)を行います。

【アプリ内でのプッシュ通知の送信方法】

NCMBPush *push = [NCMBPush push];
    [push setPushToIOS:TRUE];
    [push setPushToAndroid:FALSE];
    [push setMessage:@"test"];
    [push save];

『NCMBPush』を用いて、iOSのみに送信する場合、インスタンスを作成し、setPushToIOSをTRUEに設定します。そして、送信用のメッセージを設定し、saveメソッドで保存することでプッシュを送信します。
今回の例では、すべてのユーザーにプッシュを送信してしまいます。プッシュの範囲を制限するには、channelを設定します。
例えば、チームの仲間にのみ送信したい場合、NCMBInstallationのchannelsプロパティに、チームとしての登録名(今回はEagle)を設定します。

【NCMBInstallationのchannelsの設定】

NCMBInstallation *installation = [NCMBInstallation currentInstallation];
    [installation setChannels:@[@"Eagle"]];
    [installation save];

『NCMBPush』作成時にも同様にchannelsを設定し、送信することで、Eagleと設定されたデバイスにのみプッシュ通知を送ることができます。

【送信先を制限し、プッシュ通知を行う方法】

NCMBPush *push = [NCMBPush push];
    [push setPushToIOS:TRUE];
    [push setPushToAndroid:FALSE];
    [push setChannels:@[@"Eagle"]];
    [push setMessage:@"test"];
    [push save];

このように、アプリ内からも簡単にプッシュ通知を設定できるため、どんどん実装し、アプリの活性化を行っていきましょう。

facebook連携

「ニフティクラウド mobile backend」では、facebook連携やTwitter連携の機能があります。
この機能は、会員情報を登録する際に簡易にログインを行ったり、ログイン後のアカウント管理などを行うことができます。
ユーザー登録自体は、2-2-2で示したように登録しています。
そこで今回は、ユーザー情報とfacebookアカウントをリンクさせ、利用することとします。
リンクを行うことで、facebookのアカウントとデータが紐づくため、さらなる管理が可能です。

【facebookの初期化】

[NCMBFacebookUtils initializeFacebook];

【facebookアカウントのリンク】

if ([NCMBFacebookUtils isLinkedWithUser:[NCMBUser currentUser]]) {
    }else{
        [NCMBFacebookUtils linkUser:[NCMBUser currentUser] permissions:nil block:^(NSError *error) {
        }];
    }

【facebookにログイン後の処理】

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return [NCMBFacebookUtils handleOpenURL:url];
}

facebook連携で利用するのは、『NCMBFacebookUtils』です。

NCMBFacebookUtils

NCMBFacebookUtilsは、facebook連携の機能を提供します。
facebookのログイン(logInWithPermissions:block:)やセッション情報の取得(session)などを行います。

『NCMBFacebookUtils』を利用する際は、まず、initializeFacebookメソッドで、初期化を行っておく必要があります。次にlinkUser:permissions:block:を利用します。これは、すでに存在するアカウントにfacebook情報をリンクさせるメソッドです。
このメソッドを呼ぶことで、今回利用するアカウントにfacebook情報がリンクされ、セッション情報が管理されます。
そのセッション情報を用い、facebookの投稿を行います。投稿自体は、facebook.frameworkの機能を用いているため、ここでは割愛させていただきます。
( [FBRequestConnection startWithGraphPath:@"me/photos" parameters:params HTTPMethod:@"POST" completionHandler: ^(FBRequestConnection *connection,id result,NSError *error)を利用しています)
今回はセッションの管理、ログインで用いましたが、実際はアカウント作成で用いることが多いと思います。

例えば、左図のようにアカウント登録画面があったとします。そこにfacebookでログインボタンを配置し、ログインできるように変更するとしましょう。その際は、facebookのボタンを配置し、そこから、『NCMBFacebookUtlis』のメソッドを呼び出すだけログインを実装することができます。これにより、ユーザーにとって、ユーザー名やパスワードを入力する手間が省けることが最大のメリットです。
Facebookアカウントでログイン

『NCMBFacebookUtils』はこのようなアカウント作成時のfacebookでのログインに対応したクラスといえるでしょう。アカウントを作成するアプリにおいて、『ニフティクラウド mobile backend』 サービスを利用することで、
facebookログインを手間なく実装できます。アカウント登録のあるアプリではぜひ実装しましょう。

ニフティクラウド mobile backendを用いたシステム実装例の説明は以上となります。

今回『パズうま®』を通して、『ニフティクラウド mobile backend』の実装方法を見てきましたが、紹介しきれていない機能がまだまだあります。
実際導入してみると、サーバー開発やバックエンド設計がなくなり、工数、コストともに大幅に削減ができ、アプリ開発に専念することができました。
実際の導入効果についてもサイトに記載してありますので、そちらを参考にしてください。

これから、『ニフティクラウド mobile backend』を使いこなし、より質の良いアプリを開発していきましょう!

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

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

ページの先頭へ