RentHelper is a SwiftUI-based iOS application that helps users discover rental properties, explore them on a map, and save favorite listings locally.
The project demonstrates a modern hybrid mobile architecture integrating:
- ๐ Firebase Authentication
- โ๏ธ Firebase Firestore (Cloud Database)
- ๐ผ Firebase Storage (listing images)
- ๐พ CoreData (local favorites persistence)
- ๐งญ MVVM Architecture
- ๐บ MapKit (interactive listing map)
- ๐ Search & filtering system
- ๐ณ Stripe deposit system (planned)
- ๐ค User profile system (planned)
The application is being built through structured iterations, gradually expanding from infrastructure setup to a fully featured rental browsing platform.
RentHelper simulates a real-world rental discovery platform where users can:
- Create an account
- Log in securely
- Browse rental listings
- View property details
- Explore listings on an interactive map
- Search and filter listings
- Save favorite properties
- Remove favorites
- Persist favorites after app restart
The architecture clearly separates responsibilities between cloud services and local persistence.
| Component | Purpose |
|---|---|
| Firebase Auth | User authentication |
| Firestore | Rental listing data |
| Firebase Storage | Listing images |
| CoreData | Favorite listings storage |
| SwiftUI | User interface |
RentHelper follows the MVVM architecture pattern.
Views โ ViewModels โ Services โ Firebase / CoreData
SwiftUI screens responsible for UI rendering:
- Login
- Signup
- Listings
- Listing Details
- Favorites
- Profile (planned)
Navigation uses NavigationStack + TabView.
ViewModels manage UI state and async data:
- Fetch listings
- Handle loading/error states
- Sync Firestore updates
- Manage filtering and search
Example:
ListingsViewModel
Services handle all external integrations.
AuthService
- Firebase login
- Signup
- Logout
- Session state
ListingService
- Fetch listings from Firestore
- Listen for real-time updates
- Decode listing data
Favorites are stored locally using CoreData.
Entity:
FavoriteListing
Attributes include:
- favoriteId
- userId
- listingId
- title
- price
- address
- city
- lat
- long
- imageUrl
- savedAt
Favorites remain saved even after restarting the app.
Listings are stored in the Firestore collection:
listings
Each document contains:
| Field | Type |
|---|---|
| title | String |
| price | Number |
| address | String |
| city | String |
| lat | Number |
| long | Number |
| description | String |
| imageUrl | String |
Listings are fetched using Firestore queries and decoded into Swift models.
The app uses:
addSnapshotListener
This enables live database updates.
When listings are added or modified in Firestore:
- The UI updates automatically
- No refresh is required
RentHelper includes a MapKit-based map view that visualizes listings geographically.
Features:
- Display listings as map pins
- Click a pin to open listing details
- Seamless navigation from map โ listing page
This allows users to explore rentals spatially.
Users can refine listings using:
- Text search (title or address)
- Price filtering
- Dynamic list updates
Filtering is handled inside the ViewModel and updates the UI instantly.
Images are stored in Firebase Storage.
Workflow:
Firebase Storage โ image URL โ Firestore โ SwiftUI AsyncImage
Each listing document contains an imageUrl referencing the stored image.
Images are rendered using:
AsyncImage
Users can:
- Save listings as favorites
- Remove favorites
- View saved favorites in a dedicated screen
Favorites are stored in CoreData to ensure:
- Fast access
- Offline availability
- Persistence after app restart
The project is developed through structured iterations.
Focus: Establish architecture and Firebase integration.
Implemented:
- SwiftUI project setup
- MVVM folder structure
- Firebase configuration
- Firestore initialization
- Authentication setup
- CoreData stack
- App navigation
Focus: Enable secure login and listing browsing.
Implemented:
- Signup / login / logout
- Listings screen
- Listing details screen
- Firestore listing structure
- Firebase Storage images
Focus: Improve user experience and data persistence.
Implemented:
- Real Firestore listing fetch
- Real-time database updates
- MapKit listing map
- Search and filtering
- Save/remove favorites
- Favorites persistence via CoreData
GoogleService-Info.plistis not committed to GitHub- Firestore rules restrict write access
- Stripe secret keys will never be stored in the client
- Favorites remain local for privacy and performance
| Layer | Technology |
|---|---|
| UI | SwiftUI |
| Architecture | MVVM |
| Authentication | Firebase Auth |
| Database | Firestore |
| Image Storage | Firebase Storage |
| Maps | MapKit |
| Local Persistence | CoreData |
| Filtering | SwiftUI state management |
| Payments | Stripe (planned) |
git clone https://github.com/negarprh/Rent-Helper.git
cd Rent-Helper- Create Firebase project
- Add iOS application
- Enable:
- Email/Password Authentication
- Firestore Database
- Firebase Storage
- Download:
GoogleService-Info.plist
- Add it to the Xcode project.
Open:
RentHelper.xcodeproj
Run on simulator.
- Negar Pirasteh
- Betty Dang
- Naomi Pham
Upcoming features include:
- ๐ณ Stripe rent deposit system
- ๐ค User profile system
- Advanced map interactions
- Push notifications
- Cloud-synced favorites
- Listing creation interface