The Ketch Mobile SDK provides iOS and Android native integration of Ketch's consent and preference management capabilities.
This SDK supports iOS version 15.0 and above.
The minimum required version of Xcode is 15.0.
The minimum required version of Swift is 5.5.
The use of the Mobile SDK requires an Ketch organization account with the application property configured.
The SDK provides a pre-registered sample organization for quick testing and evaluation. While convenient, it’s advisable to switch to your own organization promptly. Your own organization ensures isolation, security, scalability, and tailored support, optimizing your development process. Simply sign up for a new account, update SDK configurations, and transition seamlessly for production readiness and long-term usage.
A sandbox organization and configuration is available for development and tests:
Organization: ketch_samples
Property: ios
Boot.js: https://global.ketchcdn.com/web/v3/config/ketch_samples/ios/boot.js
Site: https://ketch-com.github.io/testing-sites/prod/ketch_samples_ios.html
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler.
Add the Ketch iOS SDK as a dependency to the dependencies value of your Package.swift or the Package list in Xcode.
dependencies: [
.package(url: "https://github.com/ketch-com/ketch-ios.git", .upToNextMajor(from: "3.0.0"))
]CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Ketch iOS SDK into your Xcode project using CocoaPods, specify it in your Podfile:
pod 'KetchSDK', :git => 'https://github.com/ketch-com/ketch-ios.git'var ketch: Ketch?
var ketchUI: KetchUI?private func setupKetch(advertisingIdentifier: UUID) {
let ketch = KetchSDK.create(
organizationCode: "#{your_org_code}#",
propertyCode: "#{your_property}#",
environmentCode: "#{your_environment}#",
identities: [
Ketch.Identity(key: "aaid", value: "00000000-0000-0000-0000-000000000000"),
Ketch.Identity(key: "email", value: "[email protected]"),
Ketch.Identity(key: "account_id", value: "1234")
]
)
self.ketch = ketch
}ketchUI = KetchUI(ketch: ketch)If you use SwiftUI, setup KetchUI.webPresentationItem as ketchView in View:
var body: some View {
VStack {
...
}
.ketchView(model: $ketchUI.webPresentationItem)
}If you use UIKit, present KetchUI as modal:
func presentKetchUI() {
// 1. collect needed parameter
let params: [KetchUI.ExperienceOption] = [
.environment("production"),
.language(code: "EN")
]
// 2. reload ketch
ketchUI.reload(with: params)
}In UIKit you are responsible for KetchUI presenting/dismissal, so make sure you subscribe on Ketch events
ketchUI.eventListener = selfextension ViewController: KetchEventListener {
// present the Ketch View Controller
func onShow() {
guard let presentationItem = ketchUI.webPresentationItem else {
return
}
present(presentationItem.viewController, animated: false)
}
// handle dssmiss
func onDismiss() {
dismiss(animated: false)
}
func onEnvironmentUpdated(environment: String?) { }
func onRegionInfoUpdated(regionInfo: String?) { }
func onJurisdictionUpdated(jurisdiction: String?) { }
func onIdentitiesUpdated(identities: String?) { }
func onConsentUpdated(consent: KetchSDK.ConsentStatus) { }
func onError(description: String) { }
func onCCPAUpdated(ccpaString: String?) { }
func onTCFUpdated(tcfString: String?) { }
func onGPPUpdated(gppString: String?) { }
}extension KetchUI {
public enum ExperienceOption {
/// Enables console logging by Ketch components
case logLevel(LogLevel)
/// Forces an experience to show
case forceExperience(ExperienceToShow)
/// Overrides environment detection and uses a specific environment
case environment(String)
/// ISO-3166 country code overrides region detection and uses a specific region
case region(code: String)
/// Jurisdiction code overrides jurisdiction detection and uses a specific jurisdiction
case jurisdiction(code: String)
/// ISO 639-1 language code, with optional regional extension overrides language detection and uses a specific language
case language(code: String)
/// Default tab that will be opened
case preferencesTab(PreferencesTab)
/// Comma separated list of tabs to display on the preference experience
case preferencesTabs(String)
/// URL string for SDK, including `https://`
case ketchURL(String)
/// Overrides identities passed on init
case identity(Ketch.Identity)
/// Inject CSS into the Ketch UI
case css(String)
public enum ExperienceToShow: String {
case consent, preferences
}
public enum PreferencesTab: String, CaseIterable {
case overviewTab, rightsTab, consentsTab, subscriptionsTab
}
public enum LogLevel: String, Codable {
case trace, debug, info, warn, error
}
}
}var params: [KetchUI.ExperienceOption] = [
.region(code: "US"),
.language(code: "EN"),
.forceExperience(.consent),
.jurisdiction(code: "default"),
.environment("production")
]
ketchUI.reload(with: params)public protocol KetchEventListener: AnyObject {
func onShow()
func onDismiss()
func onEnvironmentUpdated(environment: String?)
func onRegionInfoUpdated(regionInfo: String?)
func onJurisdictionUpdated(jurisdiction: String?)
func onIdentitiesUpdated(identities: String?)
func onConsentUpdated(consent: KetchSDK.ConsentStatus)
func onError(description: String)
func onCCPAUpdated(ccpaString: String?)
func onTCFUpdated(tcfString: String?)
func onGPPUpdated(gppString: String?)
}ketchUI.eventListener = #{myEventListener}#We provide a complete sample app to illustrate the integration: here