ফায়ারবেস আইওএস কোডল্যাব: ফ্রেন্ডলিচ্যাট

১. সংক্ষিপ্ত বিবরণ

iOS-এর জন্য FriendlyChat কোডল্যাবে আপনাকে স্বাগতম! এই কোডল্যাবে, আপনি শিখবেন কীভাবে Firebase এবং SwiftUI, Swift Concurrency, ও Observation ফ্রেমওয়ার্কের মতো আধুনিক Swift ফিচার ব্যবহার করে একটি পূর্ণাঙ্গ রিয়েল-টাইম চ্যাট iOS অ্যাপ্লিকেশন তৈরি করতে হয়।

আপনি যা শিখবেন

  • আধুনিক অবজারভেশন ফ্রেমওয়ার্ক ( @Observable ) ব্যবহার করে স্টেট ম্যানেজ করুন।
  • Firebase Authentication ব্যবহার করে ব্যবহারকারীদের প্রমাণীকরণ করুন।
  • ক্লাউড ফায়ারস্টোর ব্যবহার করে চ্যাট বার্তাগুলো রিয়েল টাইমে সিঙ্ক্রোনাইজ করুন।
  • ক্লাউড স্টোরেজ ফর ফায়ারবেস ব্যবহার করে ইমেজ সংরক্ষণ ও পরিবেশন করুন।
  • আধুনিক সুইফট কনকারেন্সি বৈশিষ্ট্য ব্যবহার করে ফায়ারবেস এপিআই অ্যাক্সেস করুন।

আপনার যা যা লাগবে

  • Xcode-এর সর্বশেষ সংস্করণ
  • একটি iOS সিমুলেটর বা ভৌত পরীক্ষার ডিভাইস
  • আপনার ফায়ারবেস প্রজেক্ট তৈরি ও পরিচালনা করার জন্য একটি গুগল অ্যাকাউন্ট প্রয়োজন।

২. নমুনা কোডটি নিন।

কমান্ড লাইন থেকে গিটহাব রিপোজিটরিটি ক্লোন করুন:

$ git clone https://github.com/firebase/codelab-friendlychat-ios

codelab-friendlychat-ios রিপোজিটরিটিতে বেশ কয়েকটি নমুনা প্রজেক্ট রয়েছে:

  • ios-starter/swift-starter — এটি হলো শুরুর Xcode প্রজেক্ট, যেখানে SwiftUI লেআউটের কাঠামো এবং করণীয় কাজের TODO মন্তব্য রয়েছে এবং যেখানে আপনি Firebase ব্যবহার করে অ্যাপের ফিচারগুলো বাস্তবায়ন করবেন।
  • ios/swift — সম্পূর্ণ নমুনা অ্যাপ্লিকেশনসহ পূর্ণাঙ্গ Xcode প্রজেক্ট।

৩. স্টার্টার অ্যাপটি তৈরি করুন

ইউজার ইন্টারফেসের সাথে পরিচিত হওয়ার জন্য স্টার্টার অ্যাপ্লিকেশনটি বিল্ড ও রান করুন:

  1. ফাইন্ডার বা টার্মিনালে, ios-starter/swift-starter ডিরেক্টরিতে যান।
  2. এক্সকোডে প্রজেক্টটি খোলার জন্য FriendlyChatSwift.xcodeproj এ ডাবল-ক্লিক করুন।
  3. লক্ষ্য করুন যে Xcode স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ডে Swift Package Manager ডিপেন্ডেন্সিগুলো রিজলভ করে (GitHub থেকে firebase-ios-sdk v12+ ডাউনলোড করে)।
  4. একটি iOS সিমুলেটর (যেমন, iPhone 17 Pro ) নির্বাচন করুন এবং রান বোতামে (cmd+R) ক্লিক করুন।

কয়েক সেকেন্ড পর FriendlyChat লগইন স্ক্রিনটি দেখা যাবে। এই পর্যায়ে, লগইন বাটন এবং মেসেজ ফিডগুলো প্লেসহোল্ডার হিসেবে থাকবে। পরবর্তী ধাপগুলোতে আপনি অ্যাপটির সাথে Firebase সংযুক্ত করবেন।

৪. একটি ফায়ারবেস প্রজেক্ট সেট আপ করুন।

