Key takeaways
- Web features such as getUserMedia, geolocation and upload fields trigger native iOS prompts, so your purpose strings must describe what the website does with the data.
- Hiding the website footer in the app often hides the privacy policy link too – Guideline 5.1.1(i) requires it inside the app.
- Apple says data collected via web traffic must be declared, so the scripts on your site belong in your App Privacy details.
- WebViewGold handles the native side – media capture, geolocation, push timing, a Settings shortcut – while strings and policy stay your words.
Our recommended solution
Rebuild your wrapper with WebViewGold – a real app, not just a website in a frame
WebViewGold turns your website into native iOS and Android apps with push notifications, a native offline screen, deep links, a QR scanner and more – the building blocks App Store reviewers look for. Built by our own team, and we submit WebViewGold apps all the time.
What the rejection typically looks like
Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
One or more purpose strings in the app do not sufficiently explain the use of protected resources. Purpose strings must clearly and completely describe the app's use of data and, in most cases, provide an example of how the data will be used.
Next Steps
Revise the camera and microphone purpose strings in your app's Info.plist to explain why the app needs access and include an example.
Paraphrased example – the exact wording in your message may differ.
Why was my WebView app rejected under Guideline 5.1.1?
Your WebView app was rejected under Guideline 5.1.1 because App Review found a problem with how the app asks for, collects or explains personal data. In a website-based app, that problem usually sits in your web content, not in Swift code: a camera or location prompt with a vague text, a privacy link the reviewer couldn't find, or a sign-up wall on the start page.
Guideline 5.1.1 has ten sub-clauses, and two of them matter most for WebView apps. The privacy policy rule, 5.1.1(i):
All apps must include a link to their privacy policy in the App Store Connect metadata field and within the app in an easily accessible manner.
And the last sentence of the permission rule, 5.1.1(ii):
Ensure your purpose strings clearly and completely describe your use of the data.
For a wrapper, this means iOS treats your website like any other part of the app: a page that calls the camera triggers the system alert with your Info.plist text, and App Review judges text, timing and data use as it would for native code. Apple rejected over 443,000 submissions for privacy violations in 2025 (Apple Newsroom). Our complete Guideline 5.1.1 guide covers every sub-clause; this article covers what changes when a website runs inside your app.
Which website features trigger iOS permission prompts?
Browser APIs that reach protected hardware end up at a native iOS check when they run in WKWebView. Each needs a key in your app's Info.plist, and each fails in its own way.
| Web feature | Key your app needs | What the reviewer runs into |
|---|---|---|
Video sessions, voice messages or WebRTC calls with navigator.mediaDevices.getUserMedia() | NSCameraUsageDescription, NSMicrophoneUsageDescription | Generic alert texts, prompts on page load – or, without the keys, a call that fails because WebKit refuses capture |
Store finder, delivery tracking or check-in with navigator.geolocation | NSLocationWhenInUseUsageDescription | A location alert on the home page before anyone searched for anything nearby |
Upload field such as <input type="file" accept="image/*"> | NSCameraUsageDescription for the camera option ("Take Photo") | Without the key, iOS terminates the app when the reviewer picks the camera |
| Saving tickets or images to Photos through a download feature | NSPhotoLibraryAddUsageDescription | A crash or a vague string at the moment of saving |
| A native gallery module that reads the photo library | NSPhotoLibraryUsageDescription | Full library access where a picker would do |
One detail saves you a permission: WebKit's upload menu offers Photo Library, a camera option and Choose File, and its Photo Library option opens the system's out-of-process picker – no library access needed. That matches 5.1.1(iii): "use the out-of-process picker or a share sheet rather than requesting full access".
Rejected or stuck? Talk to an App Specialist – for free.
Book a free consultation call: we look at your rejection or setup, explain the fastest way forward and tell you honestly whether you need us. Prefer to hand it off? Book our AI-powered + human-powered service and we take care of it.
Purpose strings that describe the web feature, not the app shell
Reviewers read your purpose string while looking at your web page. Name the feature as your interface does, say why the resource is needed and give an example:
- Coaching or telehealth platform. Camera: "Your camera shows you to your coach in video sessions you start from the Sessions tab." Microphone: "Your microphone lets your coach hear you during video sessions."
- Restaurant or retail chain. Location: "Your location is used to list the nearest branches and their opening hours when you tap Find a branch."
- Marketplace. Camera: "The camera lets you photograph an item and add the pictures to your listing."
Only write what is true, and watch for three wrapper-specific traps:
- Inherited keys. Starter projects and plugins can declare keys for features your site never uses. Remove each such key together with the module behind it; if code still references the API, App Store Connect flags the upload with
ITMS-90683. - Language mismatch. Localize the strings like the site – a Spanish page with an English alert looks unfinished.
- Third-party embeds. A video-call widget or an identity check in an iframe uses the same camera your pages do. Your string has to cover it, and your policy has to name the provider.
Ask when the feature is used – and plan for "Don't Allow"
Timing is where web code and iOS disagree most: a getUserMedia() call on page load shows the system alert before the user knows why. Guideline 5.1.1(iv) says apps must not "manipulate, trick, or force people to consent to unnecessary data access" and adds: "Where possible, provide alternative solutions for users who don’t grant consent."
- Tie every request to a tap – the camera to "Start video session", location to "Use my location", never to page load.
- Handle a refusal in JavaScript.
getUserMedia()rejects with aNotAllowedError; the geolocation error callback reportsPERMISSION_DENIED. Show a postcode field, an upload from files or a phone number instead of an empty screen. - Avoid the double prompt. Since iOS 15, the
WKUIDelegatemethodwebView(_:requestMediaCapturePermissionFor:initiatedByFrame:type:decisionHandler:)decides whether WebKit adds its own per-site question to the iOS alert. If you don't implement it, the system returns.prompt, so users can see two dialogs. Grant your own origin there – never third-party frames blindly. - Treat push the same way: ask after a booking or order, not on the first screen.
Privacy policy and App Privacy details: your website counts too
Keep the policy one tap away in app mode
Most WebView apps hide the website's footer for a native look – and the privacy link usually lives there. Give the policy a place the app shows, such as a Privacy entry in your menu or settings page. Enter the same URL in App Store Connect under App Privacy and make sure it opens without a login.
Check the content, too. 5.1.1(i) requires the policy to identify what is collected and how, to confirm that third parties such as "analytics tools, advertising networks and third-party SDKs" protect the data equally, and to explain retention, deletion and revoking consent. If one policy covers website and app, say so.
Declare what your web scripts collect
Apple's App Privacy documentation is explicit: "Data collected via web traffic must be declared, unless you are enabling the user to navigate the open web." Analytics tags, live chat, newsletter forms and payment iframes all count. List every third-party request your pages make in app mode, map it to Apple's data types and purposes, and update the answers whenever your site changes – no app update needed.
If one of those scripts is an ad pixel that links your users with other companies' data, the question moves to Guideline 5.1.2 – see tracking scripts in WebView apps.
The fastest fix for most WebView rejections
WebViewGold: native features for your web app
Instead of building native features from scratch, start from WebViewGold. You get ready-made Xcode and Android Studio projects for your website, with native modules you switch on in the configuration:
- Push notificationsOneSignal or Firebase, for real, personal events
- Native offline screenNo browser error pages when the connection drops
- Native splash screenApp-like start instead of a loading web page
- Deep linksLinks open the right screen inside the app
- QR & barcode scannerDevice features the website alone can't offer
- In-app purchasesNative purchase flows where the store requires them
No tool guarantees an approval: Apple still judges what your app offers. Use the native features in your main user journey – our App Specialists review your WebViewGold app before it goes to the App Store.
Login walls, sign-up forms and data minimization
The first sentence of 5.1.1(v) is short and strict:
If your app doesn’t include significant account-based features, let people use it without a login.
Web apps break this rule by accident: many dashboards and AI-built apps send every signed-out visitor to /login, which turns the start URL into a login wall. If you have public content – a catalog, articles, a branch finder – start there and ask for an account when someone saves, books or buys. If the app is genuinely account-based, explain that in the review notes and provide a working demo account; our article on completeness issues in WebView apps covers reviewer access.
Sign-up forms deserve a second look. 5.1.1(v) states: "Apps may not require users to enter personal information to function, except when directly relevant to the core functionality of the app or required by law." Mandatory phone, birthday or address fields "for later" fail that test – make them optional or drop them.
Accounts bring one more duty: if people can create one in your app, including on your website inside the web view, you need in-app account deletion. That half of 5.1.1(v) has its own playbook: account deletion for WebView apps.
Where WebViewGold takes care of the native side
WebViewGold is the website-to-app product built by our own team. It turns your site into a native Xcode project in Swift with the native parts of 5.1.1 already wired up:
- Hardware for web features. Camera and microphone for WebRTC and media capture, HTML5 geolocation and camera uploads from web forms work in the app. The Info.plist is in your own project, so you write the strings.
- Permission timing from your web code. Skip the push prompt at first launch (
askforpushpermissionatfirstrun) and request it later with aregisterpush://link; send people who declined a permission to your app's Settings page withsettingsapp://. - App detection. A custom user agent lets your site show an app-only menu with the privacy link.
- Tracking. App Tracking Transparency support for sites that do track.
WebViewGold is a one-time purchase; you own the project and publish in your own developer account, or build in the browser with the separately sold Cloud Builder. No tool can promise an approval – your strings, policy and App Privacy answers remain your responsibility. Many teams split the work: WebViewGold for the native shell, appsubmitter.io for signing, the App Privacy form and the submission.
What needs a new build – and how to answer App Review
| Fix | New build? | Note |
|---|---|---|
| Purpose strings, removed keys, native permission code | Yes | Increment the build number and test every prompt on a device |
| Prompt timing, fallbacks, privacy link, start page, sign-up form in your web code | Usually not | Deploy the website change and describe it precisely in your reply |
| Privacy Policy URL in App Store Connect | No | URL changes go live with the next app version |
| App Privacy answers | No | Update and publish them at any time |
Use Reply to App Review in App Store Connect: quote new purpose strings word for word, list the taps that show each prompt and attach a screen recording including the "Don't Allow" path. If the reviewer misread your app, explain that first. You can still appeal to the App Review Board (one appeal per rejected submission) or request a 30-minute App Review appointment through Meet with Apple.
Prefer to hand it off? The App Specialists at appsubmitter.io compare your prompts, policy and App Privacy answers with what your site actually loads, prepare the reply and resubmit in your developer account. Start with a free consultation call or book the iOS service; code changes aren't included and are quoted upfront if needed.
Template: how to reply to App Review
Adapt this template to your situation. Keep it factual, short and specific – and only claim what you have actually changed.
Checklist before you resubmit
- Each purpose string names the web feature that uses the resource and gives an example.
- Camera, microphone and location requests run only after a tap on the related feature.
- Declining a permission leaves a working alternative in your web app.
- The upload field works with Photo Library, the camera option and Choose File on a device.
- No Info.plist key remains for a feature your app doesn't offer.
- The privacy link is visible in the app without signing in, even with the web footer hidden.
- Your App Privacy details include what your web scripts collect.
- The start URL shows content without a login unless the app is account-based.
- If you use WebViewGold, push permission is requested at a meaningful moment, not at first launch.
Frequently asked questions
Can my website cause a Guideline 5.1.1 rejection of my WebView app?
Do I need NSCameraUsageDescription if only my website uses the camera?
getUserMedia(), and choosing the camera option in a web upload field makes iOS terminate the app. Write a string that names the web feature.Does a photo upload field in my web app need photo library permission?
NSCameraUsageDescription for the camera option, NSPhotoLibraryAddUsageDescription if the app saves images to Photos, and NSPhotoLibraryUsageDescription only if native code reads the library itself.Where should the privacy policy link be in a WebView app?
Do I have to declare my website analytics in the App Privacy details?
Will WebViewGold fix a Guideline 5.1.1 rejection for me?
Recommended solution
From WebView rejection to approval: WebViewGold + appsubmitter.io
- 1 Build with WebViewGold Turn your website into native iOS and Android projects.
- 2 Add native value Push, offline screen, deep links or scanning in your main flow.
- 3 We submit it Our App Specialists submit and talk to the review team.
WebViewGold is made by our team (jocapps GmbH). It is a tool, not a guarantee – approval decisions are made by Apple and Google.
Sources and further reading
- Apple – App Store Review Guidelines, 5.1.1 Data Collection and Storage
- Apple – App privacy details on the App Store
- Apple Developer Documentation – NSCameraUsageDescription
- Apple Developer Documentation – Requesting authorization to capture and save media
- Apple Developer Documentation – WKUIDelegate media capture permission
- WebKit source – file upload panel on iOS (photo picker and camera options)
- App Store Connect Help – Manage app privacy
- Apple Newsroom – App Store fraud prevention in 2025 (May 20, 2026)
Store policies and third-party products change regularly – always check the current versions. This article is independent advice and not affiliated with or endorsed by Apple, Google or any other company or product mentioned; all trademarks belong to their owners. WebViewGold and appsubmitter.io are made by our team at jocapps GmbH.