iOS SDK
The ThunderID iOS SDK provides two Swift packages for integrating authentication into your iOS and macOS applications:
ThunderID— Core authentication client with the full IAM API surfaceThunderIDSwiftUI— Drop-in SwiftUI components built on top ofThunderID
Both packages target iOS 16+ and macOS 13+.
Installation
- Swift Package Manager
- CocoaPods
In Xcode, go to File › Add Package Dependencies and enter:https://github.com/thunderid/thunderid-ios-sdkSelect the ThunderIDSwiftUI product (includes ThunderID automatically).
pod 'ThunderIDSwiftUI'
Getting Started
To get started quickly, follow the iOS Quickstart Guide for step-by-step setup instructions.
Quick Example
import SwiftUI
import ThunderIDSwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.thunderIDProvider(config: ThunderIDConfig(
baseUrl: "https://localhost:8090",
clientId: "<your-client-id>",
scopes: ["openid", "profile", "email"],
afterSignInUrl: "io.thunderid.b2c://callback",
afterSignOutUrl: "io.thunderid.b2c://logout",
applicationId: "<your-application-id>"
))
}
}
}
struct ContentView: View {
@EnvironmentObject var state: ThunderIDState
var body: some View {
SignedIn {
VStack {
Text("Welcome, \(state.user?.displayName ?? "")!")
SignOutButton()
}
} fallback: {
SignIn(applicationId: "<your-application-id>")
}
}
}
Features
ThunderID — Core Client
| Method | Description |
|---|---|
initialize(config:storage:) | Initialize the SDK with configuration and an optional storage backend |
signIn(payload:request:sessionId:) | App-native sign-in via the Flow Execution API |
signUp(payload:request:) | App-native registration via the Flow Execution API |
buildSignInURL(options:) | Build an OAuth 2.0 authorization URL for redirect-based sign-in |
handleRedirectCallback(url:) | Exchange an authorization code for tokens after redirect |
getAccessToken(sessionId:) | Retrieve the current access token, refreshing automatically if needed |
getUser(options:) | Retrieve the authenticated user from the JWT or /oauth2/userinfo |
getUserProfile(options:) | Fetch the full user profile from /scim2/Me |
updateUserProfile(payload:userId:) | Update the user's profile |
signOut(options:sessionId:) | Revoke the refresh token and clear the session |
exchangeToken(config:sessionId:) | Perform an OAuth 2.0 token exchange (STS) |
decodeJwtToken(_:) | Decode a JWT string into a Decodable type |
ThunderIDSwiftUI — Components
Actions
| Component | Description |
|---|---|
SignInButton(onTap:) | Pre-styled button that triggers your sign-in flow |
BaseSignInButton(label:isLoading:action:) | Unstyled button for custom UI |
SignOutButton(onSignOutComplete:) | Calls signOut() and refreshes auth state |
BaseSignOutButton(label:isLoading:action:) | Unstyled button for custom UI |
SignUpButton(onTap:) | Pre-styled button that triggers your registration flow |
Presentation
| Component | Description |
|---|---|
SignIn(applicationId:onComplete:onError:) | Full embedded sign-in form driven by the Flow Execution API |
BaseSignIn<Content>(applicationId:onComplete:onError:content:) | Builder variant; receives a SignInState for custom form UI |
SignUp(applicationId:onComplete:onError:) | Full embedded registration form |
BaseSignUp<Content>(...) | Builder variant for custom registration UI |
UserProfile(onSaved:onError:) | Editable profile form; loads from /scim2/Me and saves via updateUserProfile |
BaseUserProfile<Content>(...) | Builder variant with full control over the form layout |
Guards
| Component | Description |
|---|---|
SignedIn<Content, Fallback>(content:fallback:) | Renders content only when the user is authenticated |
SignedOut<Content, Fallback>(content:fallback:) | Renders content only when the user is not authenticated |
State
| Type | Description |
|---|---|
ThunderIDState | Reactive ObservableObject injected by .thunderIDProvider(config:) |
Customization
The ThunderID iOS SDK gives you full control over your application's authentication experience:
- Use
SignInandSignUpfor pre-built forms, orBaseSignInandBaseSignUpto render your own UI with the same Flow Execution loop - Swap in
BaseSignInButtonandBaseSignOutButtonto match your design system without touching any auth logic - Provide a custom
StorageAdapterto control where tokens are persisted (default: Keychain) - Override localized strings using
ThunderIDI18nwith your own translation bundles