はじめに
少し前に、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を表示後、適当な道をタップするとタップした場所まで移動して表示することができます。
実装
まずはMKLookAroundViewController
を継承したカスタムのLookAroundViewController
を作成します。
このクラスではただLookAroundViewControllerそのものを構築している処理だけを宣言します。
Storyboardとも紐付けますが、作成してクラスを指定するだけなのでそこは省略しています。
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を表示するためには位置情報の取得が必要だった(はず)なので、位置情報の許可周りの設定も併せてしてあげましょう。(今回は省略させていただきます🙇)
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
というプロパティが、この場所移動(= ナビゲーション)を司っていそうと推測しました。
そこで下記のように値を指定してみましたが、これでも結果は変わらない...😢
// 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側の不具合のようなので大人しくアップデートして浸透していくのを待つのが良さそうです。