iOS17からLook Aroundの場所移動ができない不具合が解消された

# はじめに
少し前に、iOS16の新機能で紹介された`Look Around`をアプリに導入する機会がありました。
表題の通り、場所移動をする昨日に不具合があったのですが、それが`iOS17`になって解消されました。

同じように、開発しているアプリをiOS16対応していてうまくいかなくておかしいなぁと苦悩している方がいらっしゃったら何かの助けになるかもしれないと思い、今回記事にしています。

# Look Aroundとは
端的に言えばApple版の`Google Street View`のようなものです。
その名の通り、ある地点の周りを見渡して様子を把握することができる機能です。

Google Street Viewは料金コストがかかるのに対し、Look Aroundは**Apple標準の機能**でかつ**無料**で利用ができるので、これからLook Aroundをアプリに導入しようと考える人たちも増えてくるのではないでしょうか。

しかしまだ日本では、`政令指定都市+@`くらいの場所のみのサポートとなるので全国のサポートを想定している場合は注意が必要です。

# 作りたかったもの

とある導線をタップしたら、そこからフルモーダルでLook Aroundを表示させる

というシンプルな構成のものです。

ひとまず最速でLook Aroundを表示させたい！ので、下記GIFのようにボタンをタップしたらフルモーダルでLookAroundを表示させるような作りを想定します。

Look Aroundを表示後、適当な道をタップするとタップした場所まで移動して表示することができます。

<img width="350" alt="lookaround_sample.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550560/cc61d776-c362-12e6-bd62-4644b73bf087.gif">

## 実装


まずは`MKLookAroundViewController`を継承したカスタムの`LookAroundViewController`を作成します。
このクラスではただLookAroundViewControllerそのものを構築している処理だけを宣言します。

Storyboardとも紐付けますが、作成してクラスを指定するだけなのでそこは省略しています。

```swift:LookAroundViewController.swift
import UIKit
import MapKit

class LookAroundViewController: MKLookAroundViewController {

    static func instantiate() -> LookAroundViewController {
        let storyboard = UIStoryboard(name: "LookAroundViewController", bundle: .main)

        guard let viewController = storyboard.instantiateInitialViewController() as? LookAroundViewController else {
            fatalError("Not Implemented")
        }
        return viewController
    }
}

```

GIFで紹介した、ボタンをタップしてLook Around画面に遷移するだけの`ViewController`を作成します。
`getScene`でLook Aroundを表示するための`MKLookAroundScene`の値を取得します。
今回は試しに新宿の適当な場所のsceneを指定しています。

そのsceneが取得できたら`LookAroundViewController`の`scene`に代入して遷移するようにしています。

Look Aroundを表示するためには位置情報の取得が必要だった（はず）なので、位置情報の許可周りの設定も併せてしてあげましょう。（今回は省略させていただきます🙇）

```swift:ViewController.swift
import UIKit
import MapKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CLLocationManagerを使った位置情報の許可周りの設定とかも忘れずに
        // 参考になりそう： https://qiita.com/b150005/items/8b29d89bdc3f69a07bd3
    }

    @IBAction func didTapNextButton(_ sender: Any) {
        Task {
            guard let scene = await getScene() else {
                return
            }

            //　LookAround画面を表示 
            let vc = LookAroundViewController.instantiate()
            vc.scene = scene
            present(vc, animated: true)
        }
    }

    func getScene() async -> MKLookAroundScene? {
        // e.g. Shinjuku in Tokyo
        let coordinate = CLLocationCoordinate2D(latitude: 35.692093, longitude: 139.704854)
        let sceneRequest = MKLookAroundSceneRequest(coordinate: coordinate)

        do {
            return try await sceneRequest.scene
        } catch {
            return nil
        }
    }
}
```
# iOS16では動かない
作成したコードをもとにiOS16端末でアプリを動かしてみると、Look Around内で適当な道をタップしても場所移動ができませんでした。
ドキュメントも読み漁ったところ、どうやら`isNavigationEnabled`というプロパティが、この場所移動（= ナビゲーション）を司っていそうと推測しました。

そこで下記のように値を指定してみましたが、これでも結果は変わらない...😢

```swift:ViewController.swift（一部抜粋）
  //　LookAround画面を表示 
  let vc = LookAroundViewController.instantiate()
  vc.scene = scene

  vc.isNavigationEnabled = true // 強制的にtrueにしてみる
  present(vc, animated: true)
```

falseにしてみたり他のプロパティも見てみましたが、解決はせず。。

※ちなみに[海外の記事](https://medium.com/@acakiralar/swift-ui-lookaroundmapview-streetview-574a062f1045)ですが、これを元に実装してみたら、地図上にLook Aroundのビューを表示してそれをタップしてからであれば場所移動は実現されました。カスタムのLook AroundのViewControllerを使おうとする場合は対応できないみたいです。

# 解決
どうしようか悩んでいましたが、iOS17にアップデートしたら解消されました🎉
実際に[公式のforum](https://developer.apple.com/forums/thread/713263)でもやりとりがされていましたね。

OS側の不具合のようなので大人しくアップデートして浸透していくのを待つのが良さそうです。

# 参照

1. [iOSとiPadOSで利用できる機能](https://www.apple.com/jp/ios/feature-availability/#maps-look-around)
1. [isNavigationEnabled](https://developer.apple.com/documentation/mapkit/mklookaroundviewcontroller/3951142-isnavigationenabled)
1. [MapKit - Look Around - isNavigationEnabled not working?](https://developer.apple.com/forums/thread/713263)
1. [iOS16 MapKitの新機能 : 地図から場所を選ぶ、通りを見回す](https://qiita.com/mashunzhe/items/693e6302876707d5684d)
1. [Swift UI — LookAroundMapView ( StreetView ) ](https://medium.com/@acakiralar/swift-ui-lookaroundmapview-streetview-574a062f1045)