EasyFirebase - a Swift wrapper for all things Firebase

Overview

Social Preview

Firebase for iOS and macOS made easy.

๐Ÿ Third-party authentication done in a single line of code

โœ‰๏ธ Send and receive Firestore documents in a snap

๐Ÿ˜€ Predefined user protocols with built-in features

๐Ÿ”ฅ Firebase solutions in one native Swift package

๐Ÿ“˜ Fully documented code with examples


โš ๏ธ Note: This package is still under development and its contents are freely subject to change.

๐Ÿ“š Ready to get started? Check out our complete wiki for detailed guides.

GitHub release (latest SemVer) GitHub Release Date GitHub issues GitHub pull requests

What is EasyFirebase?

EasyFirebase is a Swift wrapper for all things Firebase. Save hours from implementing the Firebase code in your projects repeatedly. EasyFirebase makes document storage and retrieval easier by providing intuitive protocols for Firestore. EasyFirebase makes authentication easier with the EasyUser (subclassable) open class and simple one-line sign-in with Google and Apple. EasyFirebase is cross-platform and works with both iOS and macOS.

Completed Features

  • Firestore Support
  • Authentication Support
  • Storage Support
    • Data storage โ†’
    • Safe data overriding
    • Data removal
    • Data upload task visibility
  • Cloud Messaging Support
    • Built-in user notifications โ†’
    • Built-in MessagingNotification protocol
    • Built-in 3P notifications
    • User notification settings
  • Analytics Support

All the above features are cross-platform and are supported on both iOS and macOS.

โญ๏ธ This means EasyFirebase is the quickest way to implement Sign In with Google on macOS! โญ๏ธ

Get Started

Add EasyFirebase to your project using Swift Package Manager:

https://github.com/Flowductive/easy-firebase

Import EasyFirebase:

import EasyFirebase

Configure at app launch:

// You don't need to call FirebaseApp.configure() when this is called!
EasyFirebase.configure()

๐Ÿ”ฅ Firestore Feature Showcase

Built-in Document protocol

Save time writing model classes with the built-in Document protocol:

class Car: Document {
  
  // These properties are inherited from Document
  var id: String = UUID().uuidString
  var dateCreated: Date = Date()
  
  // Define your own custom properties
  var make: String
  var model: String
  var year: Int
  
  init(make: String, model: String, year: Int) {
    // ...
  }
}

Document Storage

Store documents anywhere in your code:

var myCar = Car(make: "Toyota", model: "Corolla", year: 2017)

// Store the car instance in the 'car' collection in Firestore
myCar.set()

// Static method that does the same as above
EasyFirestore.Storage.set(myCar)

Document Retrieval

Grab documents easily without needing to specify a collection name:

EasyFirestore.Retrieval.get(id: myCarID, ofType: Car.self) { car in
  guard let car = car else { return }
  self.myOtherCar = car
}

Update Listeners

Grab documents and update the local instance when changed in Firestore:

EasyFirestore.Listening.listen(to: otherCarID, ofType: Car.self, key: "myCarListenerKey") { car in
  // Updates when changed in Firestore
  guard let car = car else { return }
  self.myOtherCar = car
}

Built-In Cacheing

EasyFirestore will automatically cache fetched documents locally and will use the cached doucments when retrieving to reduce your Firestore read count.

// EasyFirebase will automatically cache fetched objects for you, here is a manual example
EasyFirestore.Cacheing.register(myCar)

// Get locally cached objects instantly. Retrieving objects using EasyFirestore.Retrieval will grab cached objects if they exist
var cachedCar = EasyFirestore.Cacheing.grab(myCarID, fromType: Car.self)

Easy Linking

Link child documents to an array of IDs in a parent document:

var car1 = Car(make: "Toyota", model: "Corolla", year: 2017)
var car2 = Car(make: "Honda", model: "Civic", year: 2019)

var dealership = Dealership(name: "Los Angeles Dealership")

// Set and assign the Toyota Corolla to the Los Angeles Dealership
car1.setAssign(toField: "cars", using: \.cars, in: dealership)

// Set and assign the Honda Civic to the Los Angeles Dealership
car2.set()
car2.assign(toField: "cars", using: \.cars, in: dealership)

Swifty Querying

Easily query for documents:

EasyFirestore.Querying.where(\Car.make, .equals, "Toyota") { cars in
  // Handle your queried documents here...
}

Use multiple conditions for queries; order and limit results:

