Integration Brief Template¶
A reusable hand-off template for consultants and developers. One brief per app per engagement — the consultant fills in the {{PLACEHOLDER}} fields, sends it to the developer, and both sides sign off when the acceptance test in §5 passes.
How to use this page
Download this template and fill in the {{PLACEHOLDER}} fields.
Airlock Integration Brief — {{CLIENT_NAME}} / {{APP_NAME}}¶
| Field | Value |
|---|---|
| Engagement | {{ENGAGEMENT_NAME}} |
| Consultant | {{CONSULTANT_NAME}} <{{CONSULTANT_EMAIL}}> |
| Developer contact | {{DEV_CONTACT_NAME}} <{{DEV_CONTACT_EMAIL}}> |
| Target platforms | iOS / Android / both |
| Airlock version | {{AIRLOCK_VERSION}} (e.g. 0.3.16) |
| Brief issued | {{YYYY-MM-DD}} |
| Go-live target | {{YYYY-MM-DD}} |
1. What Airlock does in this app¶
Airlock is an Adobe Launch extension that runs on-device, intercepting every analytics event between MobileCore.track*() and Adobe's collection servers. It applies JavaScript rules authored in Launch — enriching, mutating, suppressing, or passing through events without an app rebuild.
For this engagement, Airlock will be configured to:
- {{BUSINESS_OUTCOME_1}}
- {{BUSINESS_OUTCOME_2}}
- {{BUSINESS_OUTCOME_3}}
The developer integrates the SDK once. All future rule changes ship over-the-air through Adobe Launch and require no app release.
2. Adobe Launch configuration¶
| Field | Value |
|---|---|
| Adobe org | {{ADOBE_ORG_NAME}} ({{ADOBE_ORG_ID}}@AdobeOrg) |
| Launch property name | {{LAUNCH_PROPERTY_NAME}} |
| Launch property ID | {{LAUNCH_PROPERTY_ID}} |
| Dev environment ID | {{LAUNCH_DEV_APP_ID}} |
| Stage environment ID | {{LAUNCH_STAGE_APP_ID}} |
| Prod environment ID | {{LAUNCH_PROD_APP_ID}} |
These IDs go into MobileCore.configureWithAppId(...) (see §4).
3. SDK dependencies¶
These must be installed and registered in addition to Airlock. Airlock requires AEP Core 5.0+ on iOS and 3.0+ on Android.
| Extension | iOS | Android | Why |
|---|---|---|---|
| AEP Core | AEPCore ≥ 5.0 |
com.adobe.marketing.mobile:core:3.+ |
Required — event hub |
| AEP Identity | AEPIdentity ≥ 5.0 |
com.adobe.marketing.mobile:identity:3.+ |
Required — ECID resolution |
| AEP Lifecycle | AEPLifecycle ≥ 5.0 |
com.adobe.marketing.mobile:lifecycle:3.+ |
Recommended — session metrics |
| AEP Analytics | AEPAnalytics ≥ 5.0 |
com.adobe.marketing.mobile:analytics:3.+ |
Required — actually sends the hit |
| AEP Assurance | AEPAssurance ≥ 5.0 |
com.adobe.marketing.mobile:assurance:3.+ |
Required for acceptance test |
| Airlock | Airlock {{AIRLOCK_VERSION}} |
com.maxisdigital:airlock:{{AIRLOCK_VERSION}} (via JitPack for v0.x) |
The extension itself |
4. Integration steps¶
4a. iOS¶
Add the package in Xcode → File → Add Packages…:
Register at app launch. In AppDelegate.swift (or your @main App init):
import AEPCore
import AEPIdentity
import AEPLifecycle
import AEPAnalytics
import AEPAssurance
import Airlock
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
MobileCore.setLogLevel(.debug) // Remove for production
MobileCore.registerExtensions([
Identity.self,
Lifecycle.self,
Analytics.self,
Assurance.self,
Airlock.self,
]) {
MobileCore.configureWith(appId: "{{LAUNCH_DEV_APP_ID}}")
MobileCore.lifecycleStart(additionalContextData: nil)
}
return true
}
Deep link (for Assurance sessions). Add to Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array><string>{{ASSURANCE_DEEP_LINK_SCHEME}}</string></array>
</dict>
</array>
Forward the URL in SceneDelegate:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
URLContexts.forEach { Assurance.startSession(url: $0.url) }
}
4b. Android¶
Add to app/build.gradle.kts (root settings.gradle.kts must declare JitPack as a repository for v0.x):
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
// app/build.gradle.kts
dependencies {
implementation("com.adobe.marketing.mobile:core:3.+")
implementation("com.adobe.marketing.mobile:identity:3.+")
implementation("com.adobe.marketing.mobile:lifecycle:3.+")
implementation("com.adobe.marketing.mobile:analytics:3.+")
implementation("com.adobe.marketing.mobile:assurance:3.+")
implementation("com.github.maxisdigital:airlock-android:{{AIRLOCK_VERSION}}")
}
Register in Application.onCreate():
import com.adobe.marketing.mobile.*
import com.maxisdigital.airlock.Airlock
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
MobileCore.setApplication(this)
MobileCore.setLogLevel(LoggingMode.DEBUG) // Remove for production
MobileCore.registerExtensions(
listOf(
Identity.EXTENSION,
Lifecycle.EXTENSION,
Analytics.EXTENSION,
Assurance.EXTENSION,
Airlock.EXTENSION,
)
) {
MobileCore.configureWithAppID("{{LAUNCH_DEV_APP_ID}}")
MobileCore.lifecycleStart(null)
}
}
}
Declare it in the manifest: android:name=".MainApplication".
Assurance deep link in AndroidManifest.xml (on the launcher activity):
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="{{ASSURANCE_DEEP_LINK_SCHEME}}" />
</intent-filter>
Forward the URI in the activity's onNewIntent:
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
intent.data?.let { Assurance.startSession(it.toString()) }
}
5. Acceptance test¶
The developer should consider integration complete when all of the following pass.
5a. Build & launch¶
- [ ] App builds clean against
{{AIRLOCK_VERSION}}with no warnings about missing extensions - [ ] App launches without crashing on a clean install
5b. Assurance session¶
- [ ] Consultant creates an Assurance session in Adobe Experience Platform
- [ ] Developer scans the QR / opens the deep link → app connects (green dot in Assurance UI)
- [ ] Assurance shows an
Airlock — (registered)event in the event list
5c. Event flow¶
- [ ] App fires a
MobileCore.trackAction("test-event", nil)(or in-app action) - [ ] Assurance shows the original
generic.track / request.contentevent - [ ] Assurance shows a corresponding
Airlock Processed Trackevent withcontextdata.airlock = "{{AIRLOCK_VERSION}}"andcontextdata.airlock.status = "ok" - [ ] Adobe Analytics receives the enriched hit (visible in Assurance's "Network Requests" view)
5d. Rule execution (consultant validates)¶
- [ ] At least one configured rule from §1 fires and produces the expected modification on the outgoing hit
6. Boundaries — who owns what¶
Developer owns:
- App code, build configuration, dependency management
- SDK registration order and
configureWithAppId(...)call - Lifecycle / deep-link wiring
- Crash reporting, error tracking, anything outside the Adobe SDK stack
Consultant owns:
- Adobe Launch property — rules, data elements, extensions
- Airlock configuration (
airlock.enabled, macros, lookup tables, accumulators, derived metrics) - Rule JavaScript
- Adobe Analytics report suite configuration
Do not edit on the developer side
- The Airlock SDK source (it's a pinned dependency — bumping the version is fine, editing the source is not).
- The Adobe Launch property unless co-ordinating with the consultant.
7. Support & escalation¶
| Need | Contact |
|---|---|
| Bug in Airlock SDK | File an issue: {{ISSUE_TRACKER_URL}} |
| Rule misbehaviour | Consultant: {{CONSULTANT_NAME}} <{{CONSULTANT_EMAIL}}> |
| Adobe SDK bug | aepsdk-core-ios issues / aepsdk-core-android issues |
| Acceptance test failures | Walk through §5 with consultant on Assurance session |
8. Sign-off¶
- [ ] Developer has read this brief end-to-end
- [ ] §5 acceptance test passes against Dev environment
- [ ] §5 acceptance test passes against Stage environment
- [ ] §5 acceptance test passes against Prod environment
Developer: ____ Date: ____
Consultant: ____ Date: ____