読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

iPhoneでカレログを作ろう その1 位置情報の取得

 話題沸騰のAndroidアプリ、カレログ。初期に打ち出したコンセプトは確かにアレですが、彼氏の監視という利用方法から離れれば色々面白い製品になるのではないでしょうか?例えばモバイルデバイス管理(MDM)の製品は、似たような機能が搭載されています。例えば運送会社等で車に設置して、リアルタイムにどこに走っているかを一元管理して配車の最適化等でも使えるのではないかなと思います。
 ということで、技術的な検証の為にiPhoneでも似たような機能を作ってみようと思います。カレログの機能の構成要素としては、次の4点があります。(あとはサーバとの連携機能。)一部iOSでは許可されていないものもありそうですが、Appleのサンプルプログラムを元に順番に機能を実装していこうと思います。
・位置情報
・バッテリー残量の把握
・通信履歴の取得
・インストールされているアプリの一覧


 まずは、位置情報の取得からです。
サンプルコードを元に必要な機能を組み立てていきましょう。
Apple Developer Sample Code


 ざっと見て、LocateMeとLocationsが関係しそうです。
LocateMe
Locations
LocateMeはその名の通り、位置情報を使うアプリのサンプルコードです。Locationsは、位置情報をCoreData(DB)に格納してUITableViewで操作するサンプルコードです。2つのコードをみていると、CoreLocationフレームワークをインポートしてCLLocationManagerDelegateをデリゲートすることが解ります。ということで、まず位置情報を取得するところまで作ってみましょう。


 アプリ名は何でも良いですが、仮にDareTokuで作りました。
アプリのひな形は画面遷移等もシンプルなので、View-based Applicationでよいでしょう。
プロジェクトを作成したら、CoreLocation.frameworkを追加してください。
追加後に対象ソースにインポートして、CLLocationManagerを宣言しDelegateの設定も行います。

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>


@interface DareTokuViewController : UIViewController<CLLocationManagerDelegate> {
    CLLocationManager *locationManager;
}
@property (nonatomic, retain) CLLocationManager *locationManager;

@end


 CLLocationManagerの主なプロパティには測位の精度と取得間隔(時間ではなく、距離)があります。精度の要求を高くする程、バッテリーの減りも早いようです。メソッドとしては、GPSとコンパスの使用可否を判断するものと、開始・停止があります。今回はコンパスは関係ないので、GPSのスタートストップであるstartUpdatingLocation,stopUpdatingLocationを使います。またデリゲートメソッドとして、didUpdateToLocationというGPSから値を取得した時に発生するイベントがあります。このあたりを使えば、位置情報取得の一通りの機能が作れます。詳しくはiOS Developer Libraryで確認ください。
CLLocationManager Class Reference
CLLocationManagerDelegate Protocol Reference

#import "DareTokuViewController.h"

@implementation DareTokuViewController

@synthesize locationManager;
@synthesize startButton;
@synthesize stopButton;
@synthesize latitude;
@synthesize longitude;

...

#pragma mark -
#pragma mark Location manager

//Location Manager 設定
- (CLLocationManager *)locationManager {
	
    if (locationManager != nil) {
		return locationManager;
	}
	
	locationManager = [[CLLocationManager alloc] init];
	[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
	[locationManager setDelegate:self];
	
	return locationManager;
}


//位置情報取得
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    NSLog(@"didUpdateToLocation");
    CLLocationCoordinate2D coordinate = [newLocation coordinate];
    self.latitude.text = [[NSNumber numberWithDouble:coordinate.latitude] stringValue];
    self.longitude.text = [[NSNumber numberWithDouble:coordinate.longitude] stringValue];
    
}

//位置情報取得失敗
- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
    NSLog(@"can't get location");
}

#pragma mark -
#pragma mark Buttion Action
- (IBAction) startButtonTapped {
    [[self locationManager] startUpdatingLocation];
}
- (IBAction) stopButtonTapped {
    [[self locationManager] stopUpdatingLocation];
}

@end


 アプリを起動してStartボタンを押すと無事に位置情報の取得が出来ました。
こんな感じで一つづつ機能を実装していこうかと思います。またある程度までいったら、
どこかにソースを全部公開しようと思います。


 次回は取得したデータをローカルのDBに保存しようと思います。
enjoy!!


目次
iPhoneでカレログを作ろう その1 位置情報の取得
iPhoneでカレログを作ろう その2 DBへのデータ格納
iPhoneでカレログを作ろう その3 地図の表示


iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩
赤松 正行
秀和システム
売り上げランキング: 13153