EasyFirestore.Querying.where((\Car.year, .greaterEqualTo, 2010),
                             (\Car.model, .in, ["Corolla", "Camry"]),
                             order: .ascending,
                             limit: 5
) { cars in
  // ...
}

๐Ÿ”‘ Authentication Feature Showcase

Easy User Protocol

Save time writing user classes with the built-in EasyUser open class:

class MyUser: EasyUser {
  
  // EasyUser comes pre-built with these automatically updated properties
  var lastSignon: Date
  var displayName: String
  var username: String
  var email: String
  var appVersion: String
  var deviceToken: String?
  var notifications: [MessagingNotification]
  var disabledMessageCategories: [MessageCategory]
  var progress: Int
  var id: String
  var dateCreated: Date
  
  // Define your own custom properties
  var cars: [DocumentID]

  // ...
}

โš ๏ธ Note: Be sure to read the the wiki to implement this properly!

Email Auth

Authenticate with an email and password easily:

EasyAuth.createAccount(email: "[email protected]", password: "76dp2[&y4;JLyu:F") { error in
  if let error = error {
    print(error.localizedDescription)
  } else {
    // Account created!
  }
}

EasyAuth.signIn(email: "[email protected]", password: "76dp2[&y4;JLyu:F") { error in
  // ...
}

Sign In with Google

Authenticate with Google:

// iOS
EasyAuth.signInWithGoogle(clientID: "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") { error in
  // ...
}

// macOS
EasyAuth.signInWithGoogle(clientID: "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                          secret: "GOCSPX-xxxxxxxxxxxxxxxxxxx-xxxxxxxx") { error in
  // ...
}

Sign In with Apple

Authenticate with Apple:

// iOS + macOS
EasyAuth.signInWithApple()

Built-In Usernames

Generate unique usernames and update easily:

user.safelyUpdateUsername(to: "myNewUsername", ofUserType: MyUser.self) { error, suggestion in
 if let error = error {
   // ...
 } else if let suggestion = suggestion {
   // Username taken, provide the user with an available username suggestion.
 } else {
   // Success! Username changed.
 }
}

Robust User Management

Quickly update and manage EasyAuth users:

// Send a verfication email to the currently signed-in user
user.sendEmailVerification(completion: { error in })
// Upload and update the current user's profile photo
user.updatePhoto(with: myPhotoData, ofUserType: FUser.self, completion: { error in })
// Send the current user's password reset form to a specified email
user.sendPasswordReset(toEmail: "[email protected]", completion: { error in })
// Update the current user's display name
user.updateDisplayName(to: "New_DisplayName", ofUserType: MyUser.self, completion: { error in })
// Update the current user's password
user.updatePassword(to: "newPassword", completion: { error in })
// Delete the current user
user.delete(ofUserType: MyUser.self, completion: { error in })

๐Ÿ“ฆ Storage Feature Showcase

Data Storage

Quickly assign data to Firebase Storage using a single line of code.

// Upload image data and get an associated URL
EasyStorage.put(imageData, to: StorageResource(id: user.id)) { url in }

// EasyStorage will automatically delete existing images matching the same ID (if in the same folder)
EasyStorage.put(imageData,to: StorageResource(id: user.id, folder: "myFolder"), progress: { updatedProgress in
  // Update progress text label using updatedProgress
}, completion: { url in
  // Handle the image's URL
})

โ˜๏ธ Cloud Messaging Feature Showcase

Built-in User Notifications

Easily send and notify other users without all the tedious setup. Just add a serverKey from Firebase Console.

// Set your Server Key
EasyMessaging.serverKey = "xxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxx-xxxxx-xxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx"

// Create the notification
let notification = MessagingNotification("Message body", from: me, in: "Test Category")

// Send the notification to the user
// Appends to the notifications property, unless the specified category is in the user's disabledMessageCategories
EasyMessaging.send(notification, to: you)

๐Ÿ“Š Analytics Feature Showcase

Easily Log Events

To log an event, you can use EasyAnalytics' static methods:

EasyAnalytics.log("food_eaten", data: [
 "name": "Hot Dog",
 "isHot": true
])

If you have a model that conforms to AnalyticsLoggable, you can log events using the model itself:

let hotdog = Food(name: "Hot Dog", temperature: 81)
EasyAnalytics.log("food_eaten", model: hotdog)

Alternatively, you can call the logging method from the model itself:

hotdog.log(key: "food_eaten")

Integrated User Properties

