現在位置を測定し、通知

Last-modified: 2012-08-14 (火) 23:17:33

Over View

  • CLLocationManagerが位置情報の測定を管理する.
  • CLLocationManagerは位置情報の測定処理に専念し、ほかのイベントとは独立して動作する.
  • CLLocationManagerは処理結果を通知する.通知を受けるインスタンスをデリゲートという.
  • デリゲートはプロトコルメソッド(受信するためのルール)を通じて通知結果を受信する.
  • CLLocationManagerDelegateにあるプロトコルメソッドを実装する.

 [LocationMgr]        [Delegate]
CLLocationManager ← Contlloer(MyAppDelegate)
   ↓     インスタンスの作成
  測定       → プロトコルメソッドで受信
         測定結果通知

  1. CLLocationManagerのインスタンスを作成
  2. デリゲート(CLLocationManagerの測定結果を受信する印タンス)を決定
  3. 測定時の振る舞いをセット
  4. 測定開始を指示
  5. プロトコルメソッドで測定結果を受信
  6. デリゲートを解除し,CLLocationManagerを解放する

Sample Code

  • MyAppDelegate.h

#import <UIKit/UIKit.h>

#import <CoreLocation/CoreLocation.h>

@interface MyAppDelegate : NSObject <UIApplicationDelegate,CLLocationManagerDelegate>

{

  CLLocationManager *locationManager;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

  • MyAppDelegate.m

- (BOOL)application:(UIApplication *)application

  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

 // CLLocationManagerのインスタンス作成

 locationManager = [[CLLocationManager alloc] init];

 // CLLocationManagerのデリゲートを指定.ここでは,このクラスのインスタンスで

 // 結果を受けるので,このクラスのインスタンスを指定

 if ([locationManager locationServecesEnable]) {

  [locationManager setDelegate:self];

  // デバイスがどの程度動いたら,測定しなおすか? ここでは極力細かく測定しなおす.

   [locationManager setDistanceFilter:kCLDistanceFilterNone];

  // 測定精度を設定.ここでは可能な限り高精度で

  [locationManager setDesireAccuracy:kCLLocationAccuracyBest];

  [locationManager startUpdatingLocation];

 }

 [[self window] makeKeyAndVisible];

 return YES;

}

// CLLocationManagerは測位を終了すると,

// locationManager:didUpdateToLocation:FromLocaion:を送信する.

// 測位情報を受信するインスタンスにこのプロトコルメソッドを受信することで

// 測位結果を受信できる

- (void)locationManager:(CLLocationManager *)manager

 didUpdateToLocation:(CLLocation *)newLocation

     fromLocation:(CLLocation *)oldLocation

{

 NSLog(@"%@", newLocation);

}

// CLLocationManagerは測位に失敗したときに

// locationManager:didFailWithErrorを送信する.

// エラー情報を受信するためにこのプロトコルメソッドを受信する

- (void)locationManager:(CLLocationManager *)manager

 didFailWithError:(NSError *)error

{

 NSLog(@"%@", error);

}

// deallocメソッドでデリゲートを解除し,CLLocationManagerを解放

- (void)dealloc

{

 if ([locationManager delegate] == self)

   [locationManager setDelegate:nil]; // デリゲートを解除

 [locationManager release]; // CLLocationManagerを解放

 [window release];

 [super dealloc];

}