একটি নতুন ফায়ারবেস প্রজেক্ট তৈরি করুন

  1. আপনার গুগল অ্যাকাউন্ট ব্যবহার করে ফায়ারবেস কনসোলে সাইন ইন করুন।
  2. নতুন প্রজেক্ট তৈরি করতে বাটনটিতে ক্লিক করুন এবং তারপর একটি প্রজেক্টের নাম লিখুন (যেমন, FriendlyChat )।
  3. চালিয়ে যান-এ ক্লিক করুন।
  4. অনুরোধ করা হলে, Firebase-এর শর্তাবলী পর্যালোচনা করে গ্রহণ করুন এবং তারপর 'চালিয়ে যান' (Continue ) বোতামে ক্লিক করুন।
  5. (ঐচ্ছিক) Firebase কনসোলে AI সহায়তা সক্রিয় করুন (Firebase-এ এটিকে "Gemini" বলা হয়)।
  6. এই কোডল্যাবের জন্য আপনার গুগল অ্যানালিটিক্স-এর প্রয়োজন নেই , তাই গুগল অ্যানালিটিক্স অপশনটি বন্ধ করে দিন
  7. Create project-এ ক্লিক করুন, আপনার প্রজেক্টটি প্রস্তুত হওয়া পর্যন্ত অপেক্ষা করুন, এবং তারপর Continue-তে ক্লিক করুন।

আপনার ফায়ারবেস প্রাইসিং প্ল্যান আপগ্রেড করুন

Firebase-এর জন্য Cloud Storage ব্যবহার করতে হলে, আপনার Firebase প্রজেক্টটিকে পে-অ্যাজ-ইউ-গো (Blaze) প্রাইসিং প্ল্যানে থাকতে হবে, যার অর্থ হলো এটি একটি ক্লাউড বিলিং অ্যাকাউন্টের সাথে লিঙ্ক করা থাকবে।

  • ক্লাউড বিলিং অ্যাকাউন্টের জন্য ক্রেডিট কার্ডের মতো একটি পেমেন্ট পদ্ধতি প্রয়োজন।
  • আপনি যদি Firebase এবং Google Cloud-এ নতুন হন, তাহলে যাচাই করে দেখুন আপনি $300 ক্রেডিট এবং একটি ফ্রি ট্রায়াল ক্লাউড বিলিং অ্যাকাউন্টের জন্য যোগ্য কিনা।
  • আপনি যদি কোনো ইভেন্টের অংশ হিসেবে এই কোডল্যাবটি করে থাকেন, তাহলে আপনার আয়োজককে জিজ্ঞাসা করুন কোনো ক্লাউড ক্রেডিট পাওয়া যাবে কিনা।

আপনার প্রজেক্টটি ব্লেজ প্ল্যানে আপগ্রেড করতে, এই ধাপগুলো অনুসরণ করুন:

  1. Firebase কনসোলে, আপনার প্ল্যান আপগ্রেড করতে নির্বাচন করুন।
  2. ব্লেজ প্ল্যানটি নির্বাচন করুন। আপনার প্রোজেক্টের সাথে একটি ক্লাউড বিলিং অ্যাকাউন্ট লিঙ্ক করতে স্ক্রিনে দেওয়া নির্দেশাবলী অনুসরণ করুন।
    এই আপগ্রেডের অংশ হিসেবে যদি আপনার একটি ক্লাউড বিলিং অ্যাকাউন্ট তৈরি করার প্রয়োজন হয়ে থাকে, তাহলে আপগ্রেডটি সম্পন্ন করার জন্য আপনাকে ফায়ারবেস কনসোলের আপগ্রেড ফ্লো-তে ফিরে যেতে হতে পারে।

আপনার iOS অ্যাপ সংযুক্ত করুন

  1. প্রজেক্ট ওভারভিউ স্ক্রিন থেকে, অ্যাপ সেটআপ ওয়ার্কফ্লো চালু করতে iOS আইকনে ক্লিক করুন।
  2. বান্ডেল আইডিটি প্রবেশ করান:
    com.google.firebase.codelab.FriendlyChatSwift
    
  3. অ্যাপটি রেজিস্টার করতে ক্লিক করুন।