Override the analyticsProperties() method to automatically update user properties on app launch:

struct MyUser: EasyUser {
  // ...
  var favoriteCar: String
  func analyticsProperties() -> [String: String] {
    return ["app_version": appVersion, "favorite_car": favoriteCar]
  }
}

Manually update the user properties to Firebase Analytics:

myUser.updateAnalyticsUserProperties()
You might also like...
The app demonstrates how to use Firebase in a SwiftUI iOS app

Firebase SwiftUIDemo app This app demonstrates how to use Firebase in a SwiftUI iOS app. Firebase Setup Go to firebase.com Click new project. Copy app

The ToDoList application using FireBase allows you to register users
The ToDoList application using FireBase allows you to register users

ToDoFirebase ะŸั€ะธะปะพะถะตะฝะธะต ToDoList ั ะธัะฟะพะปัŒะทะพะฒะฐะฒะฝะธะตะผ FireBase ะฟะพะทะฒะพะปัะตั‚ ะทะฐั€ะตะณะธัั‚ั€ะธ

A detailed clone of the Instagram app built with Firebase
A detailed clone of the Instagram app built with Firebase

[This repository is no longer being maintained] InstagramClone A detailed clone

Learning App with Firebase Auth
Learning App with Firebase Auth

Learning App Displays how to make a learning app with Swift, iOS's programming l

Firebase Quickstart Samples for iOS

Firebase Quickstarts for iOS A collection of quickstart samples demonstrating the Firebase APIs on iOS. Each sample contains targets for both Objectiv

A SwiftUI component which handles logging in with Apple to Firebase
A SwiftUI component which handles logging in with Apple to Firebase

Login with Apple Firebase SwiftUI I made this SwiftUI component to handle logging in with Apple to Firebase. Demo Gif Usage in SwiftUI struct ContentV

Warning pushNotification - Using push notification with Firebase Cloud Messaging

์žฌ๋‚œ๋ฌธ์ž ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ตฌํ˜„ 1) ๊ตฌํ˜„ ๊ธฐ๋Šฅ 2) ๊ธฐ๋ณธ ๊ฐœ๋… (1) Remote Notification ๋ถˆ์‹œ์— ๋ฐœ์ƒํ•œ ์—…๋ฐ์ดํŠธ ๋ถˆํŠน์ • ์‹œ๊ฐ„ ์˜ˆ์ธก ๋ถˆ

Ready use service for Firebase. Included interface, recored devices and notifications.
Ready use service for Firebase. Included interface, recored devices and notifications.

SPProfiling Ready use service with using Firebase. Included interface, manage auth process, recored devices and profile data. Installation Ready for u

IOS mobile application that uses URLSession and Firebase
IOS mobile application that uses URLSession and Firebase

DogApp IOS mobile application that uses URLSession and Firebase. First a dog ima

Comments
  • Extract static Querying methods to static document-class-based methods

    Extract static Querying methods to static document-class-based methods

    Instead of calling EasyFirestore.Querying.where(...), call MyDocument.query(where: ...) and so forth for other querying methods.

    Development Related to #9

    enhancement 
    opened by benlmyers 0
  • Remove `ofType:` and `userType:` parameters in method calls

    Remove `ofType:` and `userType:` parameters in method calls

    The need for ofType: and userType: to specialize generic EasyFirestore and other related library methods can be eliminated, as String(describing: T.self) does not account for sub-classes, whereas String(describing: type(of: document)).

    This change should only appear rarely, however, once #9 is implemented.

    enhancement 
    opened by benlmyers 0
  • Eliminate Static Methods

    Eliminate Static Methods

    Remove all need for static library methods like EasyFirestore.Updating.increment(...) or EasyStorage.put(...) by translating all related methods to Document and other related classes/objects.

    enhancement 
    opened by benlmyers 0
