#それはiOS11対応で起こった。
MapKitを利用して、以下のサンプルの様に緯度経度から住所を取得した時に、iOS10と11ではCLPlaceMarkで取得できる情報に差異があることを発見しました。
let geocoder = CLGeocoder()
// 東京タワー(東京都港区芝公園4丁目2番8号)のlocationを作る
let location = CLLocation(latitude: 35.658581, longitude: 139.745433)
// 経度、緯度から逆ジオコーディングして住所を取得する
geocoder.reverseGeocodeLocation(location) { (placeMarkArray, error) in
let placemark = placeMarkArray?.first
//ここでCLPlaceMarkから住所情報を取得可能
}
#iOS10までの場合
プロパティ | 中の値 |
---|---|
name | 芝公園4丁目2番8号 |
isoCountryCode | JP |
contry | 日本 |
postalCode | 105-0011 |
administrativeArea | 東京都 |
subAdministrativeArea | nil |
locality | 港区 |
subLocality | 芝公園 |
thoroughfare | 芝公園4丁目 |
subThoroughfare | 2番8号 |
#iOS11の場合
プロパティ | 中の値 |
---|---|
name | 〒105-0011 |
isoCountryCode | JP |
country | 日本 |
postalCode | 105-0011 |
administrativeArea | 東京都 |
subAdministrativeArea | nil |
locality | 港区 |
subLocality | 芝公園 |
thoroughfare | 芝公園4丁目 |
subThoroughfare | 2番8号 |
察しの良い方ならお気付きだと思いますが 、 name から返ってくる値が今までと全然違います。
iOS10までだとthroughfareとsubThoroughfareを合体させた文字列を取得できたのですが、iOS11から記号付きの郵便番号を取得にするようになっています。
ちなみに、Documentのnameプロパティの欄には、以下のように書かれているので、iOS11でどういう理由で変わったのか謎ですね。
##修正方法
もしiOS10以前で、nameプロパティから情報を取得している場合は、iOS11以降でも使えるように、thoroughfareとsubThoroughfareを組み合わせた文字列に変更する必要があるでしょう。
#海外の住所でもやってみた
//ホワイトハウス(ワシントンD.C.ペンシルベニア大通り1600)
let location = CLLocation(latitude: 38.897667, longitude: -77.036611)
プロパティ | 中の値 |
---|---|
name | ホワイトハウス |
isoCountryCode | US |
country | アメリカ合衆国 |
postalCode | 20500 |
administrativeArea | DC |
subAdministrativeArea | nil |
locality | ワシントンD.C. |
subLocality | Washington Mall |
thoroughfare | Pennsylvania Ave NW |
subThoroughfare | 1600 |
何と言うことでしょう。iOS10と11両方とも同じ情報が取得できました。
しかもnameにはthoroughfareとsubThoroughfareの組み合わせた文字列ではなく、ちゃんとホワイトハウスと入っています。
ということは、nameは固有名詞が取得できるということなのでしょうか?
ですが、その場合だと最初の東京タワーの緯度経度を入れた場合は、nameには東京タワーが入っているのでは?という疑問が浮上して、ますます奇妙です。
##フルハウス
仮に、nameには固有名詞入るものとすると、例えば固有名詞のない民家の緯度経度を入力するとどうなるのでしょうか。
ですが、勝手に民家の緯度経度を入れてここに書くことはできないので、ドラマ「フルハウス」のモデルになった民家の緯度経度を入力してみましょう。
// フルハウスのタナー家のモデルとなった民家(1709 Broderick St, San Francisco, California)のlocation
let location = CLLocation(latitude: 37.786334, longitude: -122.441976)
プロパティ | 中の値 |
---|---|
name | 1709 Broderick St |
isoCountryCode | US |
contry | アメリカ合衆国 |
postalCode | 94115 |
administrativeArea | CA |
subAdministrativeArea | サンフランシスコ |
locality | サンフランシスコ |
subLocality | Lower Pacific Heights |
thoroughfare | Broderick St |
subThoroughfare | 1709 |
タナー家もiOS10と11で差異はありませんでした。
ただし、今回の場合は、thoroughfareとsubThoroughfareが組み合わさった文字列がnameからは取得できました。
#結論
・nameプロパティで取得できる情報は、国内、国外でバラバラなので気をつける。
・iOS10までで、日本国内の緯度経度を入れてnameプロパティで住所の一部を取得していた場合は、11以降でも使えるようにthoroughfareとsubThoroughfareを組み合わる
・Netflixではフルハウス全シーズンを観れる上に、オリジナル作品の続編フラーハウスは面白い。