Skip to main content
Unlisted page
This page is unlisted. Search engines will not index it, and only users having a direct link can access it.

DataGrail Consent iOS SDK

Beta Feature

Mobile App Consent Management is in beta for select customers and prospects. Please contact your Account Manager or support@datagrail.io for more information.

The DataGrail Consent iOS SDK provides a fully native Swift implementation for managing user consent preferences in your iOS applications. This guide covers installation, configuration, and usage of the SDK.

Requirements​

  • iOS 13.0 or later
  • Swift 5.7 or later
  • Xcode 14 or later

Installation​

The SDK can be installed using Swift Package Manager (Recommended) or CocoaPods.

Swift Package Manager​

Add the DataGrail Consent SDK to your project using Swift Package Manager:

  1. In Xcode, go to File → Add Packages
  2. Enter the repository URL: https://github.com/datagrail/consent-ios.git
  3. Select version 1.0.0 or later

Or add it directly to your Package.swift:

dependencies: [
.package(url: "https://github.com/datagrail/consent-ios.git", from: "1.0.0")
]

CocoaPods​

Add the following to your Podfile:

pod 'DataGrailConsent', '~> 1.0'

Then run:

pod install

Quick Start​

Follow these steps to get the iOS SDK running in your app.

Initialize The SDK​

Initialize the SDK early in your app's lifecycle, typically in AppDelegate.swift or your main app file:

import DataGrailConsent

@main
struct MyApp: App {
init() {
DataGrailConsent.shared.initialize(
configUrl: URL(string: "https://api.consent.datagrail.io/config/YOUR_CONFIG_ID.json")!
) { result in
switch result {
case .success:
print("Consent SDK initialized")
case .failure(let error):
print("Failed to initialize: \(error)")
}
}
}

var body: some Scene {
WindowGroup {
ContentView()
}
}
}

Before showing the consent banner, check if the user needs to provide consent:

if DataGrailConsent.shared.needsConsent() {
// Show consent banner
}

Display the native consent banner to collect user preferences:

DataGrailConsent.shared.showBanner(from: viewController) { preferences in
if let preferences = preferences {
// User made a choice
print("User consented to \(preferences.cookieOptions.count) categories")
} else {
// User dismissed without saving
}
}

You can also specify a display style:

// Full screen style
DataGrailConsent.shared.showBanner(from: viewController, style: .fullScreen) { preferences in
// Handle result
}

// Modal style (default)
DataGrailConsent.shared.showBanner(from: viewController, style: .modal) { preferences in
// Handle result
}

Register a callback to be notified when consent preferences change:

DataGrailConsent.shared.onConsentChanged { preferences in
// Update your tracking configuration
updateTrackingBasedOnConsent(preferences)
}

API Reference​

The iOS SDK provides the following methods for managing consent in your application.

Initialization​

func initialize(
configUrl: URL,
completion: @escaping (Result<Void, ConsentError>) -> Void
)

Initializes the SDK with your configuration URL. Call this once when your app starts.

func needsConsent() -> Bool

Returns true if the user needs to provide consent (no valid consent on file or consent has expired).

Get Current Preferences​

func getPreferences() -> ConsentPreferences?

Returns the user's current consent preferences, or nil if none have been saved.

Save Preferences​

func savePreferences(
_ preferences: ConsentPreferences,
completion: @escaping (Result<Void, ConsentError>) -> Void
)

Saves consent preferences locally and syncs with the backend.

Quick Actions​

// Accept all categories
func acceptAll(completion: @escaping (Result<Void, ConsentError>) -> Void)

// Reject all non-essential categories
func rejectAll(completion: @escaping (Result<Void, ConsentError>) -> Void)

Category Checks​

func isCategoryEnabled(_ categoryKey: String) -> Bool

Check if a specific consent category is enabled:

if DataGrailConsent.shared.isCategoryEnabled("category_marketing") {
// Initialize marketing SDKs
}

if DataGrailConsent.shared.isCategoryEnabled("category_analytics") {
// Initialize analytics
}

Show Banner UI​

func showBanner(
from presentingViewController: UIViewController,
style: BannerDisplayStyle = .modal,
completion: @escaping (ConsentPreferences?) -> Void
)

Display the native consent banner. The completion handler receives the saved preferences, or nil if the user dismissed without saving.

func onConsentChanged(_ callback: @escaping (ConsentPreferences) -> Void)

Register a callback to be notified whenever consent preferences change.

Reset​

func reset()

Clears all stored consent data. Useful for testing or when a user logs out.

Integration Patterns​

These patterns demonstrate common ways to integrate the SDK into your application architecture.

Delayed Tracking Initialization​

Wait for consent before initializing tracking SDKs:

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

DataGrailConsent.shared.initialize(configUrl: configUrl) { result in
if case .success = result {
self.initializeTrackingIfAllowed()
}
}

DataGrailConsent.shared.onConsentChanged { _ in
self.initializeTrackingIfAllowed()
}

return true
}

func initializeTrackingIfAllowed() {
if DataGrailConsent.shared.isCategoryEnabled("category_analytics") {
// Initialize analytics SDK
}

if DataGrailConsent.shared.isCategoryEnabled("category_marketing") {
// Initialize marketing SDK
}
}

Block app functionality until consent is provided:

struct ContentView: View {
@State private var showConsentWall = false

var body: some View {
MainAppView()
.onAppear {
if DataGrailConsent.shared.needsConsent() {
showConsentWall = true
}
}
.fullScreenCover(isPresented: $showConsentWall) {
ConsentWallView {
showConsentWall = false
}
}
}
}

Settings Screen Integration​

Allow users to manage their preferences from app settings:

Button("Manage Privacy Preferences") {
DataGrailConsent.shared.showBanner(from: self) { preferences in
if let preferences = preferences {
print("Preferences updated")
}
}
}

Accessibility​

The SDK provides full VoiceOver support:

  • All UI elements include accessibility labels describing their purpose
  • Accessibility hints explain what happens when interacting with elements
  • Toggle states are announced (e.g., "Marketing consent - Enabled")
  • Navigation between consent layers is announced

Offline Support​

The SDK automatically handles offline scenarios:

  • Consent preferences are saved locally first
  • Failed backend syncs are queued and retried automatically
  • Exponential backoff retry (5 attempts, 250ms base delay)
  • Manual retry available via retryPendingRequests()

Running the Demo App​

A demo app is included to help you explore the SDK:

cd mobile/ios
./launch_demo.sh

Or manually:

  1. Open DemoProject/Demo.xcodeproj in Xcode
  2. Select a simulator
  3. Press Cmd+R to build and run

Troubleshooting​

Common issues and how to resolve them.

SDK Not Initializing
  • Verify the config URL is valid HTTPS
  • Check network permissions in Info.plist
  • Review console for JSON parsing errors
Banner Not Showing
  • Ensure needsConsent() returns true
  • Verify showBanner is set to true in your config
  • Check that you're passing a valid presenting view controller
Preferences Not Persisting
  • Verify savePreferences() completion shows success
  • Check backend connectivity
  • Review offline queue with retryPendingRequests()

Next Steps​

 

Need help?
If you have any questions, please reach out to your dedicated Account Manager or contact us at support@datagrail.io.

Disclaimer: The information contained in this message does not constitute as legal advice. We would advise seeking professional counsel before acting on or interpreting any material.