[iOS] swift4対応　地図アプリをアプリ上から起動する

#はじめに
swiftでiOSアプリ上から地図アプリを起動する方法をまとめました。
基本はgoogleマップを起動を試み、インストールされていない場合はiOS標準のマップを起動するようにします。

参考になる記事は多くありますが、googlemapとiOS標準のマップ両方に対応する最新版の情報がなかったため、この記事を書きました。

参考にしたのは主にこの２つの記事です。
[iOSアプリで外部マップアプリ（標準・google map）を起動する](https://qiita.com/h_shiba/items/e62fda14844b0ceb4540)
[Google Mapsを起動する(Swift)](http://www.office-matsunaga.biz/ios/description.php?id=52)

※動作環境:`xcode9.4.1`, `swift4.1`

#コード

```swift
let latitude = "35.692096424393867"
let longitude = "139.77235727788792"
let urlString: String!
if UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!) {
    urlString = "comgooglemaps://?daddr=\(latitude),\(longitude)&directionsmode=walking&zoom=14"
    }
else {
    urlString = "http://maps.apple.com/?daddr=\(latitude),\(longitude)&dirflg=w"
    }
if let url = URL(string: urlString) {
    UIApplication.shared.open(url)
    }
```
```swift
UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!)
```
でgoogleマップが開けるかを確認し、それによってurlスキームを切り替えます。
#urlスキームの登録
なお,使用するurlスキームはinfo.plistの`LSApplicationQueriesSchemes`に登録しておく必要があります。
<img width="909" alt="スクリーンショット 2018-10-26 1.09.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/268579/41dd38dd-3313-3ee2-ffcf-e670a6d11a73.png">
`LSApplicationQueriesSchemes`キーは自分で新たにinfo.plistに追加します。
＋ボタンを押して新たなキーを追加し、そこに直接`LSApplicationQueriesSchemes`と入力してください。
<img width="567" alt="スクリーンショット 2018-10-26 1.12.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/268579/0b3b7bb3-3adb-c0ad-c5f0-d3e55aa2ee24.png">
追加できたら、タイプをArrayに変更します。
<img width="532" alt="スクリーンショット 2018-10-26 1.12.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/268579/813a910d-5555-2e94-d9a6-25bf07bc3520.png">
キー名の左の▶︎をクリックして▼にしてから、＋を押してキーを追加。
そこのバリューに`comgooglemaps`と入力すればOKです。
<img width="658" alt="スクリーンショット 2018-10-26 1.17.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/268579/f086133b-515e-9f40-b54c-574826e1e73a.png">

#urlスキームのパラメータをいじって地図を使いこなす
##googleマップの場合
####基本的なパラメータ
```swift
"comgooglemaps://?center=40.765819,-73.975866&views=traffic&mapmpde=standard&zoom=14"
```
のように`comgooglemaps://?`の後に続いてパラメータを書き足すことで、開いた後の地図に対して様々な指定をすることが可能です。

| パラメータ|値|効果|
|:-----------------|:------------------|:------------------|
| center|latitude(緯度),longitude(経度)|指定した緯度経度の位置を中心に表示する。|
|mapmode|`standard` or `streetview`|普通の地図かストリートビューの指定。指定なしなら、直前のアプリの設定が適用される。|
|views|`satellite`, `traffic`, or `transit`|航空写真、交通状況、路線図の指定。`satellite,traffic`と繋げることで複数指定可能|
|zoom|整数値|地図の倍率を指定|

####検索
```swift

"comgooglemaps://?q=Pasta&center=37.759748,-122.427135"
```
とすれば、`center`で指定した地点を中心にパスタ屋を検索できます。

####ルート検索
```swift

"comgooglemaps://?saddr=\(latitude1),\(longitude1)?daddr=\(latitude2),\(longitude2)&directionsmode=driving"
```
とすれば始点と目的地を指定してルート検索できます。

| パラメータ|値|効果|
|:-----------------|:------------------|:------------------|
| saddr|latitude(緯度),longitude(経度)|指定した緯度経度の位置を始点に指定。指定がない場合は現在地が始点となる。|
| daddr|latitude(緯度),longitude(経度)|指定した緯度経度の位置を目的地に指定。|
|directionsmode|`riving`, `transit`, `bicycling` or `walking`|交通手段を指定。|
`saddr`と`daddr`は住所の文字列でも指定できますが、その場合はurlをエンコードする必要があります。
参考→[Google Mapsを起動する(Swift)](http://www.office-matsunaga.biz/ios/description.php?id=52)

さらに詳しくはリファレンスを直接参照してください。
[Google Maps URL Scheme for iOS](https://developers.google.com/maps/documentation/urls/ios-urlscheme?hl=ja)

##iOS標準のマップの場合
きれいにまとまっているのでリファレンスを直接参考してください。
googleマップの方が指定できるパラメータは多く、機能が多彩です。
[Apple URL Scheme Reference](https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html)

#アプリ内で地図を表示する方法
アプリ内にgoogleマップを表示するにはgoogleの提供するSDKを導入する必要があります。
[Google Maps SDK for iOS の使い方（Swift 4対応）](https://qiita.com/koogawa/items/adc2dd19015586bda39b)