Get Started
1
Create a new project
Create a new iOS or macOS project for this quickstart.In Xcode:
- File → New → Project (or ⌘+Shift+N)
 - Select either:
- iOS tab → App template
 - macOS tab → App template
 
 - Configure your project:
- Product Name: 
Auth0-Sample - Interface: SwiftUI
 - Language: Swift
 - Use Core Data: Unchecked
 - Include Tests: Checked (recommended)
 
 - Product Name: 
 - Choose a location and click Create
 
This creates a standard app with SwiftUI and Swift Package Manager support, perfect for Auth0 integration.
2
Add the Auth0 SDK
Add the Auth0 SDK to your project using your preferred package manager.
- Swift Package Manager
 - CocoaPods
 - Carthage
 
In Xcode:
- File → Add Package Dependencies… (or ⌘+Shift+K)
 - Enter the Auth0 SDK URL:
 - Add Package → Select your app target → Add Package
 
3
Configure Auth0
Create a new app on your Auth0 tenant and configure your project.
- Auth0.plist
 - Programmatic
 
Create macOS:Allowed Logout URLs:iOS:macOS:
Auth0.plist in your project directory:Auth0.plist
- Go to Auth0 Dashboard
 - Applications > Create Application > Name it, select Native > Create
 - Copy Client ID and Domain from Settings tab into 
Auth0.plist - Drag 
Auth0.plistinto Xcode (check “Add to target”) - Configure the following URLs:
 
4
Create the Authentication Service
Create 
AuthenticationService.swift:- Right-click your project → New File… → Swift File
 - Name it 
AuthenticationService - Replace contents with:
 
AuthenticationService.swift
5
Create UI Components
Create UI files and add code:
6
Configure Authentication Flow (Optional)
Eliminate the permission alert by choosing one option:
Skip this step to use the default behavior with a permission alert. You can configure this later.
- Universal Links
 - Ephemeral Session
 
- Auth0 Dashboard → Applications → Your app → Settings → Advanced Settings → Device Settings
 - Add Apple Team ID and bundle identifier → Save
 - Xcode: Target → Signing & Capabilities → + Capability → Associated Domains
 - Add: 
webcredentials:{yourDomain} 
Requires: Paid Apple Developer account, iOS 17.4+/macOS 14.4+
Best for production apps.
7
Run your app
Press ⌘+R in Xcode.
- Tap “Log In” → Permission alert (if using default) → Tap “Continue”
 - Complete login in browser
 - See your profile!
 
CheckpointYou now have a fully functional Auth0 login in your iOS or macOS app!
Troubleshooting & Advanced
Common Issues & Solutions
Common Issues & Solutions
Build errors: ‘Auth0’ module not found
Solutions:- Swift Package Manager: Check Package Dependencies → Verify 
Auth0.swiftis listed - CocoaPods: Ensure you’re opening the 
.xcworkspacefile, not.xcodeproj - Carthage: Verify 
Auth0.xcframeworkis added to Frameworks, Libraries, and Embedded Content - Clean and rebuild: ⌘+Shift+K then ⌘+R
 - Restart Xcode if needed
 
App crashes: ‘Auth0.plist not found’
Fix:- Verify 
Auth0.plistis in your Xcode project navigator - Select the file → Inspector → Ensure your app target is checked
 - Confirm it has 
ClientIdandDomainkeys with your values - Alternative: Use programmatic configuration (see Step 3, Programmatic tab)
 
Browser opens but never returns to app
Fix:- Check callback URLs in Auth0 Dashboard match your bundle identifier and platform exactly
 - For iOS: URLs should contain 
/ios/, for macOS:/macos/ - Verify bundle identifier in Xcode matches Auth0 settings
 - Ensure no typos in URLs (common: missing colons, wrong domain format)
 - Custom domain users: Verify you’re using your custom domain, not the Auth0 domain
 
Permission alert appears every time
This is standard iOS/macOS security behavior when using custom URL schemes. See Step 6 to eliminate this alert using Universal Links or Ephemeral Sessions.Custom Domain Configuration
Custom Domain Configuration
If you’re using a custom domain, use its value instead of your Auth0 domain everywhere.Example: Use 
login.example.com instead of tenant.auth0.comThis is required for certain features to work properly:- Update 
Auth0.plistwith your custom domain - Use custom domain in callback/logout URLs
 - For Universal Links, use: 
webcredentials:login.example.com 
Production Deployment
Production Deployment
App Store Preparation
- Configure Universal Links to eliminate the permission alert
 - Test on multiple platform versions and device sizes
 - Implement proper error handling for network failures
 - Add Privacy Usage descriptions if using Keychain with biometrics
 - Follow App Store Review Guidelines for authentication flows
 
Security Best Practices
- Never log sensitive authentication data in production
 - Implement App Transport Security (ATS) compliance
 - Use HTTPS for all network requests
 - Do NOT pin Auth0 API certificates - Auth0 does not recommend this practice
 
Performance Optimization
- All async operations properly use 
@MainActorfor UI updates @Publishedproperties use proper memory handling- Credentials are cached securely in the Keychain for offline access
 - User profile is retrieved from ID token (no additional network request)
 
Advanced Integration
Advanced Integration
Enhanced Keychain Security with Biometrics
Require Face ID or Touch ID to access stored credentials:Automatic Token Refresh
TheCredentialsManager automatically refreshes expired access tokens:Shared Credentials Across App Extensions
For widgets, app extensions, or background tasks that need access tokens:- Enable App Groups capability in Xcode for all targets
 - Use the same app group identifier across targets
 - Configure the shared 
CredentialsManagerin each target 
Authentication Flow Options Comparison
| Feature | Universal Links | Ephemeral Session | Default (Alert) | 
|---|---|---|---|
| Permission Alert | None | None | Shows alert | 
| SSO Support | Yes | No | Yes | 
| Apple Developer Account | Required | Not required | Not required | 
| User Experience | Best | Good | Acceptable | 
| Setup Complexity | Medium | Easy | Easy | 
| Private Browsing Support | Yes | Yes | No | 
- Production apps: Universal Links (best UX, requires Apple Developer account)
 - Testing/Development: Ephemeral Sessions (quick setup, no alert)
 - Quick start/Prototyping: Default with alert (no setup, can migrate later)