App Tracking Transparency & GDPR Consent in WebView Apps
Your website already has a cookie banner. It has had one for years, it is properly configured, and it satisfies your legal team. Then you wrap that website in an app, submit it, and Apple rejects you for tracking without permission. The cookie banner inside your WebView does not satisfy Apple's App Tracking Transparency requirement, because ATT is a native system prompt and a web page cannot display one.
These are two separate consent systems with two separate legal bases. Most WebView apps need both, and satisfying one does nothing for the other.
This is a technical guide, not legal advice. Privacy law depends on your jurisdiction, your users' locations, and what your site actually collects. Use this to understand how consent behaves inside a WebView, then confirm your specific obligations with a qualified advisor.
Does a WebView App Need ATT and Cookie Consent?
If your website loads any third-party advertising or analytics that tracks users across other companies' apps and sites, then your iOS app needs the native ATT prompt, and your site still needs its own consent mechanism for EU and UK users. Neither one replaces the other.
| App Tracking Transparency | GDPR / ePrivacy consent | |
|---|---|---|
| Who requires it | Apple, as an App Store rule | Law, for EU/UK users |
| Where it appears | Native iOS system prompt | Your website's own banner, inside the WebView |
| Applies on Android? | No — no ATT equivalent | Yes, the law is platform-neutral |
| What it gates | The IDFA and cross-company tracking | Non-essential cookies and similar storage |
| Can the other one satisfy it? | No | No |
The trap is that a wrapped site looks like it is already handling consent, because the familiar banner appears on launch. It is handling one of the two requirements. The other one is invisible until App Review points at it. If you are new to how the wrapper works at all, start with what a WebView app actually is.
What Is App Tracking Transparency, and Does It Apply to a WebView App?
App Tracking Transparency is Apple's requirement that an app ask permission through a system prompt before tracking a user across apps and websites owned by other companies — and it applies to tracking your web content performs, not just tracking your native code performs. That last part is what catches wrapped sites.
Apple's framing is about the app as a whole. If your site loads a third-party ad network, a social pixel, or an analytics product that builds a cross-company profile, that behaviour is happening inside your app, and the app is what Apple reviews. "The tracking is in the website, not the app" is not a distinction Apple's rules recognise.
Mechanically the native side is small:
- The
AppTrackingTransparencyframework presents the prompt, via a tracking authorization request made from native code. - An
NSUserTrackingUsageDescriptionstring inInfo.plistexplains why you are asking. Without it the prompt will not display at all. - The IDFA is only available if the user allows it. Denied means your ad and analytics tools fall back to non-personalised behaviour.
This is native work, which is worth knowing if you are having an app built for you: it is a question to ask your builder directly rather than assume. Our guide to adding AdMob ads to a WebView app covers the same prompt from the monetisation side, and iOS permission best practices covers how to ask without getting denied by reflex.
The quick test: open your site in a desktop browser and look at the network requests on first load. If you see calls to ad networks, social pixels or third-party analytics you do not own, assume ATT applies to your iOS build.
Does My Website's Cookie Banner Cover the App?
Your cookie banner works normally inside a WebView and still does its job for GDPR and ePrivacy purposes — but it cannot produce Apple's ATT prompt, because only native code can. A web page has no ability to render a system dialog.
This is the single most common misunderstanding in this whole area, and it is an easy one to have. The banner is visible, it stores a choice, and everything looks handled. But the two mechanisms are answering different questions:
- Your banner asks: may this website store and use non-essential cookies and similar identifiers?
- The ATT prompt asks: may this app track you across other companies' apps and websites?
A user can reasonably answer yes to one and no to the other, and your implementation has to respect both answers independently. Treating an accepted cookie banner as blanket permission to track is exactly the behaviour both systems exist to prevent.
ATT vs GDPR Consent: Two Requirements, One App
ATT is a platform policy enforced by App Review; GDPR and ePrivacy consent is a legal obligation enforced by regulators. They overlap in subject matter and not at all in mechanism. You can fail either one while perfectly satisfying the other.
| Scenario | What happens |
|---|---|
| Cookie banner only, no ATT prompt, site runs ad trackers | App Store rejection risk. The most common version of this problem. |
| ATT prompt only, no consent mechanism for EU users | Apple is satisfied. Your legal exposure in the EU and UK is not addressed. |
| Both present but wired to nothing | Worst case — the appearance of compliance while trackers fire regardless. |
| Both present, both actually gating the trackers | What you are aiming for. |
That third row deserves emphasis. A consent banner that sets a cookie but does not actually prevent scripts from loading is decorative. The test is not whether the dialog appears; it is whether declining it changes what the app does.
Why Does the Cookie Banner Reappear Every Time the App Opens?
Because consent choices are stored in cookies or local storage, and if the WebView is not configured to persist that storage, the record of the choice is thrown away when the app closes. The banner is working correctly; the storage underneath it is not.
This is genuinely bad for you in two directions. Users find a banner on every single launch intensely annoying, and a consent record that does not survive a restart is not much of a record. The fix is the same storage configuration that keeps users logged in:
- The consent cookie needs an explicit expiry, not a session cookie that dies with the app process.
- Android WebView needs DOM storage enabled and its cookies flushed before the process is killed.
- iOS needs the default (persistent) website data store, not the non-persistent one.
All three are covered in detail in our guide to session and cookie persistence in WebView apps. If your banner reappears every launch, fix storage first — nothing else in this article will behave predictably until you do.
What Are the Rules on Android?
Android has no App Tracking Transparency equivalent, but it has its own advertising ID rules and a mandatory Data Safety disclosure — and EU and UK consent law applies exactly the same on Android as on iOS. Fewer prompts, not fewer obligations.
Three things matter on the Android side:
- The advertising ID permission. Apps targeting newer Android versions that use the advertising ID must declare the
AD_IDpermission. Omit it and the identifier comes back as zeros, which usually surfaces as ad revenue quietly collapsing rather than as an error. - The Data Safety form. Google Play requires you to declare what your app collects and shares — and that includes data collected by your website inside the WebView. Our Data Safety form walkthrough covers how to fill it in without over-claiming.
- Consent still applies. GDPR does not care which app store the app came from. Your banner needs to work, and actually gate scripts, on both platforms.
Declare what the website does, not just what the shell does. A wrapper app that declares "no data collected" while the site inside runs analytics and ad tags is an inaccurate disclosure. Play's declaration covers the whole app, WebView contents included.
What Order Should the Prompts Appear In?
Show the ATT prompt before any tracking begins, and do not stack it on top of your cookie banner in the same moment — two consent dialogs fired at once on first launch is the fastest way to get both of them declined. Sequence matters for consent rates as much as for compliance.
A workable order for a wrapped site:
- Let the app open and render something useful first. A prompt before the user has seen anything gets dismissed reflexively.
- Show the ATT prompt from native code, ideally after a brief moment of context — a short native screen explaining what personalisation buys the user tends to outperform a cold prompt.
- Let the website's consent banner appear once the user is on the page, as it normally would.
- Gate the trackers on both answers. Tracking should only run where ATT was allowed and consent was given.
Because ATT can only be asked once, that single prompt matters. If the user denies it, the only route back is the iOS Settings app, so it is worth spending the effort on the timing and the explanation.
What Changed in 2025–2026
The direction of travel is that platforms increasingly want machine-readable declarations of what you collect, rather than trusting a prose privacy policy. Three developments matter for wrapped sites as of September 2026.
- Privacy manifests on iOS. Apple requires apps and many third-party SDKs to ship a privacy manifest declaring collected data types and the reasons for using certain APIs. A wrapper app is not exempt because its content is web-based.
- Consent signals are expected by ad platforms, not just regulators. Google requires consent signals from advertisers serving users in the EEA, which means an EU-facing site running Google ad products needs its consent mechanism wired into those signals rather than merely displayed.
- Enforcement of ATT has tightened. Apple has become notably stricter about apps that use advertising identifiers without showing the prompt, which is consistent with the broader pattern in common Apple rejection reasons.
None of this changes the underlying principle. It does mean that vague or absent declarations are increasingly caught automatically rather than by a human reviewer noticing.
Step-by-Step: Getting Consent Right in a WebView App
Start by finding out what your site actually loads, because everything else depends on that answer. Six steps, and the first is the one most teams skip.
Audit what your website actually loads
Open the site with the network panel on and list every third-party request on first load. Ad networks, social pixels and third-party analytics are the ones that trigger ATT obligations.
Add the ATT prompt to the iOS shell
Request tracking authorization from native code and add an NSUserTrackingUsageDescription string to Info.plist. Without that string the prompt silently never appears.
Make your consent banner actually gate scripts
Confirm that declining consent prevents tracking scripts from loading, rather than just recording a preference while the tags fire anyway.
Make the consent choice persist
Give the consent cookie a real expiry, enable DOM storage and flush cookies on Android, and use the persistent data store on iOS so the banner does not reappear every launch.
Declare the same thing everywhere
Your Play Data Safety form, your App Store privacy details and your privacy policy should describe the same collection — including what the website does inside the WebView.
Test the denial paths, not just the happy path
Deny ATT, decline consent, and confirm the app still works and that no tracking requests fire. This is what a reviewer and a regulator would both check.
Common Mistakes
Assuming the cookie banner satisfies Apple
It cannot. A web page has no way to display a system-level tracking prompt, and Apple's requirement is specifically about that native prompt.
Showing a banner that does not gate anything
If the trackers load regardless of the answer, the banner is decorative. Declining has to change what the app does, or the mechanism is worse than useless.
Firing both prompts on first launch simultaneously
Two consent dialogs before the user has seen any value is the reliable way to have both declined, and ATT can only be asked once.
Declaring "no data collected" for a wrapper app
Store declarations cover the whole app including WebView content. If the site runs analytics or ad tags, the app collects data.
Forgetting the AD_ID permission on Android
The advertising identifier comes back as zeros without it, which usually shows up as unexplained revenue loss rather than an obvious failure.
How Do You Test Consent Properly?
Test the paths where the user says no, because those are the ones that get an app rejected or a company fined — and they are the ones nobody tries. The happy path almost always works.
- Deny the ATT prompt and confirm the app still functions and requests no advertising identifier.
- Decline the cookie banner and watch the network traffic. If tracking requests still fire, the banner is not wired to anything.
- Force-quit and relaunch. Both the ATT answer and the consent choice should survive; a banner on every launch means a storage problem.
- Reset ATT in iOS Settings and confirm the prompt appears again on a clean install, since it can only be shown once per install.
- Check both platforms. Android has no ATT prompt but the same consent obligations, and it is easy to wire one platform and forget the other.
Watching real network traffic is the only reliable check here. A consent tool's own dashboard reports what it believes it is doing, which is not always what the page actually does — the same reason we recommend real-device testing for camera, file upload and geolocation permissions.
Frequently Asked Questions
No. App Tracking Transparency requires a native iOS system prompt, and a web page loaded in a WebView has no way to display one. Your cookie banner still does its job for GDPR and ePrivacy purposes, but Apple's requirement is specifically about the system-level tracking prompt shown by native code. If your site loads third-party ad or analytics trackers, your iOS build needs the ATT prompt in addition to the banner you already have.
Yes. Apple evaluates the app as a whole, and web content loaded inside your WebView is part of your app. If your site loads an ad network, a social pixel or third-party analytics that profiles users across other companies' properties, that tracking is happening inside your app. The argument that the tracking belongs to the website rather than the app is not a distinction Apple's rules recognise, and it is a common reason wrapped sites get rejected.
Because the consent choice is stored in a cookie or in local storage, and the WebView is discarding that storage when the app closes. The banner itself is working correctly. The fix is storage configuration: give the consent cookie an explicit expiry rather than leaving it as a session cookie, enable DOM storage and flush cookies on Android, and make sure iOS is using the persistent website data store rather than the non-persistent one.
No, Android has no ATT prompt. It does have its own rules that matter: apps targeting newer Android versions must declare the AD_ID permission to use the advertising identifier, and Google Play requires a Data Safety declaration covering what the app collects and shares. EU and UK consent law applies identically on Android, so your consent banner still has to work and still has to actually prevent tracking scripts from loading when a user declines.
You can, but it is a poor idea. Two consent dialogs stacked on first launch, before the user has seen anything of value, is the most reliable way to have both of them declined. Let the app render something useful first, show the ATT prompt from native code with a little context about what personalisation offers, then let the website's banner appear as it normally would. ATT can only be asked once per install, so the timing of that single prompt is worth getting right.
Your app loses access to the advertising identifier, and ad and analytics tools fall back to non-personalised behaviour. The app must continue to work normally otherwise, and you cannot degrade the experience to punish the choice. The prompt can only be shown once per install, so a user who declines can only change their mind through the iOS Settings app. Testing the denial path is important, because that is the state a reviewer is likely to check.
Only if the website genuinely collects nothing, which is rare. Store privacy declarations cover the entire app, and the web content loaded inside your WebView is part of it. If your site runs analytics, advertising tags or any third-party scripts that gather user data, your app collects data and the declaration needs to say so. An inaccurate declaration is its own compliance problem, separate from whatever the tracking itself requires.
Key Takeaways
- A cookie banner cannot satisfy ATT — only a native system prompt can, and a web page cannot display one.
- ATT covers tracking your website does, not just your native code. The app is what Apple reviews.
- These are two separate systems with different enforcers; satisfying one does nothing for the other.
- A banner that does not gate scripts is decorative. Declining has to change what the app actually does.
- Consent that resets every launch is a storage bug, and it is the same fix as keeping users logged in.
- Android has no ATT but the same consent obligations, plus the
AD_IDpermission and a Data Safety declaration. - Test the denial paths — those are the ones that get apps rejected.
Consent handling sits alongside the other details that separate a production-ready app from a thin wrapper, like dark mode and the native touches covered in our previous guide. The difference is that getting this one wrong has consequences beyond a user deleting your app.
Want an App Built With This Handled?
AppOfWeb builds your website into native Android and iOS apps for a one-time fee — and the consent and tracking setup is a conversation we have before you submit, not after you are rejected.
Get Your Free Demo →