Build a User Management App with Swift and SwiftUI
This tutorial demonstrates how to build a basic user management app. The app authenticates and identifies the user, stores their profile information in the database, and allows the user to log in, update their profile details, and upload a profile photo. The app uses:
Supabase Database - a Postgres database for storing your user data and Row Level Security so data is protected and users can only access their own information.
Before we start building we're going to set up our Database and API. This is as simple as starting a new Project in Supabase and then creating a "schema" inside the database.
Now we are going to set up the database schema. We can use the "User Management Starter" quickstart in the SQL Editor, or you can just copy/paste the SQL from below and run it yourself.
You can easily pull the database schema down to your local project by running the db pull command. Read the local development docs for detailed instructions.
_10
supabase link --project-ref <project-id>
_10
# You can get <project-id> from your project's dashboard URL: https://supabase.com/dashboard/project/<project-id>
Now that you've created some database tables, you are ready to insert data using the auto-generated API.
We just need to get the Project URL and anon key from the API settings.
Create a helper file to initialize the Supabase client.
You need the API URL and the anon key that you copied earlier.
These variables will be exposed on the application, and that's completely fine since you have
Row Level Security enabled on your database.
The example uses a custom redirectTo URL. For this to work, add a custom redirect URL to Supabase and a custom URL scheme to your SwiftUI application. Follow the guide on implementing deep link handling.
In ProfileView.swift, you used 2 model types for deserializing the response and serializing the request to Supabase. Add those in a new Models.swift file.
Now that you've created all the views, add an entry point for the application. This will verify if the user has a valid session and route them to the authenticated or non-authenticated state.
Add a new AppView.swift file.
AppView.swift
_22
import SwiftUI
_22
_22
struct AppView: View {
_22
@State var isAuthenticated = false
_22
_22
var body: some View {
_22
Group {
_22
if isAuthenticated {
_22
ProfileView()
_22
} else {
_22
AuthView()
_22
}
_22
}
_22
.task {
_22
for await state in supabase.auth.authStateChanges {
_22
if [.initialSession, .signedIn, .signedOut].contains(state.event) {
_22
isAuthenticated = state.session != nil
_22
}
_22
}
_22
}
_22
}
_22
}
Update the entry point to the newly created AppView. Run in Xcode to launch your application in the simulator.