Swift CLLocationManagerを使って現在の住所を取得してみる
地図の緯度軽度はとれたので、現在の住所を取得した時の作業ログ。てっきりGoogleのGeo APIなんかをつかうのかと思っていましたが、Xcode上の機能だけで完結できる、難易度は高くない。
前回の続きから、 onga-tec.hatenadiary.jp
今回つくったのは、地図上のボタンを押すと現在地をAlertで表示する動作。英語で情報が帰ってきているがこの部分は端末の環境設定によるらしいがまだ日本語で試せていない。。
CLLocationManagerの情報を利用して以下のように取得する。
func getGeoLocation(manager: CLLocationManager){ CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in if error != nil { print(error!.localizedDescription) return } if placemarks!.count > 0 { let placemark = placemarks![0] as CLPlacemark let address = self.displayLocationInfo(placemark) let alert = UIAlertView() alert.title = "Address" alert.message = address alert.addButtonWithTitle("OK") alert.show() } else { print("error") } }) }
Appleの本社の住所を取得した場合は以下のような情報が帰ってくる。
<GEOMapItemStorage: 0x7fd278f34030> { placeData = { component = ( { "cache_control" = UNCACHEABLE; status = "STATUS_FAILED"; type = "COMPONENT_TYPE_TRANSIT_INFO"; }, { "cache_control" = UNCACHEABLE; status = "STATUS_FAILED"; type = "COMPONENT_TYPE_TRANSIT_SCHEDULE"; }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_TRANSIT_ATTRIBUTION"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_TRANSIT_INCIDENT"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_HOURS"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_RATING"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_TEXT_BLOCK"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_FACTOID"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_FLYOVER"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_BOUNDS"; value = ( { bounds = { "map_region" = { eastLng = "-122.0278321"; northLat = "37.3339991"; southLat = "37.3302951"; westLng = "-122.0347314"; }; }; } ); "values_available" = 1; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_ROAD_ACCESS_INFO"; value = ( { "access_info" = { "road_access_point" = ( { drivingDirection = "ENTRY_EXIT"; location = { lat = "37.3315903"; lng = "-122.0306826"; }; } ); }; } ); "values_available" = 1; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_PLACE_INFO"; value = ( { "place_info" = { center = { lat = "37.3318633"; lng = "-122.0295238"; }; timezone = { identifier = "America/Los_Angeles"; }; }; } ); "values_available" = 1; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_ENTITY"; value = ( { entity = { name = ( { locale = "en-US"; "string_value" = "Apple Inc."; } ); type = AOI; }; } ); "values_available" = 1; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_ADDRESS"; value = ( { address = { "known_accuracy" = PARCEL; "localized_address" = ( { address = { formattedAddressLine = ( "Apple Inc.", "1 Infinite Loop", "Cupertino, CA 95014", "United States" ); structuredAddress = { administrativeArea = California; administrativeAreaCode = CA; areaOfInterest = ( "Apple Inc." ); country = "United States"; countryCode = US; fullThoroughfare = "1 Infinite Loop"; geoId = ( ); locality = Cupertino; postCode = 95014; subAdministrativeArea = "Santa Clara"; subThoroughfare = 1; thoroughfare = "Infinite Loop"; }; }; language = "en-US"; } ); }; } ); "values_available" = 1; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_AMENITIES"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_STYLE_ATTRIBUTES"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); }, { "cache_control" = CACHEABLE; "start_index" = 0; status = "STATUS_SUCCESS"; ttl = 43200; type = "COMPONENT_TYPE_RESULT_SNIPPET"; "values_available" = 0; version = 10; "version_domain" = ( apple, revgeo, US ); } ); referenceFrame = WGS84; "result_provider_id" = 7618; status = "STATUS_SUCCESS"; }; }
今回作成したサンプル。 gist.github.com
気になったのは住所を取得した時、たまに以下のエラーが発生する。連続で動作させた場合に発生率が高まるような気がします。
Reverse geocoder failed with errorThe operation couldn’t be completed. (kCLErrorDomain error 2.)
ここにもそのような事が書いてある。連続でのリクエストでエラーが発生するのはApple側の仕様なのだろうか、? stackoverflow.com