iPhone
iOS
Swift

iOS11でCLPlaceMarkのnameで取れる値が変わったと思って検証したら、奇妙なプロパティであることがわかった

それは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でどういう理由で変わったのか謎ですね。
スクリーンショット 2017-10-05 21.12.39.png

修正方法

もしiOS10以前で、nameプロパティから情報を取得している場合は、iOS11以降でも使えるように、thoroughfareとsubThoroughfareを組み合わせた文字列に変更する必要があるでしょう。

海外の住所でもやってみた

ホワイトハウス

whitehouse.jpg

ホワイトハウス
//ホワイトハウス(ワシントン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には固有名詞入るものとすると、例えば固有名詞のない民家の緯度経度を入力するとどうなるのでしょうか。
ですが、勝手に民家の緯度経度を入れてここに書くことはできないので、ドラマ「フルハウス」のモデルになった民家の緯度経度を入力してみましょう。
fullhouse.jpeg

タナー家
// フルハウスのタナー家のモデルとなった民家(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ではフルハウス全シーズンを観れる上に、オリジナル作品の続編フラーハウスは面白い。