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.
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:
<key>NSUserTrackingUsageDescription</key>
<string>We use this to measure which ads brought you to the app.</string>iOS
let authorized = await LinkTrail.shared?.requestTrackingAuthorization() ?? falseAndroid
ATT is iOS-only. Android has no equivalent prompt and the Android SDK has no ATT or SKAdNetwork calls.
React Native
const authorized = await LinkTrail.requestTrackingAuthorization(); // always false on AndroidFlutter
final authorized = await LinkTrail.requestTrackingAuthorization(); // always true on AndroidIt 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:
<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
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
LinkTrail.registerForSKAdAttribution();
LinkTrail.updateConversionValue(42, 'medium'); // no-ops on AndroidFlutter
await LinkTrail.registerForSKAdAttribution();
await LinkTrail.updateConversionValue(42,
coarseValue: LinkTrailCoarseConversionValue.medium); // no-ops on Android| iOS version | registerForSKAdAttribution() | updateConversionValue(value, coarseValue) |
|---|---|---|
| 16.1 and later | Nothing to register; the call only logs | Sets the fine and the coarse value (coarse defaults to low when omitted) |
| 15.4 – 16.0 | Sets the conversion value to 0 | Sets the fine value; the coarse value is ignored |
| 15.0 – 15.3 | Registers the app for ad network attribution | Registers 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 value | Meaning (example) | Coarse value |
|---|---|---|
| 0 | Installed and opened | low |
| 1 | Finished onboarding | low |
| 2 | Signed up | medium |
| 3 | First purchase | high |
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.