[Swift 5] Implementierung der Mitgliederregistrierung in Firebase

Einführung

Ich erstelle eine LINE-Klonanwendung, um die Firebase- und Chat-Funktion kennenzulernen, und werde die Implementierung der Mitgliederregistrierung mit Firebase als Memorandum veröffentlichen. Ich bin ein Anfänger. Wenn Sie also Korrekturen haben, weisen Sie bitte darauf hin.

Überblick

Dieses Mal ist bei der Implementierung der Mitgliedschaftsregistrierungsfunktion die Reihenfolge wie folgt.

    1. Benutzerregistrierung bei FirebaseAuth
  1. Registrieren Sie das Profilbild in Firebase Storage
    1. Registrieren Sie Benutzerinformationen in "Firebase Firestore"

Ausführungsumgebung

【Xcode】Version 12.0.1 【Swift】Version 5.3 【CocoaPods】version 1.9.3 【Firebase】version 6.29.0

Bildschirm nach der Montage

sample.gif

Implementierungscode

SignUpModel.swift


import Foundation
import Firebase

//Da sich der Delegat schwach beziehen möchte, erben Sie die Klasse
protocol SignUpModelDelegate: class {
    func createImageToFirestorageAction()
    func createUserToFirestoreAction(fileName: String?)
    func completedRegisterUserInfoAction()
}

class SignUpModel {
    
    //Delegieren Sie schwache Referenzen, um Speicherlecks zu vermeiden
    weak var delegate: SignUpModelDelegate?
    
    func createUser(email: String, password: String) {
        //In Firebase-Authentifizierung speichern
        Auth.auth().createUser(withEmail: email, password: password) { (res, err) in
            if let err = err {
                print("Fehler beim Speichern in Firebase Auth.\(err)")
                //Verarbeitung, wenn die Registrierung von Benutzerinformationen fehlschlägt
                return
            }
            print("Erfolgreich in Firebase Auth gespeichert.")
            //Das Speichern in Firebase Auth ist abgeschlossen->Im Firebase-Speicher speichern
            self.delegate?.createImageToFirestorageAction()
        }
    }
    
    func creatrImage(fileName: String, uploadImage: Data) {
        //Im Firebase-Speicher speichern
        let storageRef = Storage.storage().reference().child("profile_image").child(fileName)
        storageRef.putData(uploadImage, metadata: nil) { (metadate, err) in
            if let err = err {
                print("Fehler beim Speichern in Firestorage.\(err)")
                //Verarbeitung, wenn die Registrierung von Benutzerinformationen fehlschlägt
                return
            }
            print("Erfolgreich in Firestorage gespeichert.")
            //Das Speichern im Firebase-Speicher ist abgeschlossen->Im Firebase Firestore speichern
            self.delegate?.createUserToFirestoreAction(fileName: fileName)
        }
    }
    
    func createUserInfo(uid: String, docDate: [String : Any]) {
        //Im Firebase Firestore speichern
        Firestore.firestore().collection("users").document(uid).setData(docDate as [String : Any]) { (err) in
            if let err = err {
                print("Fehler beim Speichern im Firestore.\(err)")
                //Verarbeitung, wenn die Registrierung von Benutzerinformationen fehlschlägt
                return
            }
            print("Sie haben erfolgreich im Firestore gespeichert.")
            //Verarbeitung, wenn die Registrierung der Benutzerinformationen abgeschlossen ist
            self.delegate?.completedRegisterUserInfoAction()
        }
    }

}

SignUpViewController.swift


import UIKit
import Firebase
import FirebaseStorage
import IQKeyboardManagerSwift

class SignUpViewController: UIViewController {
    
    @IBOutlet weak var profileImageButton: UIButton!
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var userNameTextField: UITextField!
    @IBOutlet weak var signUpButton: UIButton!
    
    let signUpModel = SignUpModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        IQKeyboardManager.shared.enable = true
        
        emailTextField.delegate = self
        passwordTextField.delegate = self
        userNameTextField.delegate = self
        signUpModel.delegate = self
        
