SwiftUI でGoogle Map や　Apple Map　を開く

## はじめに

先日開発したルート案内アプリで、交通手段の選択機能を実装しようとした際の経験を共有させていただきます。
CoreLocationを使用して.transit（公共交通機関）でのルート検索を実装しましたが、到着予定時間（ETA）以外の情報が取得できないことが判明しました。
最終的にGoogle MapsまたはApple Mapsアプリへユーザーを誘導する方法を採用しました。

## 必要なもの
### Info.plist の設定
外部のアプリを開くために、以下の設定が必要です。
1. LSApplicationQueriesSchemes に以下のスキームを追加

```
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>maps</string>
    <string>comgooglemaps</string>
</array>
```

2.URLスキームを使用するための説明文を追加：
```
<key>NSLocationWhenInUseUsageDescription</key>
<string>現在地から目的地までの経路を表示するために位置情報を使用します。</string>
```

## Apple Mapを開く

Apple Mapを開くには、maps://スキームを使用します。以下に基本的なコード例を示します。

saddr : 始点（デフォルトは　ユーザの位置）
daddr : 目的地

指定方法は様々です。

#### 経度、緯度　での指定
[maps://?saddr=&daddr=経度,緯度](maps://?saddr=&daddr=経度,緯度)

#### 住所で指定
[maps://?saddr=Shibuya+Station&daddr=Tokyo+Tower](maps://?saddr=Shibuya+Station&daddr=Tokyo+Tower)

### 1. シンプルな経路案内
```
let latitude = 35.6895
let longitude = 139.6917
if let url = URL(string: "maps://?saddr=&daddr=\(latitude),\(longitude)") {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
```

2. 交通手段を設定する

dirflgパラメータを使用して交通手段を指定できます。

d : 車

w : 徒歩

r : 公共交通機関

例:
```
let url = URL(string: "maps://?saddr=&daddr=35.6895,139.6917&dirflg=r")
```
このコードは公共交通機関を利用した経路を表示します。

3. その他のオプション

avoids : 有料道路や高速道路を避ける

t : 標準地図

k : 衛星地図

h : ハイブリッド地図

例:
```
let url = URL(string: "maps://?saddr=&daddr=35.6895,139.6917&dirflg=d&avoids=t,h")
```
## Google Mapを開く

Google Mapを開くには、[https://www.google.com/maps/](https://www.google.com/maps/)スキームを使用します。



## 目的地の指定方法
#### 経度、緯度　での指定方法
[https://www.google.com/maps/dir/?api=1&origin=&destination=35.6895,139.6917](https://www.google.com/maps/dir/?api=1&origin=&destination=35.6895,139.6917)

#### 住所での指定方法
[https://www.google.com/maps/dir/?api=1&origin=Tokyo+Station&destination=Kyoto+Station](https://www.google.com/maps/dir/?api=1&origin=Tokyo+Station&destination=Kyoto+Station)

### 1. 基本的な経路案内
```
let url = URL(string: "https://www.google.com/maps/dir/?api=1&origin=Tokyo+Station&destination=Kyoto+Station")
if let url = url {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
```

### 2. 交通手段を設定する

travelmodeパラメータを使って交通手段を指定します。

driving : 車

walking : 徒歩

bicycling : 自転車

transit : 公共交通機関

例:
```
let url = URL(string: "https://www.google.com/maps/dir/?api=1&origin=Tokyo+Station&destination=Kyoto+Station&travelmode=transit")
```
### 3 . 中間地点を設定する

waypointsパラメータで中間地点を指定できます。複数の地点は|で区切ります。

例:
```
let url = URL(string: "https://www.google.com/maps/dir/?api=1&origin=Tokyo+Station&destination=Kyoto+Station&waypoints=Nagoya+Station|Osaka+Station")
```
### 4 . その他のオプション

avoid : 有料道路、高速道路、フェリーを避ける

q : 検索クエリ

zoom : ズームレベル

例:
```
let url = URL(string: "https://www.google.com/maps/search/?api=1&query=ramen+near+Shibuya")
```
## 実際にURLを開く方法

URLを開くには、UIApplication.shared.openを使用します。

例:
```
if let url = URL(string: "https://www.google.com/maps/dir/?api=1&origin=Tokyo&destination=Kyoto"), UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
```
## まとめ

この記事では、SwiftUIを使ってGoogle MapとApple Mapを開く方法を紹介しました。交通手段や中間地点、検索機能など、用途に応じてパラメータを調整してみてください。

参考リンク
[Apple Developer Documentation - Map Links](https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html)
[iOS 向け Google マップ URL スキーム](https://developers.google.com/maps/documentation/urls/ios-urlscheme?hl=ja)