iOS(swift)版Firebaseアプリ　ハンズオンを試してみました


iOSでFirebaseアプリを作るハンズオンが公開されているので試してみました。
[Firebase iOS Codelab](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#0)

Chatアプリの実装を通してFirebaseの機能を試すことができます。
注)理由はわかりませんが、このチュートリアルは[ガイド](https://firebase.google.com/docs/ios/setup)(日本語版)からはリンクされていません。

ソースコード追加時にエラーが発生しますが、XCodeによる修正候補にてすべて修正できました。
途中まではシミュレータでも動作できましたが最後の機能まで試すためには実機が必要です。

# 環境
MacOS X Sierra(10.12.1)
Xcode 8.0


# 事前準備
[ここ](https://firebase.google.com/docs/ios/setup)を参考に事前準備をします。
* Xcode 7.0 以降
* 物理 iOS 端末(クラウドメッセージ用)
* Xcode プロジェクトとバンドル識別子
* CocoaPods 1.0.0 以降


# 目次
目次の数が多いので長くかかりそうですが、目安の時間は30分と表示されています。
1. OverView
1. Get the sample code
1. Build the starter app
1. Create Firebase console Project
1. Identify Users
1. Activate Realtime Database
1. Send Messages
1. Store and Receive images
1. Send Image Messages
1. Configure Friendly Message Length
1. Track User Flows
1. Monetize with Ads
1. Report Crashes
1. Congratulations!

# OverView(残り29分)
Firebaseを使ったチャットアプリケーションをステップバイステップで作成するチュートリアルです。
<img src="https://codelabs.developers.google.com/codelabs/firebase-ios-swift/img/4a9d9efa22d559df.png" width="200px" alt="Firebaseを使ったチャットアプリケーション">

# Get the sample code(残り28分)
Githubからソースを取得します。
```
$ git clone https://github.com/firebase/friendlychat
```
iosプロジェクトは、ios-starter/swift-starterとios/swiftがあります。前者は、チュートリアルで機能を追加する版、後者はすべての機能を含む版(チュートリアル完成後)です。
注)objecive-c版もありました。

# Build the starter app(残り26分)
firebase SDKをインストールしてXcodeを起動します。

```
$ cd friendlychat/ios-starter/swift-starter
$ pod update
$ open FriendlyChatSwift.xcworkspace
```

設定画面(General)でBundle IdentifierとTeamを変更します。
![FriendlyChatSwift_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/5247/9a2bafe3-2a0a-6090-50ca-d0a3f95eff6a.png "FriendlyChatSwift_xcodeproj.png")

ビルドが成功して、シミュレータ起動できれば成功です。

# Create Firebase console Project(残り24分)
Firebase consoleでプロジェクトを作成します。
プロジェクト名は、何でもかまいません。FriendlyChatにしました。プロジェクトにiOSアプリを追加します。
bundle identifierはXcodeで設定した値を入力します(<span style="color:red;">ここが重要です</span>)。
作成するとGoogleService-Info.plistがダウンロードされますので、このファイルをプロジェクトに追加します。このファイルにはAPI-KEYやプロジェクトIDなどが含まれています。

## Firebaseライブラリの初期化
Xcodeプロジェクトに戻り、Firebaseライブラリの初期化処理をAppDelegate.swiftに追加します。

```swift
// 最初から入っていました
import Firebase

  func application(_ application: UIApplication, didFinishLaunchingWithOptions
      launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // この行を追加します
    FIRApp.configure()
    return true
  }
```

アプリを再起動して、GoogleService-Info.plistが見つからないというエラーが出ていなければOKです。

# Identify Users(残り23分)
## Use Rules To Restrict To Authenticated Users
Filebaseコンソールにおいてアクセス制御ルールを修正します。デフォルトは、すべてに対して読み書きともに認証が必要となっています。messagesデータのみ読み書きに認証が必要となるようにルールを修正します。

PodfileにFirebase/Authが入っていることを確かめます。

## Add Email/Password Sign In via Firebase Authentication
アプリにFirebase認証経由でEmail認証を追加します。
Firebaseコンソールでログイン方法タブでプロバイダとしてメール／パスワードを有効にします。
次に、ユーザータブでログインユーザーを追加します(<span style="color: red;">忘れやすいので注意が必要です</span>)。SDK経由でユーザー登録もできます。

![Firebase_Console_Auth.png](https://qiita-image-store.s3.amazonaws.com/0/5247/3e3b8da1-c413-68e3-76fd-5f9c679c8817.png "Firebase_Console_Auth.png")


SignInViewController.swift, FCViewController.swiftを修正します。
修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#4)を参照してください。

アプリを再起動して、登録したユーザーでログインできれば成功です。

# Activate Realtime Database(残り18分)
## Import Messages
メッセージの初期データをFirebaseコンソールからインポートします。
インポートするファイル(initial_messages.json)は、取得したソースコードのルートにあります。
FirebaseコンソールでDatabaseを選択します。データを展開／たたむ(＋−)アイコンの右の3点アイコンをクリックするとインポートメニューが表示されます。

## Confirm Firebase Database Dependency
PodfileにFirebase/Databaseが入っていることを確かめます。

## Synchronize Existing Messages
起動時に、メッセージを読み込む処理をFCViewController.swiftに追加します。

修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#5)を参照してください。

アプリを再起動して、登録したメッセージが表示できれば成功です。

# Send Messages(残り13分)
FCViewController.swiftに処理を追加します。
UI部品からデータ取得する処理はあるので、データを送信する処理を1行追加するだけです。
childByAutoIdはユニークなIDを生成してくれるメソッドです(<span style="color: red;">便利メソッドです</span>)。

```swift
  func sendMessage(withData data: [String: String]) {
    var mdata = data
    mdata[Constants.MessageFields.name] = AppState.sharedInstance.displayName
    if let photoURL = AppState.sharedInstance.photoURL {
      mdata[Constants.MessageFields.photoURL] = photoURL.absoluteString
    }
    // この行を追加します
    // Push data to Firebase Database
    self.ref.child("messages").childByAutoId().setValue(mdata)
  }
```
テキストフィールドにメッセージを入力し、Sendボタンをクリックします。メッセージが一覧に表示されれば成功です。Firebaseコンソールでもデータを確認できます。

# Store and Receive images(残り13分)
## Confirm Firebase Storage Dependency
PodfileにFirebase/Storageが入っていることを確かめます。

FCViewController.swiftに処理を追加します。

```swift
  func configureStorage() {
    // 以下の2行を追加します
    let storageUrl = FIRApp.defaultApp()?.options.storageBucket
    storageRef = FIRStorage.storage().reference(forURL: "gs://" + storageUrl!)
  }
```

次ステップで画像メッセージを送信します。

## Send Image Messages(残り8分)
画像をアップロードする処理をFCViewController.swiftに追加します。

修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#8)を参照してください。

Firebaseコンソール(Storage)に画像がアップロードできれば成功です。
![Firebase_Console_Storage.png](https://qiita-image-store.s3.amazonaws.com/0/5247/2005cf71-5833-591f-d26c-00885f81ae37.png "Firebase_Console_Storage.png")

また、Firebaseコンソール(Database)にアップロードした画像のURLを持つメッセージが登録されていれば成功です。
![Firebase_Console_Storage_image.png](https://qiita-image-store.s3.amazonaws.com/0/5247/497d9160-7299-ea04-722a-2fa460ed939a.png "Firebase_Console_Storage_image.png")

# Configure Friendly Message Length(残り8分)
Firebase Remote Configを使うとアプリの挙動をリモート制御できます。
たとえば、Friendly messagesアプリに、メッセージの長さを制御する設定を追加します。

## Add Config Rules in Firebase console
FirebaseコンソールにRemote Config(friendly?msg_length=10)を追加します。
![Firebase_Console_RemoteConfig.png](https://qiita-image-store.s3.amazonaws.com/0/5247/61fea046-c4be-065e-d08c-2e35a9816d3d.png "Firebase_Console_RemoteConfig.png")

## Confirm Firebase RemoteConfig Dependency
PodfileにFirebase/RemoteConfigが入っていることを確かめます。

## RemoteConfig処理を追加します
修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#9)を参照してください。

10文字を超えたメッセージを登録しても10文字で打ち切られることをアプリとFirebaseコンソールで確認できれば成功です。

# Track User Flows(残り3分)
Firebase Analyticsはユーザーの行動を追跡する機能を提供してくれます。
※) Google Analyticsの結果はすぐに見ることはできません。アップロードの24時間後から見ることができます。

MeasurementHelper.swiftに処理を追加します。
修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#10)を参照してください。

ActivityをXCodeのコンソールに表示したい場合には、ビルドオプションに-FIRAnalyticsDebugEnabledを追加します。

# Monetize with Ads(残り2分)
AdMobが使えます。

## Confirm the AdMob dependency
PodfileにFirebase/AdMobが入っていることを確かめます。

修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#11)を参照してください。

AdMob広告が表示されれば成功です。

# Report Crashes(残り1分)
Crashレポート送信機能を追加します。

## Confirm the Crash dependency
PodfileにFirebase/Crashが入っていることを確かめます。

修正量が多いので[チュートリアルページ](https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#12)を参照してください。

1. Crashボタンをクリックします。
2. 再度アプリを起動します
3. Firebaseコンソール(Crash Repoting)にエラーが表示されます。
![Firebase_Console_Crash.png](https://qiita-image-store.s3.amazonaws.com/0/5247/aa77179b-c7cd-5f37-131e-d51f8dc10a5c.png "Firebase_Console_Crash.png")

# Congratulations!
おつかれさまでした。