Add required permissions based on your onboarding flow:
<!-- Camera permission --><key>NSCameraUsageDescription</key><string>This app needs camera access for profile photos</string><!-- Photo library permission --><key>NSPhotoLibraryUsageDescription</key><string>This app needs photo library access to select images</string><!-- Location permission --><key>NSLocationWhenInUseUsageDescription</key><string>This app needs location access to provide local features</string><!-- Face ID permission (if using biometric authentication) --><key>NSFaceIDUsageDescription</key><string>This app uses Face ID for secure authentication</string>
import SwiftUIimport OnboardSync@mainstruct MyApp: App { var body: some Scene { WindowGroup { ContentView() } }}struct ContentView: View { @State private var showingOnboarding = true var body: some View { VStack { Text("Your main app content") } .onAppear { showOnboarding() } } func showOnboarding() { let config = OnboardSyncConfig( projectId: "your-project-id", secretKey: "your-secret-key", // Get from dashboard testingEnabled: true, // Optional, shows onboarding every time onComplete: { result in // Access form responses if available if let result = result, result.hasResponses { for response in result.responses { print("\(response.questionText): \(response.answerAsString ?? "")") } } } ) OnboardSync.showOnboarding(config: config) }}
let config = OnboardSyncConfig( projectId: "your-project-id", secretKey: "your-secret-key", testingEnabled: true, // Optional, shows onboarding every time onComplete: { result in // Handle completion with form responses if let result = result { print("Got \(result.responseCount) responses") } })
struct OnboardSyncConfig { let projectId: String let secretKey: String let testingEnabled: Bool // default: false let onComplete: ((OnboardingResult?) -> Void)?}
Contains all form responses from a completed onboarding flow:
struct OnboardingResult { let flowId: String // The completed flow ID let responses: [OnboardingResponse] // All form responses // Helper methods func getResponseByQuestion(_ questionText: String) -> OnboardingResponse? var textResponses: [OnboardingResponse] var singleChoiceResponses: [OnboardingResponse] var multipleChoiceResponses: [OnboardingResponse] var hasResponses: Bool var responseCount: Int}
struct OnboardingResponse { let questionText: String // The question asked let questionType: String // 'question_text', 'question_single_choice', or 'question_multiple_choice' let answer: OnboardingAnswer // String or [String] let screenId: String? // Screen where question appeared var answerAsString: String? // Get answer as single string var answerAsList: [String] // Get answer as list}
onComplete: { result in guard let result = result, result.hasResponses else { return } // Get specific response if let nameResponse = result.getResponseByQuestion("What's your name?") { print("Name: \(nameResponse.answerAsString ?? "")") } // Filter by type for textResponse in result.textResponses { print("\(textResponse.questionText): \(textResponse.answerAsString ?? "")") }}
The SDK automatically handles permission requests configured in your onboarding flow:
// Permissions are requested based on your flow configuration// No additional code needed - the SDK handles:// - Camera permission// - Photo library permission // - Location permission// - Notifications permission// - App tracking transparency
// The SDK respects your app's status bar styleOnboardSyncView(config: config) .preferredColorScheme(.dark) // Force dark mode .statusBar(hidden: false)
Enable testing mode to show onboarding every time:
let config = OnboardSyncConfig( projectId: "your-project-id", secretKey: "your-secret-key", testingEnabled: true // Shows onboarding every time for testing)