4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

少し前に、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を表示後、適当な道をタップするとタップした場所まで移動して表示することができます。

lookaround_sample.gif

実装

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

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

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が取得できたらLookAroundViewControllersceneに代入して遷移するようにしています。

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

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というプロパティが、この場所移動(= ナビゲーション)を司っていそうと推測しました。

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

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

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

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

※ちなみに海外の記事ですが、これを元に実装してみたら、地図上にLook Aroundのビューを表示してそれをタップしてからであれば場所移動は実現されました。カスタムのLook AroundのViewControllerを使おうとする場合は対応できないみたいです。

解決

どうしようか悩んでいましたが、iOS17にアップデートしたら解消されました🎉
実際に公式のforumでもやりとりがされていましたね。

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

参照

  1. iOSとiPadOSで利用できる機能
  2. isNavigationEnabled
  3. MapKit - Look Around - isNavigationEnabled not working?
  4. iOS16 MapKitの新機能 : 地図から場所を選ぶ、通りを見回す
  5. Swift UI — LookAroundMapView ( StreetView )
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?