আপনার Xcode প্রজেক্টে GoogleService-Info.plist যোগ করুন

  1. কনফিগারেশন ফাইলটি সংরক্ষণ করতে Download GoogleService-Info.plist-এ ক্লিক করুন।
  2. Xcode-এ, ডাউনলোড করা GoogleService-Info.plist ফাইলটি Project Navigator-এর FriendlyChatSwift প্রধান গ্রুপে ড্র্যাগ করে নিয়ে যান।
  3. নির্দেশিত হলে, নিশ্চিত করুন যে ‘প্রয়োজনে আইটেম কপি করুন’ বিকল্পটি চেক করা আছে এবং FriendlyChatSwift টার্গেটটি নির্বাচিত আছে, তারপর ‘সমাপ্ত’ ক্লিক করুন।

FriendlyChatSwiftApp.swift এ Firebase কনফিগার করুন।

অবশেষে, আপনার SwiftUI অ্যাপ্লিকেশনটি চালু হলে আপনার প্রোজেক্ট কনফিগারেশন দিয়ে Firebase ইনিশিয়ালাইজ করুন। FriendlyChatSwiftApp.swift ফাইলটি খুলুন এবং TODO প্লেসহোল্ডারগুলিকে import FirebaseCore এবং FirebaseApp.configure() দিয়ে প্রতিস্থাপন করুন:

import SwiftUI
import FirebaseCore

@main
struct FriendlyChatSwiftApp: App {
  init() {
    FirebaseApp.configure()
  }

  var body: some Scene {
    WindowGroup {
      ContentView()
    }
  }
}

৫. ব্যবহারকারীদের প্রমাণীকরণ করুন

ফায়ারবেস কনসোলে প্রমাণীকরণ কনফিগার করুন

ব্যবহারকারীদের প্রমাণীকরণ করার আগে, আপনাকে প্রথমে ফায়ারবেস কনসোলে আপনার পছন্দের প্রমাণীকরণ প্রদানকারীকে সক্রিয় করতে হবে। এই টিউটোরিয়ালে ইমেল/পাসওয়ার্ড প্রমাণীকরণ ব্যবহার করা হয়েছে:

  1. Firebase কনসোলে, Security > Authentication- এ যান, তারপর Get started-এ ক্লিক করুন।
  2. সাইন-ইন পদ্ধতি ট্যাবটি নির্বাচন করুন।
  3. ইমেল/পাসওয়ার্ড-এ ক্লিক করুন, এনাবল টগল সুইচটিতে ক্লিক করুন এবং সেভ-এ ক্লিক করুন।

প্রমাণীকরণ নিয়ম সহ সুরক্ষিত ক্লাউড ফায়ারস্টোর

এরপরে, বার্তা পড়া বা লেখার আগে ব্যবহারকারীদের প্রমাণীকরণ বাধ্যতামূলক করুন:

  1. Firebase কনসোলে, Databases & Storage > Firestore Database- এ যান, তারপর Create database-এ ক্লিক করুন।
  2. একটি অবস্থান নির্বাচন করুন এবং পরবর্তী বোতামে ক্লিক করুন।
  3. টেস্ট মোডে স্টার্ট নির্বাচন করুন এবং ক্রিয়েট-এ ক্লিক করুন।
  4. Rules ট্যাবটি নির্বাচন করুন এবং নিরাপত্তা নিয়মগুলি নিম্নরূপে আপডেট করুন:
    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
        match /messages/{messageId} {
          allow read, write: if request.auth != null;
        }
      }
    }
    
    এই নিয়মগুলি যেকোনো প্রমাণীকৃত ব্যবহারকারীকে ডাটাবেসে বার্তা পড়তে বা লিখতে অনুমতি দেয়, যা শেখার উদ্দেশ্যে উপযুক্ত। নিরাপত্তা নিয়ম সম্পর্কে আরও জানতে নিরাপত্তা নিয়মের ডকুমেন্টেশন দেখুন
  5. প্রকাশ করুন-এ ক্লিক করুন।

UserViewModel.swift এ প্রমাণীকরণ অবস্থা পর্যবেক্ষণ করুন।

SwiftUI-তে, Firebase Auth-এর স্টেট রিঅ্যাক্টিভভাবে পর্যবেক্ষণ করলে আপনার UI লগইন স্ক্রিন এবং চ্যাট ইন্টারফেসের মধ্যে মসৃণভাবে সুইচ করতে পারে।

ViewModels/UserViewModel.swift খুলুন এবং authStateChanges AsyncSequence ব্যবহার করে অথোরাইজেশন অবস্থার পরিবর্তন পর্যবেক্ষণ করতে init() ফাংশনের ভেতরের TODO টি প্রতিস্থাপন করুন:

  init() {
    authTask = Task {
      for await user in Auth.auth().authStateChanges {
        self.user = user
      }
    }
  }