        //Verarbeitung über die Benutzeroberfläche des Bildschirms
        setupUI()
        
    }
    
    //Verarbeitung über die Benutzeroberfläche des Bildschirms
    func setupUI() {
        signUpButton.layer.cornerRadius = 3
        signUpButton.isEnabled = false
        profileImageButton.layer.masksToBounds = true
        profileImageButton.layer.cornerRadius = 75
        profileImageButton.layer.borderColor = UIColor.lightGray.cgColor
        profileImageButton.layer.borderWidth  = 0.1
    }
    
    //Profilbild auswählen (Übergang zur Fotobibliothek)
    @IBAction func profileImageButtonAction(_ sender: Any) {
        let imagePickerController = UIImagePickerController()
        imagePickerController.allowsEditing = true
        imagePickerController.delegate = self
        self.present(imagePickerController, animated: true, completion: nil)
    }
    
    //Neuer Registrierungsprozess
    @IBAction func signUpButtonAction(_ sender: Any) {
        
        guard let email = emailTextField.text,
              let password = passwordTextField.text
        else { return }
        
        //In Firebase-Authentifizierung speichern
        signUpModel.createUser(email: email, password: password)      
    }
    
    #···Kürzung···
    
    //Verarbeitung zum Speichern des Profilbilds im Firebase-Speicher
    private func createImageToFirestorage() {
        //Verarbeitung, wenn das Profilbild festgelegt ist
        if let image = self.profileImageButton.imageView?.image {
            let uploadImage = image.jpegData(compressionQuality: 0.5)
            let fileName = NSUUID().uuidString
            //Im Firebase-Speicher speichern
            signUpModel.creatrImage(fileName: fileName, uploadImage: uploadImage!) 
        } else {
            print("Da das Profilbild nicht festgelegt ist, ist es das Standardbild.")
            //Speichern Sie Benutzerinformationen im Firebase Firestore
            self.createUserToFirestore(profileImageName: nil)
        } 
    }
    
    //Verarbeitung zum Speichern von Benutzerinformationen im Firebase Firestore
    private func createUserToFirestore(profileImageName: String?) {
        
        guard let email = Auth.auth().currentUser?.email,
              let uid = Auth.auth().currentUser?.uid,
              let userName = self.userNameTextField.text
        else { return }
        
        //Gespeicherten Inhalt definieren (Wörterbuchtyp)
        let docData = ["email": email,
                       "userName": userName,
                       "profileImageName": profileImageName,
                       "createdAt": Timestamp()] as [String : Any?]
        
        //Im Firebase Firestore speichern
        signUpModel.createUserInfo(uid: uid, docDate: docData as [String : Any])
    }
    
}

extension SignUpViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    //Methode, die aufgerufen wird, wenn ein Foto ausgewählt wird
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let editedImage = info[.editedImage] as? UIImage {
            profileImageButton.setImage(editedImage.withRenderingMode(.alwaysOriginal), for: .normal)
        } else if let originalImage = info[.originalImage] as? UIImage {
            profileImageButton.setImage(originalImage.withRenderingMode(.alwaysOriginal), for: .normal)
        }
        dismiss(animated: true, completion: nil)
    }
    
}

extension SignUpViewController: UITextFieldDelegate {
    //Eine Methode, die aufgerufen wird, wenn die Textauswahl in textField geändert wird
    func textFieldDidChangeSelection(_ textField: UITextField) {
        //Variable, um festzustellen, ob textField leer ist(Bool-Typ)Definiert in
        let emailIsEmpty = emailTextField.text?.isEmpty ?? true
        let passwordIsEmpty = passwordTextField.text?.isEmpty ?? true
        let userNameIsEmpty = userNameTextField.text?.isEmpty ?? true
        //Verarbeitung, wenn alle textFields ausgefüllt wurden
        if emailIsEmpty || passwordIsEmpty || userNameIsEmpty {
            signUpButton.isEnabled = false
            signUpButton.backgroundColor = UIColor.systemGray2
        } else {
            signUpButton.isEnabled = true
            signUpButton.backgroundColor = UIColor(named: "lineGreen")
        }
    }
    
    //Die Tastatur wird geschlossen, wenn Sie etwas anderes als textField drücken
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
}

extension SignUpViewController: SignUpModelDelegate {
            
