【Swift】Firebaseの基本的な使い方まとめ

#はじめに　
Firebaseを使っていく中で学びになったことをまとめてみようと思います！
Firebaseのセットアップなどは省きます。エラーハンドリングも今回は最低限にしています。

#Authentication
メールアドレス認証を有効にする
![スクリーンショット 2021-04-26 22.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/f13e42ae-8f98-efe4-daa2-1873e995c594.png)

##ユーザー情報の作成

```swift
guard let email = emailTextField.text,
      let password = passwordTextField.text else { return }
Auth.auth().createUser(withEmail: email, password: password) { result, error in
    if let error = error {
        print("情報の作成に失敗\(error)")
        return
    }
    print("情報の作成に成功")
}
```

このような感じでユーザー情報がAuthに保存される
![スクリーンショット 2021-04-26 22.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/8ab75a03-ea17-8e86-8057-9a304de60331.png)

##認証済みかの判定

```swift
if Auth.auth().currentUser?.uid == nil {
    print("認証済み")
}
```

#Firestore
Model

```swift
import Foundation
import FirebaseFirestore

struct User {
    
    let email: String
    let username: String
    let createdAt: Timestamp
    
    init(dic: [String: Any]) {
        self.email = dic["email"] as? String ?? ""
        self.username = dic["username"] as? String ?? ""
        self.createdAt = dic["createdAt"] as? Timestamp ?? Timestamp()
    }
    
}
```

##Firestoreに情報を保存する
先ほどの`Auth.auth().createUser(withEmail: , password: )`でresultが返ってくるので、そのresultからuserのuidを取得する。
`Firestore.firestore().collection("users").document(uid).setData(docData)`でFirestoreのusersという名前をつけた
collectionのuidという名前をつけたdocumentにsetDataで保存している。
![スクリーンショット 2021-04-26 22.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/38b3b70f-a98b-8808-e9de-711fa879ce24.png)


```swift
guard let uid = result?.user.uid else { return }
guard let username = self.usernameTextField.text else { return }
let docData = [
    "email": email,
    "username": username,
    "createdAt": Timestamp(),
] as [String: Any]
Firestore.firestore().collection("users").document(uid).setData(docData) { error in
    if let error = error {
        print("Firestoreへの保存に失敗しました\(error)")
        return
    }
    print("Firestoreへの保存に成功しました")
}
```

##Firestoreから情報を取得する
getDocumentsでFirestoreに保存したユーザー情報を取得する。

```swift
Firestore.firestore().collection("users").getDocuments { snapshots, error in
    if let error = error {
        print("ユーザー情報の取得に失敗しました\(error)")
        return
    }
    snapshots?.documents.forEach { snapshot in
        let dic = snapshot.data()
        let user = User(dic: dic)
    }
}
```

#Storage

##Storageに画像を保存する

データが大きすぎるので、jpegData(compressionQuality:)でデータを小さくしています。
fileNameはNSUUID().uuidStringを使って適当な文字列にしました。
`Storage.storage().reference().child("profile_image").child(fileName)`でStorageのreferenceの子要素にprofile_imageフォルダを作り、その中にfileNameという名前をつけたimageを保存していきます。uploadImageを`storageRef.putData(uploadImage, metadata: nil)`で実際に保存します。

```swift
guard let image = imageView.image else { return }
guard let uploadImage = image.jpegData(compressionQuality: 0.3) else { return }
let fileName = NSUUID().uuidString
let storageRef = Storage.storage().reference().child("profile_image").child(fileName)
storageRef.putData(uploadImage, metadata: nil) { data, error in
    if let error = error {
        print("Storageへの保存に失敗しました\(error)")
        return
    }
    print("Storageへの保存に成功しました")
}
```

##URLを取得する

`downloadURL`でURLを取得できる。

```swift
storageRef.downloadURL { url, error in
    if let error = error {
        print("Storageからのダウンロードに失敗しました\(error)")
        return
    }
    print("Storageからのダウンロードに成功しました")
}
```

![スクリーンショット 2021-04-26 22.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/b66205aa-cb46-a8a6-54b1-4a22c581ca7e.png)

![スクリーンショット 2021-04-26 23.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/591caa55-ee4f-f007-a42d-740e79f2c522.png)



#おわりに
随時更新予定