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.
Dieses Mal ist bei der Implementierung der Mitgliedschaftsregistrierungsfunktion die Reihenfolge wie folgt.
FirebaseAuth
Firebase Storage
1. Bei der Bearbeitung
, nach Abschluss der Mitgliederregistrierung mit der Genehmigungs-E-Mail` 2. Es scheint, dass es eine übliche Methode ist, zur Verarbeitung von "überzugehen, aber da der Zweck dieser Zeit das Lernen war, wird dieser Bereich nicht berücksichtigt.【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
//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.
UIActivityIndicatorView
UIImagePickerController
IQKeyboardManagerSwift
(Einzelheiten finden Sie unter hier.)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.
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'
Wählen Sie auf der Registerkarte "Anmeldemethode" wie oben gezeigt "Mail / Passwort" aus. Öffnen Sie den Bearbeitungsbildschirm mit dem Stiftsymbol.
Speichern Sie es, sobald es aktiviert ist. Dies ist das Ende der Vorbereitung.
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()
}
}
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)
}
}
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···
}
Recommended Posts