位置情報取得のライブラリ LKLocationManager

2014年1月28日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

作った。というか古いコードをCocoaPodsで使えるようにまとめた。


使い方は最初に通知を設定
[NSNotificationCenter.defaultCenter addObserver:self
                                       selector:@selector(_updatedLocation:)
                                           name:LKLocationManagerDidUpdateLocationNotification
                                         object:nil];

[NSNotificationCenter.defaultCenter addObserver:self
                                       selector:@selector(_finishedLocation:)
                                           name:LKLocationManagerDidFinishLocationNotification
                                         object:nil];

ハンドラを書いて
- (void)_updatedLocation:(NSNotification*)notification
{
  LKLocationManager* manager = notification.object;
  CLLocation* location = manager.location;
    :
}

- (void)_finishedLocation:(NSNotification*)notification
{
  LKLocationManager* manager = notification.object;
  CLLocation* location = manager.location;
    :
}

位置取得をスタート
[LKLocationManager.sharedManager startUpdate];

十分な精度になるか一定時間が過ぎたら自動的に止まる(詳細はコードを見て!)。
更新→ LKLocationManagerDidUpdateLocationNotification
更新→ LKLocationManagerDidUpdateLocationNotification
 :
精度条件を満たした or タイムアウト
→ LKLocationManagerDidUpdateLocationNotification(最後のコール)
→ LKLocationManagerDidFinishLocationNotification
途中の状態は statusプロパティで取得できる。
typedef NS_ENUM(NSInteger, LKLocationManagerStatus) {
    LKLocationManagerStatusIdle = 0,
    LKLocationManagerStatusLocationUpdating,
    LKLocationManagerStatusLocationUpdated,
    LKLocationManagerStatusLocationCanceled,
    LKLocationManagerStatusLocationFailed
};
stopUpdateを使えば自分で止める事もできるが、最近の機種は精度の高い位置情報を取得するのに時間がかからなくなっているのであまり使う場面は無いと思われる(場所にもよるが)。


別クラスで位置情報から地名を取得する(Reverse Geocoding)クラスも同梱している。
[LKReverseGeocoder reverseGeocodeLocation:manager.location
                        completionHandler:^(NSArray *placemarks,
                                          NSString *addressString,
                                          NSDictionary *addressDictionary,
                                          NSError *error) {
                            self.place.text = addressString;
                              :
                        }];

addressString は AddressBookUI フレームワークを使ってローカライズされた住所を返す。
こんな感じ
東京都千代田区丸の内1丁目9番地1

addressDictionary はこう
{
    City = "San Francisco";
    Country = "United States";
    CountryCode = US;
    FormattedAddressLines =     (
        "Apple Store, San Francisco",
        "1800 Ellis St",
        "San Francisco, CA  94115-4004",
        "United States"
    );
    Name = "Apple Store, San Francisco";
    PostCodeExtension = 4004;
    State = CA;
    Street = "1800 Ellis St";
    SubAdministrativeArea = "San Francisco";
    SubLocality = "Union Square";
    SubThoroughfare = 1800;
    Thoroughfare = "Ellis St";
    ZIP = 94115;
}
FormattedAddressLines からも住所をが得られる(ただこちらは国まで入っている)。


Responses

Leave a Response

人気の投稿(過去 30日間)