সুইফট কনকারেন্সি ব্যবহার করে সাইন-ইন, সাইন-আপ এবং সাইন-আউট বাস্তবায়ন করুন।

UserViewModel.swift এ, অবশিষ্ট TODO কমেন্টগুলোকে আধুনিক async / await Authentication মেথড দিয়ে প্রতিস্থাপন করুন:

  func signIn(email: String, password: String) async {
    errorMessage = nil
    if email.isEmpty || password.isEmpty {
      showError("Please enter both email and password.")
      return
    }
    do {
      try await Auth.auth().signIn(withEmail: email, password: password)
    } catch {
      showError(error.localizedDescription)
    }
  }

  func signUp(email: String, password: String, displayName: String) async {
    errorMessage = nil
    if email.isEmpty || password.isEmpty {
      showError("Please enter both email and password.")
      return
    }
    do {
      let result =
        try await Auth.auth().createUser(withEmail: email, password: password)
      let changeRequest = result.user.createProfileChangeRequest()
      changeRequest.displayName = displayName.isEmpty ? email : displayName
      try await changeRequest.commitChanges()
      self.user = Auth.auth().currentUser
    } catch {
      showError(error.localizedDescription)
    }
  }

  func updateDisplayName(_ displayName: String) async {
    guard let currentUser = Auth.auth().currentUser else { return }
    do {
      let changeRequest = currentUser.createProfileChangeRequest()
      changeRequest.displayName = displayName
      try await changeRequest.commitChanges()
      self.user = Auth.auth().currentUser
    } catch {
      showError(error.localizedDescription)
    }
  }

  func signOut() {
    do {
      try Auth.auth().signOut()
    } catch {
      showError(error.localizedDescription)
    }
  }

ব্যবহারকারীর প্রমাণীকরণ পরীক্ষা করুন

  1. Xcode-এ রান বাটনটি ক্লিক করুন।
  2. অ্যাপ সিমুলেটরে, 'সাইন আপ'-এ ক্লিক করুন, একটি ডিসপ্লে নেম, ইমেল এবং পাসওয়ার্ড লিখুন এবং 'সাইন আপ'-এ ট্যাপ করুন।
  3. আপনাকে স্বয়ংক্রিয়ভাবে প্রমাণীকরণ করা হবে এবং খালি মেসেজিং স্ক্রিনে নিয়ে যাওয়া হবে!

৬. ক্লাউড ফায়ারস্টোর থেকে পড়ুন

ফায়ারবেস কনসোলে নমুনা বার্তা যোগ করুন

নমুনা বার্তা দিয়ে ডাটাবেসটি পূরণ করুন:

  1. Firebase কনসোলে, Firestore Database- এ যান এবং Data ট্যাবটি নির্বাচন করুন।
  2. সংগ্রহ শুরু করতে ক্লিক করুন।
  3. কালেকশন আইডি-র জন্য messages লিখুন, তারপর নেক্সট-এ ক্লিক করুন।
  4. ডকুমেন্ট আইডি স্বয়ংক্রিয়ভাবে তৈরি হওয়ার জন্য সেট করে রাখুন (অথবা অটো-আইডি-তে ক্লিক করুন)।
  5. ডকুমেন্টে নিম্নলিখিত ফিল্ডগুলো যোগ করুন:
    • text (টাইপ: string , মান: Hello )
    • displayName (type: string , value: anonymous )
  6. সংরক্ষণ করুন- এ ক্লিক করুন।
  7. ঐচ্ছিকভাবে আরও নমুনা বার্তা যোগ করতে 'অ্যাড ডকুমেন্ট'-এ ক্লিক করুন।

FriendlyMessageViewModel.swift এ বার্তাগুলি সিঙ্ক্রোনাইজ করুন

SwiftUI-তে, একটি @Observable মডেল ডিক্লারেটিভ UI আপডেট পরিচালনা করে। ViewModels/FriendlyMessageViewModel.swift খুলুন এবং snapshots AsyncSequence ব্যবহার করে startListening() এবং stopListening() ইমপ্লিমেন্ট করুন:

  func startListening() {
    stopListening()
    listenerTask = Task {
      let db = Firestore.firestore()
      do {
        for try await snapshot in db.collection("messages").snapshots {
          self.messages = snapshot.documents.compactMap { document in
            try? document.data(as: FriendlyMessage.self)
          }
        }
      } catch {
        print("Error listening for messages: \(error)")
      }
    }
  }

  func stopListening() {
    listenerTask?.cancel()
    listenerTask = nil
    messages.removeAll()
  }

