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

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

ピンポイントでターゲットを探そう!ニフティクラウド mobile backendの位置情報検索について

スマートフォン、タブレットでは殆どがソフトウェアキーボードです。さらに画面が小さいこともあって、文字列入力を嫌がる傾向があります。そのため、なるべくユーザの文字入力なしに情報を推薦で出す(サジェストする)仕組みが必要です。

その一つが位置情報であると言えます。周囲のお店、住所、駅名などを入力せずに位置情報をもとにして周辺情報をリストアップできます。この流れはとても自然でユーザビリティの高い仕組みと言えるでしょう。

そして運営にとっても位置情報というのは見逃せないデータになります。広告やプロモーションを考えた場合、なるべくユーザの属性を絞り込んだ上で効果的に発信しなければなりません。的外れなプロモーションはユーザに嫌われてスパム扱いされてしまうからです。

そこで使えるのが位置情報検索になります。ニフティクラウド mobile backendで使える位置情報検索機能をご紹介します。

データの保存について

まず検索元になるデータですが、GeoPointという種類で保存するのがコツになります。ダッシュボードを使う場合は、緯度経度というデータ型を選択してください。そして緯度と経度を,(カンマ)でつないで保存します。

データの検索について

検索する場合はデータストアの検索機能を使います。

検索は2種類が指定できます。

ある位置情報を基点として円形に

基点となる位置情報があり、そこからの距離を指定するパターンです。その中にいるデータが一覧で返ってきます。 $nearSphere という検索識別子を使います。

二つの位置情報を使って四角に

二つの位置情報を指定して、その範囲に含まれるデータを取得するパターンです。$box を使います。

使い方

簡単な使い方としては、予め店舗、住所、駅名などを保存しておきます。保存時には管理画面を使うこともできますが、データ量が多い場合はRESTful APIを使うのが良いでしょう。

データを保存したら、スマートフォンやタブレットの位置情報を使ってデータストアを検索します。以下はiOSでの実装例です。

- (IBAction)QueryEaxmple1:(id)sender {
    NSString *areaName = @"新宿駅";
    NSError *error = nil;
    
    //データストアにある新宿駅の位置情報を取得
    NCMBGeoPoint *geoPoint;
    NCMBQuery *query = [NCMBQuery queryWithClassName:@"Places"];
    [query whereKey:@"areaName" equalTo:areaName];
    NSArray *array = [query findObjects:&error];
    if (!error) {
        geoPoint = [[array lastObject] objectForKey:@"point"];
    }
    else{
        //エラー処理
    }
    
    //設定した座標から近い順に検索
    NCMBQuery *geoQuery = [NCMBQuery queryWithClassName:@"Places"];
    [geoQuery whereKey:@"point" nearGeoPoint:geoPoint];
    [geoQuery findObjectsInBackgroundWithBlock:^(NSArray *objects,NSError *error){
        if (!error) {
            //成功後の処理
        }
        else{
            //エラー処理
        }
    }];
}

プッシュ通知と絡める

さらにプッシュ通知と絡める場合は、スマートフォンやタブレットデバイスから位置情報をポストしてもらいます。例えばチェックインといった機能と組み合わせるのが良さそうです。以下は iOS での実装例です。

- (IBAction)SaveExample1:(id)sender {
    NSString *areaName = @"新宿駅";
    
    //geoPointの生成
    double latitude = 35.690921;
    double longitude = 139.700258;
    NCMBGeoPoint *geoPoint = [NCMBGeoPoint geoPointWithLatitude:latitude longitude:longitude];
    
    //geoPointの保存
    NCMBObject *obj = [NCMBObject objectWithClassName:@"Places"];
    [obj setObject:geoPoint forKey:@"point"];
    [obj setObject:areaName forKey:@"areaName"];
    [obj saveInBackgroundWithBlock:^(BOOL succeeded , NSError *error){
       if (!error) {
           //成功後の処理
       }
       else {
           //エラー処理
       }       
    }];
}

位置情報とユーザID、ユーザIDとデバイストークンが紐づけられれば、位置情報からデバイストークンを絞り込めるようになります。

店舗にチェックインしたことのあるユーザや、あるポイント(新宿駅など)から指定範囲でチェックインしたユーザにだけプッシュ通知を送信するといったこともできるでしょう。


位置情報はスマートフォンから最も手軽に利用できる入力代替機能と言えます。入力補完に使ったり、検索に使ったりと様々な利用法が考えられます。ぜひニフティクラウド mobile backendとともにご活用ください!

f:id:mbaasblog:20180927104348p:plain