SwiftUI : Firebase Auth ve Firestorm Database Kullanımı

Firebase Google tarafından uygulamalarımızda ve websitelerimizde kullanabilmemize olanak sağlayan bulut tabanlı bir veritabanı çözümüdür. Bu yazımda Google firebase ve firestorm ile ilgili notlarımı sizlerle paylaşacağım. Bu kuruluma başlamadan önce sisteminizde cocoapods kurulu olduğundan emin olun.

Kurulum Adımları: Firebase‘de Proje Oluşturun

Projenizi oluşturduktan sonra Firebase sizi oldukça basit bir kurulum adımları sayfasına yönlendirecek.  Uygulama ile ilgili bundleID ve diğer bilgileri girin ve 2.adımda size verilen .plist uzantılı dosyayı indirip projenize dahil edin.

Not : Dosya isminin GoogleService-Infso.plist olarak eklendiğinden emin olun.

Kurulum Adımları: Pod Dosyasında İşlemler

Terminalden projenizin xcodeproj dosyasının olduğu dizine erişin ve pod dosyanızı aşağıdaki komut ile oluşturun.

pod init

daha sonra pod dosyanızı herhangi bir text düzenleyici ile açın ve aşağıdaki satırları use_frameworks! altına ekleyin.

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

Auth ve Analytics zorunlu değil. Auth firebase üzerinde E-Mail ile kullanıcı kaydı özelliği etkinleştirildiğinde gerekmektedir.

sonraki adım ise pod dosyasına işlediğimiz Firebase Core ve Database yüklenmesi. Terminalde aşağıdaki komutu yazarak devam edin.

pod install

Pod kurulumları böylelikle tamamlanmış oluyor.

Kurulum Adımları: AppDelegate İşlemleri

Son olarak AppDelegate.swift dosyasında bazı düzenlemeler yapmamız gerekiyor. Bunun için öncelikle AppDelegate.swift dosyasını açtıktan sonra Firebase import edilmelidir. ( Not: Firebase kullanacağımız her yerde import ediyoruz elbette )

import Firebase

Daha sonra aynı dosya içerisinde didFinishLaunchingWithOptions fonksiyonunun içinde return true satırından hemen önce aşağıdaki satırı ekleyin.

FirebaseApp.configure()

Ve Firebase artık projemize dahil oldu. Şimdi firebase ve firestorm ile veritabanı işlemlerine geçebiliriz.

Auth ile Üye Kaydı Oluşturma

Öncelikle Authentication bölümünden oturum açma metodu e-posta ve şifre olarak ayarlanmalıdır.

Auth.auth().createUser(withEmail: "[email protected]", password: "123123") { (data, err) in
   if err != nil {
      print(err!.localizedDescription) // Hata açıklaması.
   }else if data != nil {
      print(data!.user.uid) // Kullanıcı oluşturuldu. 
   }
}

Auth İle Üye Girişi Sağlama

Auth.auth().signIn(withEmail: "[email protected]", password: "123123") { (data, err) in
   if err != nil {
      self.errMessage = err!.localizedDescription // Hata Açıklaması..
   }else if data != nil {
      // Bilgiler doğrulandı.
   }
}

Oturumdaki Kullanıcının ID Bilgisi

Auth.auth().currentUser!.uid

Oturumun Kapatılması

Auth.auth().signOut()

Veritabanına Kayıt Eklemek

Database menüsünden Firestore sunucusu seçildikten sonra aşağıdaki şekilde veritabanına ekleme yapabilirsiniz.

let kisi : [String : Any] = ["name": "mehmet", "surname": "vatanlar"]
let db = Firestore.firestore()

let insert : DocumentReference = db.collection("Users").addDocument(data: kisi, completion: { (err) in
   if error == nil {
      self.resultMessage = err!.localizedDescription
   }else{
      self.errMessage = "hata oluştu"
   }
})

Veritabanından Kayıt Getirme (Filtresiz)

Bu aşamada yeni bir gelen verinin yapısını belirleyen struct bir de verileri çekeceğimiz class oluşturmamız gerekiyor.

Struct Dosyamızın İçeriği ( Alacağımız Veri Yapısı )

import SwiftUI

struct DataModel : Identifiable {
    var id: Int
    var name: String
    var uid: String
}

Class Dosyamızın İçeriği

import SwiftUI
import Firebase
import Combine

class UserStore : ObservableObject {
    let db = Firestore.firestore()
    var userArray : [DataModel] = []
    var objectWillChange = PassthroughSubject<Array<Any>, Never>()

    init(){
        db.collection("Users").addSnapshotListener { (snapshot, err) in

            if err != nil {
                print(err!.localizedDescription)
            }else{
                self.userArray.removeAll(keepingCapacity: false)
                for document in snapshot!.documents {

                    if let name = document.get("name") as? String{

                        if let surname = document.get("surname") as? String{

                            let user = DataModel(name: name, surname: surname)
                            self.userArray.append(user)

                        }
                    }
                }

                self.objectWillChange.send(self.userArray)

            }
        }
    }
}

Sonrasında @ObjectBinding ile gelen değişiklikleri yakalayabilmemiz mümkün oluyor.  View içerisinde aşağıdaki şekilde değişkeni tanımlıyoruz.

@ObjectBinding var gelenArray = DataStore()

Daha sonra View içerisinde aşağıdaki gibi gelen veriyi listeleyebiliriz.

VStack{

   List(guncelArray.userArray){ user in

      Text(user.name)

   }

}

Kayıt Filtreleme (whereField)

Kayıt filtreleme yaparken kayıt listelemede yapılan aynı işlemler yapılıyor. Tek fark whereField ekleniyor ve belli alanların belli alanlara eşitliği veya diğer koşulları kontrol edilebiliyor. whereField yazdıtan sonra çıkan sonuçlarda koşulları inceleyebilirsiniz.

db.collection("Users").whereField("surname", isEqualTo: "vatanlar").addSnapshotListener{...

Birden fazla whereField kullanabilirsiniz. Fakat burada yada (OR) sorgusu yapmayı henüz keşfedemedim. Ve (AND) sorgusu olarak kabul görüyor. Aşağıdaki gibi birden fazla koşulu filtrelemenizde kullanabilirsiniz. OR sorgusunu kullanabilmek için zannedersem 2 ayrı sorgu yapıp sonuçları elle filtrelemeniz gerekiyor.

db.collection("Chats")
   .whereField("surname", isEqualTo: "vatanlar")
   .whereField("name", isEqualTo: "mehmet")
   .addSnapshotListener {...

Bu bilgiler henüz Beta sürümlerde olduğumuz için değişkenlik gösterebilir. Ki bu notları ben 1 kez güncelledim bile. Yine değişiklikler olursa güncelleme yapmaya çalışacağım.

Leave a Reply:

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir