SKAdNetwork & ATT

When an iOS app needs the App Tracking Transparency prompt, how to set up SKAdNetwork conversion values with the SDK, and what LinkTrail does not receive.

Two Apple frameworks sit beside LinkTrail on iOS. App Tracking Transparency (ATT) asks the user before an app reads the advertising identifier (IDFA). SKAdNetwork — and AdAttributionKit on newer iOS — has Apple send privacy-preserving install reports, called postbacks, to the ad network that showed the ad. LinkTrail's own attribution uses neither: it matches installs to clicks with the click token, the Play Install Referrer and, if you switch it on, IP and platform.

Important

LinkTrail does not receive or ingest SKAdNetwork or AdAttributionKit postbacks. Apple sends them to the ad network (and, if you set NSAdvertisingAttributionReportEndpoint, a copy to your own server) — not to LinkTrail, and nothing in the dashboard reports them. The SDK's SKAdNetwork calls only update the values Apple puts in those postbacks.

When you need ATT

Only when your app — or another SDK in it, typically an IDFA-based ad network SDK — reads the IDFA. The LinkTrail SDK reads no IDFA and no IDFV and needs no ATT permission. The ATT answer is not LinkTrail consent either: the SDK records consent only through setConsent (Consent & privacy).

If you do prompt, add the purpose string to Info.plist — without it the prompt never appears and authorization is denied — and ask once the app is in the foreground, since iOS shows the prompt only to an active app:

Info.plistXML
<key>NSUserTrackingUsageDescription</key>
<string>We use this to measure which ads brought you to the app.</string>

iOS

Swift
let authorized = await LinkTrail.shared?.requestTrackingAuthorization() ?? false

Android

ATT is iOS-only. Android has no equivalent prompt and the Android SDK has no ATT or SKAdNetwork calls.

React Native

TypeScript
const authorized = await LinkTrail.requestTrackingAuthorization(); // always false on Android

Flutter

Dart
final authorized = await LinkTrail.requestTrackingAuthorization(); // always true on Android

It resolves true when tracking is authorized. If the user has already answered, it returns that answer without prompting again.

SKAdNetwork

For an ad network's iOS ads to produce postbacks, your app's Info.plist must list that network's SKAdNetwork identifiers. Each network publishes its own; add one entry per identifier:

Info.plistXML
<key>SKAdNetworkItems</key>
<array>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <!-- one dict per identifier, copied from each ad network's documentation -->
        <string>example123.skadnetwork</string>
    </dict>
</array>

The SKAdNetwork IDs field on an iOS app in the dashboard is stored with the app only; Apple reads the list from your Info.plist.

Register and update conversion values

Call registerForSKAdAttribution() early in the app's life and updateConversionValue as the user reaches the milestones you measure. On Android both are no-ops.

iOS

Swift
LinkTrail.shared?.registerForSKAdAttribution()

// Fine value 0–63, plus a coarse value (low / medium / high) on iOS 16.1+:
LinkTrail.shared?.updateConversionValue(42, coarseValue: .medium)

Android

SKAdNetwork is iOS-only; there is nothing to call on Android.

React Native

TypeScript
LinkTrail.registerForSKAdAttribution();
LinkTrail.updateConversionValue(42, 'medium'); // no-ops on Android

Flutter

Dart
await LinkTrail.registerForSKAdAttribution();
await LinkTrail.updateConversionValue(42,
    coarseValue: LinkTrailCoarseConversionValue.medium); // no-ops on Android
iOS versionregisterForSKAdAttribution()updateConversionValue(value, coarseValue)
16.1 and laterNothing to register; the call only logsSets the fine and the coarse value (coarse defaults to low when omitted)
15.4 – 16.0Sets the conversion value to 0Sets the fine value; the coarse value is ignored
15.0 – 15.3Registers the app for ad network attributionRegisters only; conversion values are not supported

The conversion-value schema

A conversion value is a number from 0 to 63 that you define and the ad network decodes. LinkTrail neither defines nor reads the schema, so agree it with the networks you buy from. A common shape uses the value for the furthest step the user reached and the coarse value for revenue:

Fine valueMeaning (example)Coarse value
0Installed and openedlow
1Finished onboardinglow
2Signed upmedium
3First purchasehigh

Postbacks are aggregated and delayed by Apple and are never tied to an install, so they will not reconcile one-for-one with the installs in the dashboard. How LinkTrail attributes installs is in Attribution.