Je crée une application de clonage LINE pour apprendre Firebase et la fonction de chat, et je publierai la mise en œuvre de l'inscription des membres en utilisant Firebase sous forme de mémorandum. Je suis un débutant, donc si vous avez des corrections, veuillez les signaler.
Cette fois, dans la mise en œuvre de la fonction d'enregistrement des membres, l'ordre est le suivant.
Firebase Firestore
1. Lors du traitement
, après avoir terminé l'enregistrement de l'adhésion en utilisant l'e-mail d'approbation2. Il semble que ce soit une méthode courante pour passer au traitement de
, mais comme le but de cette époque était d'apprendre, ce domaine n'est pas pris en compte.【Xcode】Version 12.0.1 【Swift】Version 5.3 【CocoaPods】version 1.9.3 【Firebase】version 6.29.0
SignUpModel.swift
import Foundation
import Firebase
//Puisque le délégué veut faire référence à faible, hériter de la classe
protocol SignUpModelDelegate: class {
func createImageToFirestorageAction()
func createUserToFirestoreAction(fileName: String?)
func completedRegisterUserInfoAction()
}
class SignUpModel {
//déléguer des références faibles pour éviter les fuites de mémoire
weak var delegate: SignUpModelDelegate?
func createUser(email: String, password: String) {
//Enregistrer dans Firebase Auth
Auth.auth().createUser(withEmail: email, password: password) { (res, err) in
if let err = err {
print("Échec de l'enregistrement dans Firebase Auth.\(err)")
//Traitement lorsque l'enregistrement des informations utilisateur échoue
return
}
print("Enregistrement réussi dans Firebase Auth.")
//Enregistrement terminé dans Firebase Auth->Enregistrer dans Firebase Storage
self.delegate?.createImageToFirestorageAction()
}
}
func creatrImage(fileName: String, uploadImage: Data) {
//Enregistrer dans Firebase Storage
let storageRef = Storage.storage().reference().child("profile_image").child(fileName)
storageRef.putData(uploadImage, metadata: nil) { (metadate, err) in
if let err = err {
print("Échec de l'enregistrement dans Firestorage.\(err)")
//Traitement lorsque l'enregistrement des informations utilisateur échoue
return
}
print("Enregistré avec succès dans Firestorage.")
//Enregistrement terminé dans Firebase Storage->Enregistrer dans Firebase Firestore
self.delegate?.createUserToFirestoreAction(fileName: fileName)
}
}
func createUserInfo(uid: String, docDate: [String : Any]) {
//Enregistrer dans Firebase Firestore
Firestore.firestore().collection("users").document(uid).setData(docDate as [String : Any]) { (err) in
if let err = err {
print("Échec de l'enregistrement dans Firestore.\(err)")
//Traitement lorsque l'enregistrement des informations utilisateur échoue
return
}
print("Vous avez enregistré avec succès dans le Firestore.")
//Traitement lorsque l'enregistrement des informations utilisateur est terminé
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
//Traitement de l'interface utilisateur d'écran
setupUI()
}
//Traitement de l'interface utilisateur d'écran
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
}
//Sélectionnez l'image de profil (transition vers la photothèque)
@IBAction func profileImageButtonAction(_ sender: Any) {
let imagePickerController = UIImagePickerController()
imagePickerController.allowsEditing = true
imagePickerController.delegate = self
self.present(imagePickerController, animated: true, completion: nil)
}
//Nouveau processus d'inscription
@IBAction func signUpButtonAction(_ sender: Any) {
guard let email = emailTextField.text,
let password = passwordTextField.text
else { return }
//Enregistrer dans Firebase Auth
signUpModel.createUser(email: email, password: password)
}
#···réduction···
//Traitement pour enregistrer l'image de profil sur Firebase Storage
private func createImageToFirestorage() {
//Traitement lorsque l'image de profil est définie
if let image = self.profileImageButton.imageView?.image {
let uploadImage = image.jpegData(compressionQuality: 0.5)
let fileName = NSUUID().uuidString
//Enregistrer dans Firebase Storage
signUpModel.creatrImage(fileName: fileName, uploadImage: uploadImage!)
} else {
print("Étant donné que l'image de profil n'est pas définie, ce sera l'image par défaut.")
//Enregistrer les informations utilisateur dans Firebase Firestore
self.createUserToFirestore(profileImageName: nil)
}
}
//Traitement pour enregistrer les informations utilisateur dans 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 }
//Définir le contenu enregistré (type dictionnaire)
let docData = ["email": email,
"userName": userName,
"profileImageName": profileImageName,
"createdAt": Timestamp()] as [String : Any?]
//Enregistrer dans Firebase Firestore
signUpModel.createUserInfo(uid: uid, docDate: docData as [String : Any])
}
}
extension SignUpViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
//Méthode appelée lorsqu'une photo est sélectionnée
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 {
//Une méthode appelée lorsque la sélection de texte est modifiée dans textField
func textFieldDidChangeSelection(_ textField: UITextField) {
//Variable pour déterminer si textField est vide(Type booléen)Défini dans
let emailIsEmpty = emailTextField.text?.isEmpty ?? true
let passwordIsEmpty = passwordTextField.text?.isEmpty ?? true
let userNameIsEmpty = userNameTextField.text?.isEmpty ?? true
//Traitement lorsque tous les textFields ont été remplis
if emailIsEmpty || passwordIsEmpty || userNameIsEmpty {
signUpButton.isEnabled = false
signUpButton.backgroundColor = UIColor.systemGray2
} else {
signUpButton.isEnabled = true
signUpButton.backgroundColor = UIColor(named: "lineGreen")
}
}
//Le clavier se ferme lorsque vous appuyez sur autre chose que textField
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
extension SignUpViewController: SignUpModelDelegate {
//Enregistrement terminé dans Firebase Auth->Enregistrer dans Firebase Storage
func createImageToFirestorageAction() {
print("Enregistrement réussi dans Firebase Auth.")
self.createImageToFirestorage()
}
//Enregistrement terminé dans Firebase Storage->Enregistrer dans Firebase Firestore
func createUserToFirestoreAction(fileName: String?) {
print("Enregistré avec succès dans Firestorage.")
self.createUserToFirestore(profileImageName: fileName)
}
//Traitement lorsque l'enregistrement des informations utilisateur est terminé
func completedRegisterUserInfoAction() {
//Transition d'écran vers 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)
}
}
Puisque nous nous concentrons sur le traitement lié à Firebase, nous omettons l'explication des éléments suivants.
--À propos de la gestion des erreurs
--À propos de ʻUIActivityIndicatorView --À propos de ʻUIImagePickerController
――À propos d'IQKeyboardManagerSwift` (Pour plus de détails, reportez-vous à ici.)
Nous procéderons en supposant que les éléments suivants ont été complétés.
--Création d'un projet Firebase
Si vous n'en avez pas encore entendu parler, veuillez consulter la Documentation.
Ajoutez ce qui suit au «Podfile» et effectuez une «installation du pod» dans le terminal.
pod 'Firebase/Analytics'
pod 'Firebase/Auth'
pod 'Firebase/Core'
pod 'Firebase/Firestore'
pod 'Firebase/Storage'
pod 'FirebaseUI/Storage'
Sélectionnez "Mail / Mot de passe" dans l'onglet "Méthode de connexion" comme indiqué ci-dessus. Ouvrez l'écran d'édition avec l'icône en forme de crayon.
Enregistrez-le une fois activé. C'est la fin de la préparation.
SignUpViewController.swift
//Nouveau processus d'inscription
@IBAction func signUpButtonAction(_ sender: Any) {
guard let email = emailTextField.text,
let password = passwordTextField.text
else { return }
//Enregistrer dans Firebase Auth
signUpModel.createUser(email: email, password: password)
}
SignUpModel.swift
func createUser(email: String, password: String) {
//Enregistrer dans Firebase Auth
Auth.auth().createUser(withEmail: email, password: password) { (res, err) in
if let err = err {
print("Échec de l'enregistrement dans Firebase Auth.\(err)")
//Traitement lorsque l'enregistrement des informations utilisateur échoue
return
}
print("Enregistrement réussi dans Firebase Auth.")
//Enregistrement terminé dans Firebase Auth->Enregistrer dans Firebase Storage
self.delegate?.createImageToFirestorageAction()
}
}
SignUpViewController.swift
//Enregistrement terminé dans Firebase Auth->Enregistrer dans Firebase Storage
func createImageToFirestorageAction() {
print("Enregistrement réussi dans Firebase Auth.")
self.createImageToFirestorage()
}
SignUpViewController.swift
//Traitement pour enregistrer l'image de profil sur Firebase Storage
private func createImageToFirestorage() {
//Traitement lorsque l'image de profil est définie
if let image = self.profileImageButton.imageView?.image {
//Compresser l'image
let uploadImage = image.jpegData(compressionQuality: 0.5)
//Obtenez un identifiant unique
let fileName = NSUUID().uuidString
//Enregistrer dans Firebase Storage
signUpModel.creatrImage(fileName: fileName, uploadImage: uploadImage!)
} else {
print("Étant donné que l'image de profil n'est pas définie, ce sera l'image par défaut.")
//Enregistrer les informations utilisateur dans Firebase Firestore
self.createUserToFirestore(profileImageName: nil)
}
}
SignUpModel.swift
func creatrImage(fileName: String, uploadImage: Data) {
//Enregistrer dans Firebase Storage
let storageRef = Storage.storage().reference().child("profile_image").child(fileName)
storageRef.putData(uploadImage, metadata: nil) { (metadate, err) in
if let err = err {
print("Échec de l'enregistrement dans Firestorage.\(err)")
//Traitement lorsque l'enregistrement des informations utilisateur échoue
return
}
print("Enregistré avec succès dans Firestorage.")
//Enregistrement terminé dans Firebase Storage->Enregistrer dans Firebase Firestore
self.delegate?.createUserToFirestoreAction(fileName: fileName)
}
}
SignUpViewController.swift
//Enregistrement terminé dans Firebase Storage->Enregistrer dans Firebase Firestore
func createUserToFirestoreAction(fileName: String?) {
print("Enregistré avec succès dans Firestorage.")
self.createUserToFirestore(profileImageName: fileName)
}
SignUpViewController.swift
//Traitement pour enregistrer les informations utilisateur dans 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 }
//Définir le contenu enregistré (type dictionnaire)
let docData = ["email": email,
"userName": userName,
"profileImageName": profileImageName,
"createdAt": Timestamp()] as [String : Any?]
//Enregistrer dans Firebase Firestore
signUpModel.createUserInfo(uid: uid, docDate: docData as [String : Any])
}
SignUpModel.swift
func createUserInfo(uid: String, docDate: [String : Any]) {
//Enregistrer dans Firebase Firestore
Firestore.firestore().collection("users").document(uid).setData(docDate as [String : Any]) { (err) in
if let err = err {
print("Échec de l'enregistrement dans Firestore.\(err)")
//Traitement lorsque l'enregistrement des informations utilisateur échoue
return
}
print("Vous avez enregistré avec succès dans le Firestore.")
//Traitement lorsque l'enregistrement des informations utilisateur est terminé
self.delegate?.completedRegisterUserInfoAction()
}
}
SignUpViewController.swift
//Traitement lorsque l'enregistrement des informations utilisateur est terminé
func completedRegisterUserInfoAction() {
//Transition d'écran vers ChatListViewController
#···réduction···
}
Recommended Posts