Releases(1.4.2)
  • 1.4.2(Nov 29, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Minor Changes

    • Firebase Remote Config can now be imported as a dependency.
    • Singletons are now explicitly stored with set(singleton:...).
    • EasyAuth.signInWithApple(...) now uses a completion handler.
    • Device token improvements.
    • Persistence can now be toggled using EasyFirestore.usePersistence.

    Fixes

    • Issues with EasyLink have been fixed.
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Sep 18, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    New Features

    Built-In Geo-Querying

    Geohashing and querying is built-in now with EasyFirebase. Conform your document type to GeoQueryable to unlock geo-querying capabilities for your documents.

    class MyDocument: Document, GeoQueryable {
      static var geohashPrecision: GeoPrecision = .normal
      @objc var geohash: String = ""
      var latitude: Double
      var longitude: Double
      ...
    }
    
    // Works if myDocument.latitude and myDocument.longitude are non-nil
    myDocument.updateGeohash()
    
    // Query nearby documents
    EasyFirestore.Querying.near(\MyDocument.geohash, at: location, precision: .loose, order: .ascending) { documents in
      ...
    }
    

    EasyLink Support

    Create a Firebase Dynamic Link using EasyLink:

    EasyLink.urlPrefix = "company.page.link"
    EasyLink.backupURL = URL(string: "https://www.mycompany.com")
    var link = EasyLink(host: "mycompany.com", query: ("foodID", food.id))
    link.shorten { shortURL in ... }
    

    Handle a universal URL using EasyLink to retrieve the deep-link payload:

    EasyLink.handle(handledURL) { easyLink in
      guard let easyLink = easyLink else { return }
      if let id: String = easyLink.query["foodID"] { ... }
    }
    

    Pass in social parameters:

    link.social = .init(title: "My Food", desc: "Check out this awesome meal.", imageURL: foodImageURL)
    

    Firestore Map Updating

    Update the value of a field in a map in a field in a document in Firestore:

    EasyFirestore.Updating.updateMapValue(key: "Barry", value: 25, to: \.friends, in: global.user) { error in ... }
    

    Remove a similar value:

    EasyFirestore.Updating.removeMapValue(key: "Barry", from: \.friends, in: global.user) { error in ... }
    

    EasyMessaging Improvements

    It's easier to define the type of information you wish to display in a MessagingNotification. A new initializer provides explicit control over a remote notification's title, body, and other information:

    let notification = MessagingNotification(title: "Hello, world!", body: "It's a great, sunny day. Fizzbuzz! ๐Ÿ", from: global.user, in: "general")
    

    Minor Changes

    • New Session Errors: .endError, .alreadyHost, .notInSession, .alreadyInSession provide additional session warnings.
    • The onUpdate callback of EasyFirestore.Listening.listen(...) will be called passing nil if no data can be found for a document.
    • Added a simple EasyFirestore.Updating demonstration to the Example Project.

    Bug Fixes

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Aug 29, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Note New firebase-ios-sdk dependency version for this version of EasyFirebase: 9.0.0 Please make sure to update your dependencies!

    New Features

    Sessions

    Create, join, and listen to Sessions: a place where users can join together to exchange data in an interactive way:

    class MySession: Session {
      
      // Inherited Properties
      
      var id: String = UUID().uuidString
      var dateCreated: Date = Date()
      var host: FUser.ID = ""
      var users: [FUser.ID] = []
      
      // Your custom properties
      
      var myData: String = "Hello, world!"
    }
    
    // Create a new session
    myUser.createSession(ofType: MySession.self) { session, error in
      // Passes a session if success, error if failure
      ...
    }
    
    // Join an existing session
    myUser.joinSession(id: sessionID, ofType: MySession.self) { session, error in ... }
    
    // Once the session has been created/joined, listen to the session
    myUser.listen(to: session, onUpdate { session in ... }, onEnd: { ... })
    
    // Leave a session
    myUser.leaveSession(session) { error in ... }
    

    Improved Firestore Updating

    Append and remove items in arrays remotely without affecting your read count:

    // Append element to array
    EasyFirestore.Updating.append(\.ingredients, with: "Cheese", in: pizzaDocument) { error in ... }
    
    // Increment field
    EasyFirestore.Updating.increment(\.pepperoniCount, by: 5, in: pizzaDocument)
    
    // Remove elements from array
    EasyFirestore.Updating.remove(\.ingredients, taking: ["Garlic", "Anchovies", "Pineapple"], from: pizzaDocument)
    

    Minor Changes

    • Improved the stability of EasyUser's encoding and decoding.
    • Added documentation for EasyFirestore.Listening methods.
    • Refactored all DocumentID types (a.k.a String) to <DOCUMENT_CLASS_NAME>.ID associated type i.e. MyDocumentType.ID.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.5(Aug 16, 2022)

  • 1.2.4(Aug 10, 2022)

    Thanks for using EasyFirebase! ๐ŸŽ‰

    New Features

    • Use EasyFirestore.Querying.where(path:matches:completion:) to query documents matching a string (for search purposes)
    • Use the .inQueryableFormat computed String property to obtain a queryable format of a String (no symbols, capital letters, etc.)

    Minor Changes

    • Added a key property to Messaging Notifications so basic action handling can be passed thorough MessagingNotifications
    • EasyAuth will now automatically update .lastSignon, EasyUser.versionUpdate, and .appVersion.
    • Emails are no longer required to form EasyUser objects when using EasyUser.get(from: User)
    • Use the .incremented(...) method to increment a String to querying

    Bug Fixes

    • Fixed .getChildren(...) Document method
    • Fixed issues with operator precedence
    Source code(tar.gz)
    Source code(zip)
  • 1.2.3(Jun 28, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Minor Changes

    • Reduced the Analytics update cooldown to 2 seconds
    • Made EasyUser.analyticsProperties() overridable
    • Improved the callbacks for all auth methods
    • Added an optional completion handler to EasyUser.refreshEmailVerificationStatus()
    • Relevant error messages are now shown for Storage uploads

    Bug Fixes

    • Fixed completion handlers not being called on EasyUser when auth is mismatched
    Source code(tar.gz)
    Source code(zip)
  • 1.2.2(May 1, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Minor Additions

    • Add Google + Apple sign-in examples
    • Add additional wiki assets

    Bug Fixes

    • EasyUser's .refreshEmailVerificationStatus() now properly reloads the status
    • Other minor fixes
    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Apr 19, 2022)

    โš ๏ธ Warning: This update contains some breaking changes. Be sure to fix your project when you update this package!

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Breaking Changes

    You now must add in the field name when updating/linking document field values.

    // Before
    global.user.set("apples", to: \.favoriteFood)
    
    // After
    global.user.set(field: "favoriteFood", with: "apples", using: \.favoriteFood)
    

    This changes affects field-specific calls of .set(...), as well as all calls of .assign(...), .unassign(...), and .setAssign(...). Under very rare circumstances should the String and KeyPath parameters of these methods match after this change.

    ๐Ÿค” Why add this? Sometimes using just the KeyPath to grab the field name as a String causes a fatal error related to Objective-C. This removes the risk of this error at the cost of library code prettiness.

    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Mar 11, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    New Features

    Firestore Updating

    Quickly update values in Firestore without initially knowing what the values are using EasyFirestore.Update:

    EasyFirestore.Updating.increment(\.chipsEaten, by: 6, in: myFoodEaten)
    
    myFoodEaten.increment(\.chipsEaten, by: 6) { error in
      // ...
    }
    

    Safe Setting

    Set documents in Firestore only if they do not exist in their respective collection:

    EasyFirestore.Storage.setIfNone(myCar, checking: myMissingCarID) { error in
      // ...
    }
    

    These values are even mutated locally, so you don't need to update them yourself.

    Source code(tar.gz)
    Source code(zip)
  • 1.1.5(Mar 9, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Bug Fixes

    • Fix user account data not being deleted upon account deletion (#4)
    • Fix EasyUser subclass properties not being updated in Firestore (see Wiki)
    Source code(tar.gz)
    Source code(zip)
  • 1.1.4(Mar 7, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Minor Changes

    • Ability to callback image upload progress when updating user profile image
    • User profile images are stored in Storage under folder name "Profile Images"
    Source code(tar.gz)
    Source code(zip)
  • 1.1.3(Feb 28, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Minor Changes

    • Auto-generated usernames always match a 6-character minimum

    Bug Fixes

    • Fixed an issue where profile images would not update properly
    Source code(tar.gz)
    Source code(zip)
  • 1.1.2(Feb 19, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Bug Fixes

    • EasyAuth.accountProvider now properly updates
    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Feb 12, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    Minor Changes

    • Changing user properties (email, username, password, etc.) now require user type as input
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Feb 11, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    New Features

    Example Project

    An example project has been added to go alongside the Wiki. To set up EasyAuth, read the wiki and use the example project.

    Bug Fixes

    • Fixed issue with usernames not changing
    • Fixed issue with querying only returning first result
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Feb 5, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    New Features

    Analytics

    Analytics is here. Easily keep track of your users' actions and properties.

    EasyAnalytics.log("food_eaten", data: [
     "name": "Hot Dog",
     "isHot": true
    ])
    

    For more information, check out README.md.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-pre(Jan 23, 2022)

    ๐ŸŽ‰ Thank you for supporting EasyFirebase! I'm a full-time student spending my free time on this library, so I apologize if there any bugs present. Feel free to contribute with a pull request or report buts in Issues!

    New Features

    Querying

    Querying is here. Search for documents in a Swifty manner.

    EasyFirestore.Querying.where(\Car.make, .equals, "Toyota") { cars in
      // Handle your queried documents here...
    }
    

    For more information, check out README.md.

    Indexable Documents

    Conform your class to IndexableDocument to index your documents! This allows you to easily keep track of how many documents are in a collection. This also will allow you to grab a random document easier.

    class Car: IndexableDocument {
      
      // These properties are inherited from Document
      var id: String = UUID().uuidString
      var dateCreated: Date = Date()
      
      // And this shiny new property is inherited from IndexableDocument
      var index: Int
    
      // ...
    }
    

    Other Additions

    • Easily generate EasyUser usernames and suggest new ones if they're taken (more info)
    • Ability to request updated email verification status from EasyUser objects

    Minor Changes

    • All auth management features have migrated to instance methods of EasyUser
    • All EasyUser objects now conform to IndexableDocument instead of Document

    Bug Fixes

    • Fix iOS device compatability
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jan 1, 2022)

Owner
Flowductive
We help you stay driven with Flows -- a fun, social, and unique way to commit time to productive activity.
Flowductive
Aplikasi iOS Advanced Level To Do List dengan Firebase Auth, SwiftUI, MVVM Design Pattern, dan Firebase Firestore

Aplikasi Tasker adalah aplikasi iOS To Do List yang dibuat menggunakan Autentikasi Firebase / Firestore dan MVVM Design Pattern.

DK 10 Oct 17, 2022
Instagram clone with firebase and swift

Instagram clone with firebase and swift

Murat ร‡iรงek 1 Nov 20, 2021
A grocery list app for families written in Swift using Firebase Realtime Database

FamiList | Grocery list app in Swift FamiList is a grocery list app for families written in Swift using Firebase Realtime Database. You can add differ

Wasan Ibrahim 2 Jul 31, 2022
Swift Starter Kit with Firebase & Facebook Login Onboarding

iOS Swift Starter Kit ?? ?? ?? ?? Boilerplate Onboarding App in Swift with Firebase Integration, Facebook Login and Push Notifications. Save days of a

Instamobile 105 Nov 7, 2022
Swift UIKit E-Commerce (UgurShopping) No StoryBoard Firebase, FireStore, FirebaseAuth, KingFisher, SwiftEntryKit, ProgressHud, Alamofire UICollectionViewCompositionalLayout, NotificationCenter

Swift UIKit E-Commerce (UgurShopping) No StoryBoard Firebase, FireStore, FirebaseAuth, KingFisher, SwiftEntryKit, ProgressHud, Alamofire UICollectionViewCompositionalLayout, NotificationCenter

Ugur Hamzaoglu 2 Oct 16, 2022
Simple Todo Application using SwiftUI / Firebase / Redux.

Simple Todo Application using SwiftUI/Firebase/Redux/Combine. Light _ _ _ _ Dark _ _ _ Feature Use SwiftUI fully. Use Firebase. Authentication Cloud F

Suguru Kishimoto 337 Dec 25, 2022
Completed Project for Authentication in SwiftUI using Firebase Auth SDK & Sign in with Apple

Completed Project for Authentication in SwiftUI using Firebase Auth SDK & Sign in with Apple Follow the tutorial at alfianlosari.com Features Uses Fir

Alfian Losari 43 Dec 22, 2022
SwiftUI, Firebase, Kingfisher, googleapis

SwiftUI-KokaiByWGO Xcode Version 12.0 SwiftUI, Firebase, Kingfisher, googleapis Learn Thai with pictures and sounds Note : This version have no CMS so

Waleerat S. 0 Oct 6, 2021
Social Media platform build with swiftUI and Firebase with google and apple account integration for Signing In Users

Social Media platform build with swiftUI and Firebase with google and apple account integration for Signing In Users . Providing Users availability to upload posts and images add caption allowing other users to comment , with Find section to explore new people , new stories , User Profile section to allow the user to take control of his account .

Devang Papinwar 2 Jul 11, 2022
iOS Open-Source Telematics App with Firebaseยฉ integration

Open-source telematics app for iOS. The application is suitable for UBI (Usage-based insurance), shared mobility, transportation, safe driving, tracking, family trackers, drive-coach, and other driving mobile applications

Damoov 17 Dec 11, 2022