    //Das Speichern in Firebase Auth ist abgeschlossen->Im Firebase-Speicher speichern
    func createImageToFirestorageAction() {
        print("Erfolgreich in Firebase Auth gespeichert.")
        self.createImageToFirestorage()
    }
    
    //Das Speichern im Firebase-Speicher ist abgeschlossen->Im Firebase Firestore speichern
    func createUserToFirestoreAction(fileName: String?) {
        print("Erfolgreich in Firestorage gespeichert.")
        self.createUserToFirestore(profileImageName: fileName)
    }
    
    //Verarbeitung, wenn die Registrierung der Benutzerinformationen abgeschlossen ist
    func completedRegisterUserInfoAction() {
        //Bildschirmübergang zu ChatListViewController
        let storyboard = UIStoryboard(name: "ChatList", bundle: nil)
        let chatListVC = storyboard.instantiateViewController(withIdentifier: "ChatListVC") as! ChatListViewController
        let nav = UINavigationController(rootViewController: chatListVC)
        nav.modalPresentationStyle = .fullScreen
        nav.modalTransitionStyle = .crossDissolve
        self.present(nav, animated: true, completion: nil)
    }
    
}

Da wir uns auf die Verarbeitung in Bezug auf Firebase konzentrieren, werden wir die Erläuterung der folgenden Punkte weglassen.

Vorbereitung

① Voraussetzungen

Wir gehen davon aus, dass die folgenden Punkte abgeschlossen wurden.

--Erstellen eines Firebase-Projekts

Wenn Sie noch nichts davon gehört haben, lesen Sie bitte Dokumentation.

② Vorbereitung auf der Xcode-Seite

Fügen Sie dem Podfile Folgendes hinzu und führen Sie eine Pod-Installation im Terminal durch.

  pod 'Firebase/Analytics'
  pod 'Firebase/Auth'
  pod 'Firebase/Core'
  pod 'Firebase/Firestore'
  pod 'Firebase/Storage'
  pod 'FirebaseUI/Storage'

③ Vorbereitung auf der Firebase-Seite

スクリーンショット 2020-10-12 20.15.13.png Wählen Sie auf der Registerkarte "Anmeldemethode" wie oben gezeigt "Mail / Passwort" aus. Öffnen Sie den Bearbeitungsbildschirm mit dem Stiftsymbol.

スクリーンショット 2020-10-12 20.15.21.png Speichern Sie es, sobald es aktiviert ist. Dies ist das Ende der Vorbereitung.

Implementierungsdetails ① (Firebase Auth Edition)

SignUpViewController.swift


//Neuer Registrierungsprozess
@IBAction func signUpButtonAction(_ sender: Any) {
        
    guard let email = emailTextField.text,
          let password = passwordTextField.text
    else { return }
        
    //In Firebase-Authentifizierung speichern
    signUpModel.createUser(email: email, password: password)      
}

SignUpModel.swift


func createUser(email: String, password: String) {
    //In Firebase-Authentifizierung speichern
    Auth.auth().createUser(withEmail: email, password: password) { (res, err) in
        if let err = err {
            print("Fehler beim Speichern in Firebase Auth.\(err)")
            //Verarbeitung, wenn die Registrierung von Benutzerinformationen fehlschlägt
            return
        }
        print("Erfolgreich in Firebase Auth gespeichert.")
        //Das Speichern in Firebase Auth ist abgeschlossen->Im Firebase-Speicher speichern
        self.delegate?.createImageToFirestorageAction()
    }
}

Implementierungsdetails (2) (Firebase-Speicher)

SignUpViewController.swift


//Das Speichern in Firebase Auth ist abgeschlossen->Im Firebase-Speicher speichern
func createImageToFirestorageAction() {
    print("Erfolgreich in Firebase Auth gespeichert.")
    self.createImageToFirestorage()
}

SignUpViewController.swift


