checkApp

Stores

ITMS-90683: Missing purpose string in Info.plist

Protected resource with no purpose string in Info.plist.

What is ITMS-90683?

Apple's refusal for a build that can reach the camera, location, contacts or another protected resource without a sentence in Info.plist saying why. It comes from the binary, not from what the app does: a plugin that links the camera brings the requirement in even if nothing ever opens it, so a build that runs fine on a phone never reaches TestFlight. We name the key and the plugin that brought it in.

Where it comes from in a Flutter app

App Store Connect looks for the frameworks behind the camera, photos, location, contacts, Bluetooth and other protected resources in every binary, whether or not the app ever asks for them. In a Flutter app a plugin usually brings them in: image_picker the camera and the photo library, geolocator location, camera and mobile_scanner the camera. permission_handler installed through CocoaPods compiles a permission in only when its PERMISSION_… macro in ios/Podfile is set to 1; through Swift Package Manager, only when its key is already in Info.plist.

How to fix it

  1. Run the free build check on the .ipa. It names the missing key and the plugin that needs it.
  2. If the app uses that resource, add the key to ios/Runner/Info.plist with a sentence saying what it is used for.
  3. If it does not, remove the plugin, or for permission_handler set that permission's macro to 0.
  4. A translation in InfoPlist.strings does not replace the key in Info.plist itself.

The free build check reads your .ipa in the browser and names the cause of this and the other rejections, without uploading anything.

Or have the whole build checked: the store readiness audit is €190, 2 working days.

All rejection codes