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


はじめに 

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

Authentication

メールアドレス認証を有効にする

ユーザー情報の作成

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に保存される

認証済みかの判定

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

Firestore

Model

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で保存している。

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に保存したユーザー情報を取得する。

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)で実際に保存します。

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を取得できる。

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

おわりに

随時更新予定