1. खास जानकारी
Friendly Chat के कोडलैब में आपका स्वागत है. इस कोडलैब में, iOS ऐप्लिकेशन बनाने के लिए Firebase प्लैटफ़ॉर्म का इस्तेमाल करने का तरीका बताया गया है. आपको चैट क्लाइंट लागू करना होगा और Firebase का इस्तेमाल करके उसकी परफ़ॉर्मेंस को मॉनिटर करना होगा.
आपको इनके बारे में जानकारी मिलेगी
- उपयोगकर्ताओं को साइन इन करने की अनुमति दें.
- Firebase रीयल टाइम डेटाबेस का इस्तेमाल करके डेटा सिंक करें.
- Firebase स्टोरेज में बाइनरी फ़ाइलें सेव करना.
आपको इन चीज़ों की ज़रूरत होगी
- Xcode
- CocoaPods
- iOS 8.0 या इसके बाद के वर्शन वाला टेस्ट डिवाइस या सिम्युलेटर
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
iOS ऐप्लिकेशन बनाने के अपने अनुभव को आप कितनी रेटिंग देंगे?
2. सैंपल कोड पाना
कमांड लाइन से GitHub के डेटा स्टोर करने की जगह को क्लोन करें.
$ git clone https://github.com/firebase/codelab-friendlychat-ios
3. स्टार्टर ऐप्लिकेशन बनाना
स्टार्टर ऐप्लिकेशन बनाने के लिए:
- टर्मिनल विंडो में, सैंपल कोड डाउनलोड करने के बाद,
ios-starter/swift-starter
डायरेक्ट्री पर जाएं - रन
pod install --repo-update
- Xcode में प्रोजेक्ट खोलने के लिए, FriendlyChatSwift.xcworkspace फ़ाइल खोलें.
- चालू करें बटन पर क्लिक करें.
कुछ सेकंड बाद, आपको फ़्रेंडली चैट की होम स्क्रीन दिखेगी. आपको यूज़र इंटरफ़ेस दिखेगा. हालांकि, इस दौरान साइन इन नहीं किया जा सकता, मैसेज नहीं भेजे जा सकते और न ही पाए जा सकते. अगला चरण पूरा करने तक, ऐप्लिकेशन एक अपवाद के साथ बंद हो जाएगा.
4. Firebase कंसोल प्रोजेक्ट बनाना
प्रोजेक्ट बनाना
Firebase कंसोल में, प्रोजेक्ट जोड़ें को चुनें.
प्रोजेक्ट को FriendlyChat
नाम दें. इसके बाद, प्रोजेक्ट बनाएं पर क्लिक करें.
Firebase के प्लान को अपग्रेड करना
'Firebase के लिए Cloud Storage' का इस्तेमाल करने के लिए, आपका Firebase प्रोजेक्ट पे-ऐज़-यू-गो (Blaze) कीमत वाले प्लान पर होना चाहिए. इसका मतलब है कि यह Cloud Billing खाते से लिंक होना चाहिए.
- Cloud Billing खाते के लिए, क्रेडिट कार्ड जैसा पेमेंट का कोई तरीका होना ज़रूरी है.
- अगर आपने Firebase और Google Cloud का इस्तेमाल पहले कभी नहीं किया है, तो देखें कि क्या आपको 300 डॉलर का क्रेडिट और मुफ़्त में आज़माने के लिए Cloud Billing खाता मिल सकता है.
- अगर आपने किसी इवेंट के तहत यह कोडलैब किया है, तो इवेंट के आयोजक से पूछें कि क्या कोई Cloud क्रेडिट उपलब्ध है.
अपने प्रोजेक्ट को Blaze प्लान पर अपग्रेड करने के लिए, यह तरीका अपनाएं:
- Firebase कंसोल में, अपना प्लान अपग्रेड करें को चुनें.
- ब्लेज़ प्लान चुनें. अपने प्रोजेक्ट से क्लाउड बिलिंग खाता लिंक करने के लिए, स्क्रीन पर दिए गए निर्देशों का पालन करें.
अगर आपको इस अपग्रेड के तहत क्लाउड बिलिंग खाता बनाना पड़ा है, तो अपग्रेड पूरा करने के लिए, आपको Firebase Console में अपग्रेड फ़्लो पर वापस जाना पड़ सकता है.
अपना iOS ऐप्लिकेशन कनेक्ट करना
- अपने नए प्रोजेक्ट की प्रोजेक्ट की खास जानकारी वाली स्क्रीन पर, अपने iOS ऐप्लिकेशन में Firebase जोड़ें पर क्लिक करें.
- बंडल आईडी को "
com.google.firebase.codelab.FriendlyChatSwift
" के तौर पर डालें. - App Store आईडी को "
123456
" के तौर पर डालें. - ऐप्लिकेशन रजिस्टर करें पर क्लिक करें.
अपने ऐप्लिकेशन में GoogleService-Info.plist फ़ाइल जोड़ना
दूसरी स्क्रीन पर, GoogleService-Info.plist डाउनलोड करें पर क्लिक करके, एक कॉन्फ़िगरेशन फ़ाइल डाउनलोड करें. इसमें आपके ऐप्लिकेशन के लिए ज़रूरी Firebase मेटाडेटा शामिल होता है. उस फ़ाइल को अपने ऐप्लिकेशन में कॉपी करें और उसे FriendlyChatSwift टारगेट में जोड़ें.
अब पॉप-अप को बंद करने के लिए, इसके ऊपरी दाएं कोने में मौजूद "x" पर क्लिक करें. इसके बाद, तीसरे और चौथे चरण को छोड़ दें, क्योंकि आपको यहां ये चरण पूरे करने होंगे.
Firebase मॉड्यूल इंपोर्ट करना
सबसे पहले, यह पक्का करें कि Firebase
मॉड्यूल इंपोर्ट हो गया हो.
AppDelegate.swift, FCViewController.swift
import Firebase
AppDelegate में Firebase कॉन्फ़िगर करना
अपनी .plist फ़ाइल से Firebase की सेवाओं को कॉन्फ़िगर करने के लिए, application:didFinishLaunchingWithOptions फ़ंक्शन में FirebaseApp में "configure" तरीके का इस्तेमाल करें.
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
GIDSignIn.sharedInstance().delegate = self
return true
}
5. उपयोगकर्ताओं की पहचान करना
पुष्टि किए गए उपयोगकर्ताओं के लिए पाबंदी लगाने के लिए नियमों का इस्तेमाल करना
हम अब एक नियम जोड़ेंगे, ताकि कोई भी मैसेज पढ़ने या लिखने से पहले, पुष्टि करना ज़रूरी हो. इसके लिए, हम अपने मैसेज डेटा ऑब्जेक्ट में ये नियम जोड़ते हैं. Firebase कंसोल के डेटाबेस सेक्शन में जाकर, रीयल टाइम डेटाबेस चुनें. इसके बाद, नियम टैब पर क्लिक करें. इसके बाद, नियमों को अपडेट करें, ताकि वे इस तरह दिखें:
{
"rules": {
"messages": {
".read": "auth != null",
".write": "auth != null"
}
}
}
इस सुविधा के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, Firebase का सुरक्षा दस्तावेज़ देखें. इसमें "auth" वैरिएबल का दस्तावेज़ भी शामिल है.
पुष्टि करने वाले एपीआई कॉन्फ़िगर करना
आपका ऐप्लिकेशन, उपयोगकर्ताओं की ओर से Firebase Authentication API को ऐक्सेस कर सके, इसके लिए आपको इसे चालू करना होगा
- Firebase कंसोल पर जाएं और अपना प्रोजेक्ट चुनें
- पुष्टि करना चुनें
- साइन इन करने का तरीका टैब चुनें
- Google स्विच को टॉगल करके चालू (नीला) करें
- इसके बाद दिखने वाले डायलॉग बॉक्स में, सेव करें दबाएं
अगर आपको इस कोडलैब में बाद में "CONFIGURATION_NOT_FOUND" मैसेज के साथ गड़बड़ियां मिलती हैं, तो इस चरण पर वापस आएं और अपने काम की दोबारा जांच करें.
Firebase Auth पर निर्भरता की पुष्टि करना
पुष्टि करें कि Podfile
फ़ाइल में Firebase Auth की डिपेंडेंसी मौजूद हैं.
Podfile
pod 'Firebase/Auth'
Google Sign In के लिए, Info.plist सेटअप करें.
आपको अपने XCode प्रोजेक्ट में कस्टम यूआरएल स्कीम जोड़नी होगी.
- अपना प्रोजेक्ट कॉन्फ़िगरेशन खोलें: बाईं ओर मौजूद ट्री व्यू में, प्रोजेक्ट के नाम पर दो बार क्लिक करें. 'टारगेट' सेक्शन से अपना ऐप्लिकेशन चुनें. इसके बाद, 'जानकारी' टैब चुनें और 'यूआरएल टाइप' सेक्शन को बड़ा करें.
- + बटन पर क्लिक करें और अपने उलटे क्लाइंट आईडी के लिए यूआरएल स्कीम जोड़ें. यह वैल्यू ढूंढने के लिए, GoogleService-Info.plist कॉन्फ़िगरेशन फ़ाइल खोलें और REVERSED_CLIENT_ID कुंजी ढूंढें. उस कुंजी की वैल्यू कॉपी करें और उसे कॉन्फ़िगरेशन पेज पर मौजूद यूआरएल स्कीमा बॉक्स में चिपकाएं. अन्य फ़ील्ड खाली छोड़ें.
- पूरा होने के बाद, आपका कॉन्फ़िगरेशन कुछ ऐसा दिखेगा (हालांकि, इसमें आपके ऐप्लिकेशन के हिसाब से वैल्यू होंगी):
Google Sign In के लिए clientID सेट करना
Firebase कॉन्फ़िगर होने के बाद, "didFinishLaunchingWithOptions:" तरीके में Google Sign In को सेट अप करने के लिए, clientID का इस्तेमाल किया जा सकता है.
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
GIDSignIn.sharedInstance().delegate = self
return true
}
साइन इन हैंडलर जोड़ना
Google साइन इन की पुष्टि हो जाने के बाद, Firebase से पुष्टि करने के लिए उस खाते का इस्तेमाल करें.
AppDelegate.swift
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
if let error = error {
print("Error \(error)")
return
}
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
accessToken: authentication.accessToken)
Auth.auth().signIn(with: credential) { (user, error) in
if let error = error {
print("Error \(error)")
return
}
}
}
उपयोगकर्ता को अपने-आप साइन इन कराएं. इसके बाद, Firebase Auth में एक लिसनर जोड़ें, ताकि साइन इन करने के बाद उपयोगकर्ता को ऐप्लिकेशन में जाने की अनुमति दी जा सके. और deinit होने पर लिसनर को हटा दें.
SignInViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().signInSilently()
handle = Auth.auth().addStateDidChangeListener() { (auth, user) in
if user != nil {
MeasurementHelper.sendLoginEvent()
self.performSegue(withIdentifier: Constants.Segues.SignInToFp, sender: nil)
}
}
}
deinit {
if let handle = handle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
साइन आउट करना
साइन आउट करने का तरीका जोड़ना
FCViewController.swift
@IBAction func signOut(_ sender: UIButton) {
let firebaseAuth = Auth.auth()
do {
try firebaseAuth.signOut()
dismiss(animated: true, completion: nil)
} catch let signOutError as NSError {
print ("Error signing out: \(signOutError.localizedDescription)")
}
}
साइन इन किए हुए उपयोगकर्ता के तौर पर मैसेज पढ़ने की सुविधा की जांच करना
- चालू करें बटन पर क्लिक करें.
- इसके बाद, आपको तुरंत साइन-इन स्क्रीन पर भेज दिया जाएगा. 'Google से साइन इन करें' बटन पर टैप करें.
- अगर सब कुछ ठीक से काम करता है, तो आपको मैसेजिंग स्क्रीन पर भेज दिया जाएगा.
6. रीयलटाइम डेटाबेस चालू करना
Messages में मैसेज इंपोर्ट करना
Firebase कंसोल में अपने प्रोजेक्ट में, बाईं ओर मौजूद नेविगेशन बार में डेटाबेस आइटम चुनें. डेटाबेस के ओवरफ़्लो मेन्यू में, JSON इंपोर्ट करें चुनें. friendlychat डायरेक्ट्री में initial_messages.json
फ़ाइल पर जाएं और उसे चुनें. इसके बाद, इंपोर्ट करें बटन पर क्लिक करें. इससे आपके डेटाबेस में मौजूद मौजूदा डेटा बदल जाएगा. आइटम जोड़ने और हटाने के लिए, हरे + और लाल x का इस्तेमाल करके, सीधे डेटाबेस में भी बदलाव किया जा सकता है.
डेटाबेस इंपोर्ट करने के बाद, यह कुछ ऐसा दिखेगा:
Firebase डेटाबेस पर निर्भरता की पुष्टि करना
Podfile
फ़ाइल के डिपेंडेंसी ब्लॉक में, पुष्टि करें कि Firebase/Database
शामिल है.
Podfile
pod 'Firebase/Database'
मौजूदा मैसेज सिंक करना
ऐसा कोड जोड़ें जो ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में, नए जोड़े गए मैसेज सिंक करता हो.
इस सेक्शन में जोड़ा गया कोड:
- Firebase डेटाबेस को शुरू करें और डेटाबेस में किए गए बदलावों को मैनेज करने के लिए, एक लिसनर जोड़ें.
DataSnapshot
को अपडेट करें, ताकि नए मैसेज दिखें.
अपने FCViewController के "deinit", "configureDatabase", और "tableView:cellForRow indexPath:" तरीकों में बदलाव करें. इसके बाद, उन्हें नीचे दिए गए कोड से बदलें:
FCViewController.swift
deinit {
if let refHandle = _refHandle {
self.ref.child("messages").removeObserver(withHandle: _refHandle)
}
}
func configureDatabase() {
ref = Database.database().reference()
// Listen for new messages in the Firebase database
_refHandle = self.ref.child("messages").observe(.childAdded, with: { [weak self] (snapshot) -> Void in
guard let strongSelf = self else { return }
strongSelf.messages.append(snapshot)
strongSelf.clientTable.insertRows(at: [IndexPath(row: strongSelf.messages.count-1, section: 0)], with: .automatic)
})
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Dequeue cell
let cell = self.clientTable.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath)
// Unpack message from Firebase DataSnapshot
let messageSnapshot = self.messages[indexPath.row]
guard let message = messageSnapshot.value as? [String: String] else { return cell }
let name = message[Constants.MessageFields.name] ?? ""
let text = message[Constants.MessageFields.text] ?? ""
cell.textLabel?.text = name + ": " + text
cell.imageView?.image = UIImage(named: "ic_account_circle")
if let photoURL = message[Constants.MessageFields.photoURL], let URL = URL(string: photoURL),
let data = try? Data(contentsOf: URL) {
cell.imageView?.image = UIImage(data: data)
}
return cell
}
मैसेज सिंक करने की सुविधा की जांच करना
- चालू करें बटन पर क्लिक करें.
- मैसेज विंडो पर जाने के लिए, शुरू करने के लिए साइन इन करें बटन पर क्लिक करें.
- "मैसेज" एंट्री के बगल में मौजूद हरे रंग के + चिह्न पर क्लिक करके, सीधे Firebase कंसोल में नए मैसेज जोड़ें. इसके बाद, इस तरह का ऑब्जेक्ट जोड़ें:
- पुष्टि करें कि वे फ़्रेंडली-चैट यूज़र इंटरफ़ेस में दिखते हैं.
7. मैसेज भेजना
मैसेज भेजने की सुविधा लागू करना
डेटाबेस में वैल्यू डालें. Firebase रीयल टाइम डेटाबेस में डेटा जोड़ने के लिए, पुश तरीके का इस्तेमाल करने पर, अपने-आप एक आईडी जुड़ जाएगा. अपने-आप जनरेट होने वाले ये आईडी क्रम में होते हैं. इससे यह पक्का होता है कि नए मैसेज सही क्रम में जोड़े जाएंगे.
अपने FCViewController के "sendMessage:" तरीके में बदलाव करें. इसके लिए, नीचे दिए गए कोड से बदलें:
FCViewController.swift
func sendMessage(withData data: [String: String]) {
var mdata = data
mdata[Constants.MessageFields.name] = Auth.auth().currentUser?.displayName
if let photoURL = Auth.auth().currentUser?.photoURL {
mdata[Constants.MessageFields.photoURL] = photoURL.absoluteString
}
// Push data to Firebase Database
self.ref.child("messages").childByAutoId().setValue(mdata)
}
मैसेज भेजने की सुविधा की जांच करना
- चालू करें बटन पर क्लिक करें.
- मैसेज विंडो पर जाने के लिए, साइन इन करें पर क्लिक करें.
- मैसेज लिखें और भेजें पर टैप करें. नया मैसेज, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) और Firebase कंसोल में दिखना चाहिए.
8. इमेज सेव करना और उन्हें पाना
Firebase स्टोरेज पर निर्भरता की पुष्टि करना
Podfile
के डिपेंडेंसी ब्लॉक में, पुष्टि करें कि Firebase/Storage
शामिल है.
Podfile
pod 'Firebase/Storage'
Firebase के लिए Cloud Storage सेट अप करना
अपने Firebase प्रोजेक्ट में, 'Firebase के लिए Cloud Storage' सेट अप करने का तरीका यहां बताया गया है:
- Firebase कंसोल के बाएं पैनल में, बिल्ड को बड़ा करें. इसके बाद, स्टोरेज चुनें.
- शुरू करें पर क्लिक करें.
- अपनी डिफ़ॉल्ट स्टोरेज बकेट के लिए कोई जगह चुनें.
US-WEST1
,US-CENTRAL1
, औरUS-EAST1
में मौजूद बकेट, Google Cloud Storage के लिए "हमेशा मुफ़्त" टीयर का फ़ायदा ले सकती हैं. अन्य सभी जगहों की बकेट के लिए, Google Cloud Storage की कीमत और इस्तेमाल लागू होता है. - टेस्ट मोड में शुरू करें पर क्लिक करें. सुरक्षा नियमों के बारे में डिसक्लेमर पढ़ें.
इस कोडलैब में आगे, आपको अपने डेटा को सुरक्षित रखने के लिए सुरक्षा नियम जोड़ने होंगे. अपनी स्टोरेज बकेट के लिए सुरक्षा नियम जोड़े बिना, न किसी ऐप्लिकेशन को सार्वजनिक तौर पर डिस्ट्रिब्यूट या एक्सपोज़ करें. - बनाएं पर क्लिक करें.
FirebaseStorage को कॉन्फ़िगर करना
FCViewController.swift
func configureStorage() {
storageRef = Storage.storage().reference()
}
मौजूदा मैसेज में इमेज पाना
Firebase Storage से इमेज डाउनलोड करने वाला कोड जोड़ें.
अपने FCViewController के "tableView: cellForRowAt indexPath:" तरीके में बदलाव करें. इसके बाद, नीचे दिए गए कोड से बदलें:
FCViewController.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Dequeue cell
let cell = self.clientTable .dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath)
// Unpack message from Firebase DataSnapshot
let messageSnapshot: DataSnapshot! = self.messages[indexPath.row]
guard let message = messageSnapshot.value as? [String:String] else { return cell }
let name = message[Constants.MessageFields.name] ?? ""
if let imageURL = message[Constants.MessageFields.imageURL] {
if imageURL.hasPrefix("gs://") {
Storage.storage().reference(forURL: imageURL).getData(maxSize: INT64_MAX) {(data, error) in
if let error = error {
print("Error downloading: \(error)")
return
}
DispatchQueue.main.async {
cell.imageView?.image = UIImage.init(data: data!)
cell.setNeedsLayout()
}
}
} else if let URL = URL(string: imageURL), let data = try? Data(contentsOf: URL) {
cell.imageView?.image = UIImage.init(data: data)
}
cell.textLabel?.text = "sent by: \(name)"
} else {
let text = message[Constants.MessageFields.text] ?? ""
cell.textLabel?.text = name + ": " + text
cell.imageView?.image = UIImage(named: "ic_account_circle")
if let photoURL = message[Constants.MessageFields.photoURL], let URL = URL(string: photoURL),
let data = try? Data(contentsOf: URL) {
cell.imageView?.image = UIImage(data: data)
}
}
return cell
}
9. इमेज मैसेज भेजना
'इमेज स्टोर करें और भेजें' सुविधा को लागू करना
उपयोगकर्ता से कोई इमेज अपलोड करें. इसके बाद, इस इमेज के स्टोरेज यूआरएल को डेटाबेस से सिंक करें, ताकि यह इमेज मैसेज में भेजी जा सके.
अपने FCViewController के "imagePickerController: didFinishPickingMediaWithInfo:" तरीके में बदलाव करें. इसके बाद, नीचे दिए गए कोड से बदलें:
FCViewController.swift
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : Any]) {
picker.dismiss(animated: true, completion:nil)
guard let uid = Auth.auth().currentUser?.uid else { return }
// if it's a photo from the library, not an image from the camera
if #available(iOS 8.0, *), let referenceURL = info[UIImagePickerControllerReferenceURL] as? URL {
let assets = PHAsset.fetchAssets(withALAssetURLs: [referenceURL], options: nil)
let asset = assets.firstObject
asset?.requestContentEditingInput(with: nil, completionHandler: { [weak self] (contentEditingInput, info) in
let imageFile = contentEditingInput?.fullSizeImageURL
let filePath = "\(uid)/\(Int(Date.timeIntervalSinceReferenceDate * 1000))/\((referenceURL as AnyObject).lastPathComponent!)"
guard let strongSelf = self else { return }
strongSelf.storageRef.child(filePath)
.putFile(from: imageFile!, metadata: nil) { (metadata, error) in
if let error = error {
let nsError = error as NSError
print("Error uploading: \(nsError.localizedDescription)")
return
}
strongSelf.sendMessage(withData: [Constants.MessageFields.imageURL: strongSelf.storageRef.child((metadata?.path)!).description])
}
})
} else {
guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
let imageData = UIImageJPEGRepresentation(image, 0.8)
let imagePath = "\(uid)/\(Int(Date.timeIntervalSinceReferenceDate * 1000)).jpg"
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
self.storageRef.child(imagePath)
.putData(imageData!, metadata: metadata) { [weak self] (metadata, error) in
if let error = error {
print("Error uploading: \(error)")
return
}
guard let strongSelf = self else { return }
strongSelf.sendMessage(withData: [Constants.MessageFields.imageURL: strongSelf.storageRef.child((metadata?.path)!).description])
}
}
}
इमेज मैसेज भेजने और पाने की सुविधा की जांच करना
- चालू करें बटन पर क्लिक करें.
- मैसेज विंडो पर जाने के लिए, साइन इन करें पर क्लिक करें.
- कोई फ़ोटो चुनने के लिए, "फ़ोटो जोड़ें" आइकॉन पर क्लिक करें. फ़ोटो वाला नया मैसेज, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) और Firebase कंसोल में दिखना चाहिए.
10. बधाई हो!
आपने रीयल-टाइम चैट ऐप्लिकेशन को आसानी से बनाने के लिए, Firebase का इस्तेमाल किया है.
हमने क्या-क्या शामिल किया है
- रीयल टाइम डेटाबेस
- फ़ेडरेटेड साइन इन
- डिवाइस का स्टोरेज