Google Maps SDK for iOSをマニュアルインストールして東京駅を表示する(Swift4)

# はじめに
`Google Maps SDK for iOS`　をマニュアルインストールし、東京駅を表示するまでをまとめます
CocoaPodによるインストールは [こちらの記事](https://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)が参考になると思います


##### **所要時間**
30min

##### **環境**
xcode9.2(swift4)

##### **前提**
- 適当なプロジェクトをXcodeで作成しておくこと(Single View App)
- プレミアムプランではないこと(プレミアムプランの場合、 `M4B`というライブラリのインストールが必要のようです
- GoogleのDeveloperアカウントがあり、APIキーの発行が完了していること


# GoogleMapsSDKのインストール
##### **SDKのダウンロードと解凍**
[公式ページ](https://developers.google.com/maps/documentation/ios-sdk/start#2_sdk) からSDK一式を落として解凍しておきます


##### **Frameworkの追加**
作成しておいたプロジェクトにFrameworkを追加します。 今回は、`$(PROJECT_DIR)/GoogleMap`にFramework用ディレクトリを作成し、その配下に落としてきたFrameworkを追加します。
Finderで以下のファイルをxCodeのプロジェクトにドラッグ&ドロップし、プロジェクトにFrameworを追加します。この時、`Copy items if needed`はチェックしておきます
(プロジェクトルートを選択し、`General` -> `Linked Frameworks and Libraries` の `+` からFrameworkを追加しても良いです)

↓追加するもの

```bash:

${解凍したGoogleMapSDKのディレクトリ}/Base/Framework/GoogleMapsBase.framework
${解凍したGoogleMapSDKのディレクトリ}/Maps/Framework/GoogleMaps.framework
${解凍したGoogleMapSDKのディレクトリ}/Maps/Framework/GoogleMapsCore.framework
```

##### **GoogleMaps.bandleを追加**
以下のディレクトリ配下に `GoogleMaps.bandle` があるので、 `$(PROJECT_DIR)/GoogleMap` にコピーします。

```Shell

${解凍したGoogleMapSDKのディレクトリ}/Maps/Framework/GoogleMaps.framework/Resources1
```

Frameworkの追加手順で丸ごと含んでいるのですが、これは外だししないとxcodeが認識してくれなく、実行時にbandleエラーとなってしまいます
当該手順を行ったら`BuildPhase` の`CopyBandleResource`に`GoogleMaps.bundle` が追加されているはずです。されていなかったら `+`から追加してあげます


##### **その他必要なライブラリをLinkする**
以下の状態になるように `Linked Frameworks and Libraries` の `+` からFrameworkをLinkします。
(順番は関係ないので適当でOKです
<img width="773" alt="スクリーンショット 2018-05-15 1.49.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/253035/32f82d61-7a54-b809-365b-d2f698dd2f5f.png">

##### **-ObjCフラグを設定する**
GoogleMapsSDK for iOSは`objective-c`で記載されているので、Swiftから`objective-c`で書かれているFrameworkを利用するには `OtherLinkerFlags`に`-ObjC`を設定する必要があります。
この辺りあまり詳しくないのですが `-ObjC`を設定すると通常よりもビルド時間か処理速度がかかるという記事を見たことあるので必要な時しか設定しない方が良いみたいです(間違っていたら申し訳ありません
<img width="498" alt="スクリーンショット 2018-05-15 0.16.45 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/253035/582969d4-2a8a-52eb-1593-8dba489677ce.png">


# 東京駅の表示
ここまでの手順で、下準備は終わったので次は実装に入ります。
ここは[公式ページ](https://developers.google.com/maps/documentation/ios-sdk/start#6)を参考にしました。

##### **AppDalegate**
```swift:AppDelegate.swift

import UIKit
import GoogleMaps


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    
    let apiKey = "発行したAPIKey" // ここに発行したGoogleAPIKeyを設定する

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        GMSServices.provideAPIKey(apiKey)
        
        return true
    }
}
```

##### **UIViewController**
```swift:ViewController

import UIKit
import GoogleMaps

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 東京駅の座標をセット
        let camera = GMSCameraPosition.camera(withLatitude: 35.681167, longitude: 139.767052, zoom: 16.0)
        let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        mapView.isMyLocationEnabled = true
        view = mapView
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
```

# 結果
ビルドしてシュミレーションを起動すれば東京駅が表示されます
<img width="200" alt="スクリーンショット 2018-05-15 2.21.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/253035/a7f59411-3817-2578-bd80-1719838e68be.png">


# はまったところ
- 最初、`GoogleMaps.bundle` をBuildPhasesに仕込んでおらず `*** Terminating app due to uncaught exception 'GMSException', reason: 'Google Maps SDK for iOS requires GoogleMaps.bundle to be part of your target under 'Copy Bundle Resources''` というエラーがでました

# 参考文献
https://developers.google.com/maps/documentation/ios-sdk/start#top_of_page (公式iOS Maps SDK for iOSスタートガイド)
https://qiita.com/kobaboy/items/83164707c103ca0ce5b6 (SwiftでGoogle Maps SDK for iOSを使用してGoogleMapを表示させてみた)