SwiftUI কীভাবে বার্তাগুলি রেন্ডার এবং অটো-স্ক্রোল করে

Views/ContentView.swift এ লক্ষ্য করুন, কীভাবে ScrollViewReader এবং LazyVStack চ্যাট বাবলগুলো রেন্ডার করে এবং messages.count পরিবর্তিত হলেই স্বয়ংক্রিয়ভাবে নতুনতম মেসেজে স্ক্রল করে:

ScrollViewReader { scrollViewReader in
  ScrollView {
    LazyVStack(spacing: 12) {
      ForEach(messageViewModel.messages) { message in
        FriendlyMessageView(friendlyMessage: message)
          .id(message.id)
      }
    }
    .padding(.horizontal)
    .onChange(of: messageViewModel.messages.count) { _, count in
      guard count > 0,
            let lastId = messageViewModel.messages.last?.id else { return }
      withAnimation(.easeInOut) {
        scrollViewReader.scrollTo(lastId, anchor: .bottom)
      }
    }
  }
}

ভিউ মডেলের মাধ্যমে ডাটাবেস স্টেটকে সরাসরি UI স্টেটের সাথে যুক্ত করে, SwiftUI অ্যাপ কোডকে ট্রানজিশন ও অ্যানিমেশনকে সুন্দরভাবে ম্যাপ করার সুযোগ দেয়। পরবর্তী ধাপে, এই অ্যানিমেশনটি বাস্তবে পর্যবেক্ষণ করার জন্য আপনি অ্যাপ থেকে ডাটাবেসে ডেটা লিখবেন।

৭. বার্তা পাঠান

সুইফট কনকারেন্সি ব্যবহার করে sendMessage বাস্তবায়ন করুন

যখন আপনি addDocument() ব্যবহার করে কোনো কালেকশনে একটি ডকুমেন্ট যোগ করেন, তখন ক্লাউড ফায়ারস্টোর প্রতিটি চ্যাট মেসেজের জন্য একটি অনন্য আইডি তৈরি করে।

ViewModels/FriendlyMessageViewModel.swift ফাইলে, sendMessage(text:imageUrl:) এর ভেতরের TODO একটি async throws মেথড দিয়ে প্রতিস্থাপন করুন:

  func sendMessage(text: String?, imageUrl: String?) async throws {
    guard let currentUser = Auth.auth().currentUser else { return }
    let message = FriendlyMessage(
      text: text,
      displayName: currentUser.displayName ?? currentUser.email ?? "Anonymous",
      imageUrl: imageUrl,
      userId: currentUser.uid
    )
    let db = Firestore.firestore()
    _ = try db.collection("messages").addDocument(from: message)
  }

বার্তা পাঠানোর পরীক্ষা

  1. Xcode-এ রান বাটনটি ক্লিক করুন।
  2. আপনার অ্যাকাউন্টে সাইন ইন করুন।
  3. নিচের টেক্সট ফিল্ডে একটি বার্তা টাইপ করুন এবং সেন্ড আইকনে ট্যাপ করুন।
  4. আপনার সিমুলেটরে বার্তাটি সঙ্গে সঙ্গে প্রদর্শিত হতে দেখুন!

৮. ছবি সংরক্ষণ ও গ্রহণ করা

ফায়ারবেসের জন্য ক্লাউড স্টোরেজ সেট আপ করুন

  1. Firebase কনসোলে, Databases & Storage > Storage- এ যান, তারপর Get started-এ ক্লিক করুন।
  2. টেস্ট মোডে স্টার্ট নির্বাচন করুন এবং নেক্সট-এ ক্লিক করুন।
  3. ডিফল্ট স্টোরেজ লোকেশনটি গ্রহণ করুন এবং 'সম্পন্ন' ক্লিক করুন।

SwiftUI PhotosPicker ব্যবহার করে নেটিভ ইমেজ বাছাই

আধুনিক SwiftUI (iOS 16+) import PhotosUI PhotosPicker এর মাধ্যমে সরাসরি ছবি নির্বাচনের সুবিধা দেয় — এর জন্য কোনো UIKit ডেলিগেট ব্রিজ বা UIImagePickerController র‍্যাপারের প্রয়োজন হয় না!

