Short answer
Read the key names in the email. For each one (NSCameraUsageDescription, NSMicrophoneUsageDescription, NSPhotoLibraryUsageDescription, NSLocationWhenInUseUsageDescription, NSContactsUsageDescription and so on), add that key to the app target’s Info.plist, or in Xcode under the target’s Info tab, with one plain sentence saying what the app does with the access, then upload a new build. If the app never uses that resource, the code that touches it is usually inside a plugin or SDK: remove or replace that dependency, or add an honest purpose string anyway.
Why the upload is flagged, and the fix
01
Code in the app can reach a protected resource
“App Review checks for the use of protected resources, and rejects apps that contain code accessing those resources without a purpose string.” Apple, Requesting access to protected resources
Apple scans the uploaded build for APIs that touch the camera, microphone, photos, location, contacts, Bluetooth and similar resources. Any key that is missing is listed in the email. Per Apple, App Review rejects apps with code that accesses these resources without a purpose string.
02
Add the key the email names, with a real sentence
“The purpose string provides a description that’s accurate, meaningful, and specific about why the app needs to access the protected resource.” Apple, Requesting access to protected resources
Each resource has its own key, such as NSCameraUsageDescription for the camera. Add it to Info.plist with a sentence a person can judge: what the app does with the access, in plain words. Apple says the string must be accurate, meaningful and specific, so a vague one like “This app needs the camera” risks a rejection in review. No Info.plist file in the project? Newer Xcode projects keep these keys in the target’s Info tab and store them as build settings such as INFOPLIST_KEY_NSCameraUsageDescription.
<key>NSCameraUsageDescription</key> <string>Take a photo of your receipt to attach it to an expense.</string> <key>NSPhotoLibraryUsageDescription</key> <string>Choose a photo from your library to use as your profile picture.</string>03
The app never uses it: a plugin or SDK does
“To resolve this issue, provide a purpose string that explains why the app needs access to this sensitive information, or remove the code that’s accessing the resource.” Apple, Requesting access to protected resources
Flutter plugins, React Native packages and SDKs such as image pickers, QR scanners or ad libraries often include camera, photo or location code even if your screens never call it. Remove the package you do not need, or swap it for one without that code. If the code has to stay, add the purpose string so the build passes.
04
Check every target and every language
“Create a string catalog file called InfoPlist.xcstrings, and build your app to populate the string catalog with keys for the usage description strings in your app.” Apple, Requesting access to protected resources
Extensions such as widgets, share extensions and watch apps have their own Info.plist, so a key may be missing there and not in the main app. If the app is localized, add the translated strings too, but keep the base key in Info.plist. Then archive and upload a new build with a higher build number.
Checked against the vendor’s docs on : Apple Developer: Requesting access to protected resources; Apple Developer: NSCameraUsageDescription.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
Resubmit before Apple’s holiday slowdown
Pay for the Diagnosis and send the rejection and access to the app by (US Eastern). The Diagnosis is back by . Pay for the Fix that day and it arrives as a pull request by , in time to build and resubmit before .
In past years Apple said reviews may take longer around the holidays: December 20 to 26 in 2024 (opens in a new tab), December 22 to 27 in 2023 (opens in a new tab), December 23 to 27 in 2022 (opens in a new tab). Apple hasn’t posted its 2026 dates yet (checked ). Approval stays Apple’s decision.
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
Related: ITMS-91053 Missing API declaration · ITMS-90725 SDK version issue · App Store Guideline 5.1.1 data collection · App Store Guideline 2.3