Waller is a SwiftUI-based wallpaper downloading app that leverages SwiftData for data persistence and AppStorage for user settings. This app fetches beautiful, high-quality photos from the Pexels API, and allows users to search, view, download, like, and share wallpapers. It also offers a Favorites section where users can save their favorite images.
- ✨ Features
- 🖼️ Screenshots
- ⚙️ Installation & Setup Guide
- 🛠️ Technologies Used
- 📚 Key Learnings
- 🔮 Future Improvements
- Getting Started Page: Welcomes the user.
- Home Page: Displays a feed of images fetched from the Pexels API with a search bar for users to find photos related to specific topics like nature, animals, landscapes, etc.
- Favorites Tab: Allows users to save their liked photos. These are stored persistently using SwiftData and can be accessed even after the app is closed and reopened.
- Photo View: Clicking on a photo opens it in a larger view with options to:
- Download the photo
- Like the photo (saved to favorites)
- Share the photo via standard sharing options
- Search Functionality: The search bar allows users to look for photos based on keywords like "nature", "birds", etc.
Here are some screenshots of the app:
Follow these steps to set up and run Waller on your local machine:
Make sure you have the following installed:
- Xcode (latest version)
- A Pexels API key (You can get it here).
-
Clone the Repository Open a terminal window and run the following command to clone the repository to your local machine:
git clone /~https://github.com/Reshamhere/Waller.git
-
Open the Project Navigate to the project directory:
cd Waller
Open the project in Xcode:
open Waller.xcodeproj
-
Set Up the Pexels API
- Create an account on Pexels if you don’t have one.
- Get your API key from the Pexels website.
- In Xcode, open the file where the API key is required and paste the key in the appropriate place.
-
Run the App
- Select a simulator or a connected device in Xcode.
- Hit the Run button or press
Cmd + R
to build and run the app.
The app should now launch and you can begin using it to search for wallpapers, like images, and add them to your Favorites!
- SwiftUI: Used to build the user interface with declarative views.
- SwiftData: Employed for persisting liked photos in a local database.
- AppStorage: Utilized for storing user preferences and settings.
- Pexels API: Integrated to fetch high-quality wallpapers and photos based on search queries.
Throughout the development of Waller, I’ve gained a wealth of knowledge and honed my skills in the following areas:
- Fetching Data from an API: I learned how to interact with an API (Pexels in this case) to fetch and display images dynamically within the app.
- Working with SwiftData: I gained hands-on experience with SwiftData to store, manage, and fetch the user's liked photos, ensuring data persistence even after app restarts.
- AppStorage for Settings: Implementing AppStorage helped me learn how to store simple user preferences locally, such as favorite photos or app settings.
- Dynamic UI with SwiftUI: This project helped me deepen my understanding of SwiftUI's declarative syntax, and how to use it to create responsive, dynamic interfaces, such as the interactive photo viewer.
- Search Functionality: I learned how to integrate search functionality that dynamically updates the UI based on the user's input and fetches related images from the API.
- Sharing Options: Implementing the photo sharing feature gave me insight into how to utilize iOS sharing APIs to let users share content via different platforms.
Overall, this project has been a tremendous learning experience, improving my knowledge of SwiftUI, networking, and data storage, while allowing me to apply these concepts in a practical, real-world project.
While this app is fully functional, I plan to enhance it with the following features in the future:
- Implement more advanced search filters for photo categories.
- Add user authentication to allow users to save their favorites across devices.
- Enhance the UI/UX for a smoother, more polished experience.
Note: This project is an original work created by me, and the source code is provided as part of my portfolio.