koogawa blog

iOS、Android、foursquareに関する話題

近隣のべニューをリスト表示するiPhoneアプリを作ってみよう(後編)


前回はfoursquare API

v2/venues/search

API を使い、近隣のべニューリストを表示するアプリを作ってみました。

近隣のべニューをリスト表示するiPhoneアプリを作ってみよう(前編) - koogawa blog

ただ、このままでは毎回同じ場所のべニューリストが表示されるだけなので、今回はGPSを使い、今いる場所付近のリストを取得してみます。

CoreLocation.Frameworkの追加

まずは、必要なFrameworkを追加します。
GPSによる位置情報の取得には、CoreLocation.Frameworkを使います。

ソースツリーの一番上にある青いプロジェクトアイコンをクリックし、プロジェクトエディタを開きます。

左カラムの「TARGETS」から「VenueList」を選択し、右上に表示されるタブの中から「Build Phases」を選択します。その中にある「Link Binary With Libraries」の▷ボタンをクリックします。

+ボタンをクリックし、リスト中から「CoreLocation.framework」を選択して「Add」ボタンをクリックします。


CoreLocationインポート

次に VenueListTableViewController.h を開き、先ほど追加したCoreLocationをインポートします。

#import <CoreLocation/CoreLocation.h>

CLLocationManagerクラスは、位置情報が取得できた際に様々なデリゲートを送信します。
このデリゲートを受け取るために、CLLocationManagerDelegateプロトコルを採用しておきます。

また、CLLocationManagerクラス用のインスタンス変数も用意しておきます。

@interface VenueListTableViewController : UITableViewController <CLLocationManagerDelegate>
{
    NSMutableArray      *venues_;
    CLLocationManager     *locationManager_;
}

@end

これでGPSから位置情報を取得する準備が整いました。

位置取得

では、実際に位置情報を取得するコードを書いていきます。

VenueListTableViewController.m を開き、viewDidLoadに次のコードを追記します。

locationManager_ = [[CLLocationManager alloc] init];
[locationManager_ setDelegate:self];
[locationManager_ startUpdatingLocation];

1行目と2行目では、CLLocationManagerオブジェクトを生成し、デリゲートの受け取り先を自分に設定しています。
3行目のstartUpdatingLocationで位置情報の取得を開始します。このタイミングで、ユーザ側には位置情報の利用を求めるアラートが表示されます。

CLLocationManagerは、位置情報が取得できると

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

メソッドを呼び出します。(位置情報が更新される度に何度でも呼ばれます)
引数newLocationには新しく取れた位置情報(緯度・経度等)が格納されています。

このメソッド内で次のように緯度と経度を取り出し、foursquare APIへのリクエストURLを作成します。

CLLocationDegrees latitude = newLocation.coordinate.latitude; // 緯度
CLLocationDegrees longitude = newLocation.coordinate.longitude; // 経度

緯度と経度は"ll"パラメータに指定します。

NSString *urlString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?ll=%f,%f&limit=20&client_id=(あなたのCLIENT_ID)&client_secret=(あなたのCLIENT_SECRET)&v=20111111", latitude, longitude];

この後にfoursquare APIへリクエストを送信する処理を書いていきます。
内容は前回のviewDidLoad内に記述したコードと全く一緒なので、説明は省略します。

NSURL *url = [NSURL URLWithString:urlString];
NSString *response = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *jsonData = [response dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
   
// エラーコードをログに出力
NSInteger errorCode = [[[jsonDic objectForKey:@"meta"] objectForKey:@"code"] intValue];
NSLog(@"errorCode = %d", errorCode);
 
// 結果取得
NSArray *venues = [[jsonDic objectForKey:@"response"] objectForKey:@"venues"];
venues_ = [venues mutableCopy];
   
[self.tableView reloadData];

ここで、アプリをビルドして実行してみましょう。

起動すると、位置情報の使用許可を求められるので「OK」ボタンをタップします。

シミュレーターで実行している場合、このままでは位置情報が取得できないので、Xcodeの下の方にある三角ボタンを押します。

すると、いろんな地名がリストに表示されるので、シミュレートしたい場所を選びます。試しにLondonを選んでみます。

こんな結果が表示されれば成功です。位置情報が更新される度にベニューリストが更新されると思います。

このように、シミュレーターだとあらかじめ決められた場所しか選べないので、実機にアプリを転送できる方は実際に実機で試してみる事をお勧めします。

まとめ

今回はGPSの情報を元に、近隣のベニューリストをひたすら表示し続けるアプリを作成しました。

前半と後半の内容で、位置情報の取得・リクエストの送信・レスポンスの解析・画面表示の流れを大体理解できたと思います。

このアプリを元に、foursquare APIを利用した面白いアプリをぜひ作ってみてください!

なお、今回作成したアプリのソースはこちらにアップしております。
https://github.com/koogawa/VenueListGPS