しょぼしょぼプログラマ雑記

自分のための備忘録。 開発記録など掲載してます。 質問・ご意見・ご感想等はTwitter ( https://twitter.com/yun_hokuto ) までお気軽にどうぞ。

ジオフェンスのデリゲートメソッドについて

iOSには ジオフェンス というものがあります

これは「特定の範囲内へのIN/OUT」を検出するものです

●特定範囲へのINメソッド

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region

●特定範囲へのOUTメソッド

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region

●特定範囲へのIN/OUT検出失敗

-(void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error

この時、どれにも共通する「LocationManager」と「Region」は何を示しているんでしょうか?

というわけで調査してみました

結果は下記の通りです

managerデバイスの現在位置
region特定範囲情報

デバイスのGPSOSに依存したタイミングでアプリに通知される ため

範囲内に入ってしばらくしてから通知されることもあります

そのため デバイスの現在位置 ≠ 特定範囲の限界位置 ということです
( 特定範囲へ入った場合:デバイスの現在位置 ≦ 指定座標+範囲(m) )

デバイスの現在位置の取得

デバイスの現在位置は下記のように取得できます

// Latitude
manager.location.coordinate.latitude
// Longitude
manager.location.coordinate.longitude

こちらは比較的カンタンに取得できます

指定範囲情報の取得

CLCircularRegion *circularRegion = region.copy;
// Latitude
circularRegion.center.latitude
// Longitude
circularRegion.center.longitude
// Radius
circularRegion.radius

こちらは少々説明をします

CLRegion はiOS7から center や radius の直接取得が非推奨になりました

そのため、CLRegion のサブクラスである CLCircularRegion クラスとして取得することで座標や半径を取得できます

●参考サイト
Deprecated CLRegion methods - how to get radius? - acnenomor.com

参考になったかな?