Views/FooterView.swift ফাইলে লক্ষ্য করুন, PhotosPicker কীভাবে নির্বাচিত ছবিগুলোকে সংযুক্ত করে:

PhotosPicker(selection: $selectedItem, matching: .images) {
  Image(systemName: "photo.on.rectangle.angled")
    .font(.system(size: 26))
    .foregroundStyle(.blue)
    .accessibilityLabel("Select photo")
}
.onChange(of: selectedItem) { _, newItem in
  Task {
    if let data = try? await newItem?.loadTransferable(type: Data.self) {
      await uploadAndSendImage(data: data)
    }
  }
}

ছবি আপলোড করার ব্যবস্থা করুন

যখন কোনো ছবি নির্বাচন করা হবে, তখন ছবির ডেটা ক্লাউড স্টোরেজে আপলোড করুন এবং পাবলিক ডাউনলোড ইউআরএলটি ক্লাউড ফায়ারস্টোরে সংরক্ষণ করুন।

Views/FooterView.swift ফাইলে, uploadAndSendImage(data:) এর ভেতরের TODO টি প্রতিস্থাপন করুন:

  private func uploadAndSendImage(data: Data) async {
    guard let uid = Auth.auth().currentUser?.uid else { return }
    isUploading = true
    defer {
      isUploading = false
      selectedItem = nil
    }
    do {
      let filename = "\(uid)/\(UUID().uuidString).jpg"
      let storageRef =
        Storage.storage().reference().child("images").child(filename)
      let metadata = StorageMetadata()
      metadata.contentType = "image/jpeg"

      _ = try await storageRef.putDataAsync(data, metadata: metadata)
      let downloadURL = try await storageRef.downloadURL()
      try await viewModel.sendMessage(
        text: nil, imageUrl: downloadURL.absoluteString)
    } catch {
      print("Error uploading image: \(error.localizedDescription)")
    }
  }

ক্লাউড স্টোরেজের সাথে ছবি শেয়ার করা

Views/FriendlyMessageImageView.swift এ, Swift Concurrency এবং Cloud Storage SDK ব্যবহার করে ছবির URL-গুলো অ্যাসিঙ্ক্রোনাসভাবে লোড করা হয়:

  • URLSession মাধ্যমে স্ট্যান্ডার্ড HTTP/HTTPS ডাউনলোড ইউআরএলগুলো অ্যাসিঙ্ক্রোনাসভাবে সংগ্রহ করা হয়।
  • Google Cloud Storage URL-গুলো (যেমন, gs://... ) Storage.storage().reference(forURL:) ব্যবহার করে আনা হয়।

পরীক্ষার ছবির বার্তা

  1. Xcode-এ রান বাটনটি ক্লিক করুন।
  2. আপনার অ্যাকাউন্টে সাইন ইন করুন।
  3. ফটো আইকনে ট্যাপ করুন, লাইব্রেরি থেকে একটি ছবি বেছে নিন এবং দেখুন সেটি আপলোড হয়ে চ্যাটে চলে আসছে!

৯. উপসংহার

অভিনন্দন, আপনি Swift এবং Firebase ব্যবহার করে সফলভাবে একটি রিয়েল-টাইম iOS চ্যাট অ্যাপ্লিকেশন তৈরি করেছেন!

আপনি যা শিখেছেন

  • firebase-ios-sdk এর জন্য Swift Package Manager (SPM) Xcode ইন্টিগ্রেশন।
  • SwiftUI ডিক্লারেটিভ লেআউট, PhotosPicker , এবং ScrollViewReader অটো-স্ক্রোলিং।
  • অথেনটিকেশন, ক্লাউড ফায়ারস্টোর এবং ক্লাউড স্টোরেজ জুড়ে দ্রুত কনকারেন্সি ( async / await )
  • প্রতিক্রিয়াশীল অবস্থা পর্যবেক্ষণের সাথে ইমেল/পাসওয়ার্ড ও পরিচয় গোপন রেখে প্রমাণীকরণ
  • ক্লাউড ফায়ারস্টোর রিয়েল-টাইম স্ন্যাপশট লিসেনিং এবং স্বয়ংক্রিয় আইডি রাইট।
  • ফায়ারবেস বাইনারি আপলোড এবং পাবলিক ডাউনলোড ইউআরএল-এর জন্য ক্লাউড স্টোরেজ

আরও জানুন