//Verarbeitung zum Speichern des Profilbilds im Firebase-Speicher
private func createImageToFirestorage() {
    //Verarbeitung, wenn das Profilbild festgelegt ist
    if let image = self.profileImageButton.imageView?.image {
        //Bild komprimieren
        let uploadImage = image.jpegData(compressionQuality: 0.5)
        //Holen Sie sich eine eindeutige ID
        let fileName = NSUUID().uuidString
        //Im Firebase-Speicher speichern
        signUpModel.creatrImage(fileName: fileName, uploadImage: uploadImage!) 
    } else {
        print("Da das Profilbild nicht festgelegt ist, ist es das Standardbild.")
        //Speichern Sie Benutzerinformationen im Firebase Firestore
        self.createUserToFirestore(profileImageName: nil)
    } 
}

SignUpModel.swift


func creatrImage(fileName: String, uploadImage: Data) {
    //Im Firebase-Speicher speichern
    let storageRef = Storage.storage().reference().child("profile_image").child(fileName)
    storageRef.putData(uploadImage, metadata: nil) { (metadate, err) in
        if let err = err {
            print("Fehler beim Speichern in Firestorage.\(err)")
            //Verarbeitung, wenn die Registrierung von Benutzerinformationen fehlschlägt
            return
        }
        print("Erfolgreich in Firestorage gespeichert.")
        //Das Speichern im Firebase-Speicher ist abgeschlossen->Im Firebase Firestore speichern
        self.delegate?.createUserToFirestoreAction(fileName: fileName)
    }
}

Implementierungsdetails ③ (Firebase Firestore Edition)

SignUpViewController.swift


//Das Speichern im Firebase-Speicher ist abgeschlossen->Im Firebase Firestore speichern
func createUserToFirestoreAction(fileName: String?) {
    print("Erfolgreich in Firestorage gespeichert.")
    self.createUserToFirestore(profileImageName: fileName)
}

SignUpViewController.swift


//Verarbeitung zum Speichern von Benutzerinformationen im Firebase Firestore
private func createUserToFirestore(profileImageName: String?) {
        
    guard let email = Auth.auth().currentUser?.email,
          let uid = Auth.auth().currentUser?.uid,
          let userName = self.userNameTextField.text
    else { return }
        
    //Gespeicherten Inhalt definieren (Wörterbuchtyp)
    let docData = ["email": email,
                   "userName": userName,
                   "profileImageName": profileImageName,
                   "createdAt": Timestamp()] as [String : Any?]
        
    //Im Firebase Firestore speichern
    signUpModel.createUserInfo(uid: uid, docDate: docData as [String : Any])
}

SignUpModel.swift


func createUserInfo(uid: String, docDate: [String : Any]) {
    //Im Firebase Firestore speichern
    Firestore.firestore().collection("users").document(uid).setData(docDate as [String : Any]) { (err) in
        if let err = err {
            print("Fehler beim Speichern im Firestore.\(err)")
            //Verarbeitung, wenn die Registrierung von Benutzerinformationen fehlschlägt
            return
        }
        print("Sie haben erfolgreich im Firestore gespeichert.")
        //Verarbeitung, wenn die Registrierung der Benutzerinformationen abgeschlossen ist
        self.delegate?.completedRegisterUserInfoAction()
    }
}

SignUpViewController.swift


//Verarbeitung, wenn die Registrierung der Benutzerinformationen abgeschlossen ist
func completedRegisterUserInfoAction() {
    //Bildschirmübergang zu ChatListViewController
    #···Kürzung···
}

Referenz

Recommended Posts

[Swift 5] Implementierung der Mitgliederregistrierung in Firebase
Implementierung von XLPagerTabStrip mit TabBarController
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Implementierungsnotiz für SKStoreReviewController in der Swift-Benutzeroberfläche von iOS14
[Swift] Das ist die Lösung! Abbildung der Implementierung des Delegierten
[Swift] So erhalten Sie die Firebase-Dokument-ID
Implementierung der Suchfunktion
Angewandte Implementierung von Chat-Space
Erste Schritte mit Swift
Implementierung der Pagenationsfunktion
Registrierung mehrerer WebMvcConfigurers
Beginnend mit Swift Swift UI
Paginierungsimplementierung mit gem'kaminari '
[Java] Vereinfachen Sie die Implementierung der Datenverlaufsverwaltung mit Reladomo
Implementierung eines mathematischen Syntaxanalysators durch rekursive absteigende Syntaxanalysemethode (Java)