# Guideline 5.1.1 - Data Collection and Storage: Missing Purpose Strings

**Guideline:** 5.1.1 · **Store:** Apple App Store · **Risk:** low · **Difficulty:** easy · **Typical turnaround:** 30 minutes - 1 hour

Canonical URL: https://appstorereject.com/rejections/apple/5/guideline-511-data-collection-and-storage-missing-purpose-strings

## Description

Your app requests access to protected resources (camera, microphone, photo library, location, contacts, calendars, health data, etc.) but does not include the required NSUsageDescription strings in Info.plist. 

Every protected resource access must include a human-readable purpose string explaining why the app needs that permission. Apple rejects apps where the purpose string is missing, generic (e.g., 'This app needs access'), or does not accurately describe the feature that requires the permission.

## Common variations

- Missing NSCameraUsageDescription
- Missing NSMicrophoneUsageDescription
- Missing NSPhotoLibraryUsageDescription
- Missing NSLocationWhenInUseUsageDescription
- Missing NSLocationAlwaysUsageDescription
- Missing NSContactsUsageDescription
- Missing NSCalendarsUsageDescription
- Missing NSFaceIDUsageDescription
- Missing NSHealthShareUsageDescription
- Purpose string is too generic
- Purpose string does not explain specific feature
- SDK triggers permission prompt without purpose string

## Example rejection email

```
This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data. This key is required for apps that access the device camera.
```

## Resolution steps

## How to Fix: Missing Purpose Strings (NSUsageDescription)

1. **Identify which strings are missing** — The rejection email tells you which key is missing. Common required keys:

   | Resource | Info.plist Key |
   |----------|---------------|
   | Camera | `NSCameraUsageDescription` |
   | Microphone | `NSMicrophoneUsageDescription` |
   | Photo Library (read) | `NSPhotoLibraryUsageDescription` |
   | Photo Library (write) | `NSPhotoLibraryAddUsageDescription` |
   | Location (in use) | `NSLocationWhenInUseUsageDescription` |
   | Location (always) | `NSLocationAlwaysAndWhenInUseUsageDescription` |
   | Contacts | `NSContactsUsageDescription` |
   | Calendars | `NSCalendarsFullAccessUsageDescription` (iOS 17+) |
   | Face ID | `NSFaceIDUsageDescription` |
   | Bluetooth | `NSBluetoothAlwaysUsageDescription` |
   | Health | `NSHealthShareUsageDescription` |
   | Motion | `NSMotionUsageDescription` |
   | Tracking | `NSUserTrackingUsageDescription` |

2. **Write a specific, accurate purpose string** — The string must explain the specific feature, not just the resource. Examples:
   - Bad: `"This app needs camera access"`
   - Good: `"Take a photo of your receipt to submit an expense report"`
   - Bad: `"Location is required"`
   - Good: `"Find restaurants near your current location"`

3. **Add to Info.plist** — In Xcode, select your target → Info tab → add the key. Or edit Info.plist directly:
   ```xml
   <key>NSCameraUsageDescription</key>
   <string>Take a photo of your receipt to submit an expense report</string>
   ```

4. **Check third-party SDKs** — Some SDKs trigger permission prompts. If you include an SDK that uses the camera (e.g., QR code scanner, AR framework), you need the purpose string even if your own code never calls the camera API.

5. **Localize purpose strings** — If your app supports multiple languages, add localized versions in `InfoPlist.strings` for each locale:
   ```
   /* InfoPlist.strings (Spanish) */
   NSCameraUsageDescription = "Toma una foto de tu recibo para enviar un informe de gastos";
   ```

6. **iOS 17+ calendar changes** — `NSCalendarsUsageDescription` is deprecated in iOS 17. Use `NSCalendarsFullAccessUsageDescription` or `NSCalendarsWriteOnlyAccessUsageDescription` depending on your access level.

7. **Verify in Simulator** — Run the app in Simulator and trigger every permission prompt. Confirm the purpose string appears correctly in each dialog.

8. **Audit all permissions** — Search your project for all `request.*Authorization`, `AVCaptureDevice`, `CLLocationManager`, `CNContactStore`, etc. to find every permission your app requests.

## Appeal guidance

This is rarely appealable — the fix is straightforward. If the rejection cites a purpose string that your app does not actually use (e.g., camera access from a disabled SDK feature), explain that the SDK feature is disabled and provide evidence, or remove the SDK dependency entirely.

## Before / after examples

**Before:** Info.plist has no camera usage description, but the app includes a barcode scanning feature using AVCaptureSession. The app crashes or shows a blank prompt on first camera access.
**After:** Info.plist updated:
<key>NSCameraUsageDescription</key>
<string>Scan barcodes to look up product information and prices</string>

Localized in InfoPlist.strings for supported languages.
**Why it works:** The purpose string must describe the specific feature (barcode scanning), not just 'camera access'. Apple reviewers check that the string matches the actual usage.

## Common questions

**Can you appeal a 5.1.1 rejection?**

This is rarely appealable — the fix is straightforward. If the rejection cites a purpose string that your app does not actually use (e.g., camera access from a disabled SDK feature), explain that the SDK feature is disabled and provide evidence, or remove the SDK dependency entirely.

**How long does this typically take to fix?**

Typical turnaround is 30 minutes - 1 hour (difficulty: easy). After resubmission, most re-reviews complete within 24-48 hours.

---
*Machine-readable source: https://api.appstorereject.com/api/rejections/detail?slug=guideline-511-data-collection-and-storage-missing-purpose-strings*