82 lines
3.1 KiB
Markdown
82 lines
3.1 KiB
Markdown
# 27. Data Usage Descriptions
|
|
|
|
meta:
|
|
id: ios-production-27
|
|
feature: ios-production
|
|
priority: P1
|
|
depends_on: []
|
|
tags: [compliance, privacy, app-store, production]
|
|
|
|
objective:
|
|
- Add all required permission usage descriptions to Info.plist for camera, microphone, location, and other sensitive APIs
|
|
|
|
deliverables:
|
|
- Info.plist permission descriptions
|
|
- Localized descriptions for supported languages
|
|
- In-app permission rationale dialogs
|
|
- Permission handling in all features
|
|
|
|
steps:
|
|
1. Audit all permissions used:
|
|
- Camera (document scanning, VoicePrint enrollment)
|
|
- Microphone (VoicePrint enrollment)
|
|
- Photo Library (document upload)
|
|
- Push Notifications (alerts)
|
|
- Face ID / Touch ID (biometric auth)
|
|
- Location (not currently used — verify)
|
|
- Contacts (not currently used — verify)
|
|
2. Add Info.plist descriptions:
|
|
- NSCameraUsageDescription: "Camera is used to scan documents for identity verification"
|
|
- NSMicrophoneUsageDescription: "Microphone is used to enroll your voice for VoicePrint protection"
|
|
- NSPhotoLibraryUsageDescription: "Photo library access is used to upload identity documents"
|
|
- NSFaceIDUsageDescription: "Face ID is used to securely access your account"
|
|
- NSUserTrackingUsageDescription: (from task 26)
|
|
- UIBackgroundModes: fetch, remote-notification
|
|
3. Localize descriptions:
|
|
- Add translations for Spanish, French (if supporting)
|
|
- Create InfoPlist.strings for each language
|
|
- Keep descriptions concise but informative
|
|
4. Add in-app rationale dialogs:
|
|
- Show custom dialog before system permission request
|
|
- Explain why permission is needed
|
|
- Include example of feature benefit
|
|
- Add "Don't Allow" and "Allow" buttons
|
|
5. Handle permission denials:
|
|
- Show guidance to Settings if permission denied
|
|
- Degrade functionality gracefully
|
|
- Don't crash if permission unavailable
|
|
6. Test all permission flows:
|
|
- First request → rationale → system dialog
|
|
- Deny → feature degraded → Settings guidance
|
|
- Allow → feature fully functional
|
|
- Revoke in Settings → app handles gracefully
|
|
|
|
tests:
|
|
- Unit: Test permission state handling
|
|
- Integration: Test rationale dialog flow
|
|
- Device: Test all permissions on physical device
|
|
|
|
acceptance_criteria:
|
|
- All required Info.plist descriptions present
|
|
- Descriptions accurate and user-friendly
|
|
- Localized for all supported languages
|
|
- In-app rationale dialogs before system requests
|
|
- Graceful degradation when permissions denied
|
|
- Settings guidance for denied permissions
|
|
- No crashes from missing permissions
|
|
- All permission flows tested on physical device
|
|
- App Review will approve descriptions
|
|
|
|
validation:
|
|
- Check Info.plist → all NS*UsageDescription keys present
|
|
- Test camera permission → rationale dialog → system dialog
|
|
- Deny permission → app shows Settings guidance
|
|
- Check localization → descriptions in correct language
|
|
- App Review → no rejections for permission descriptions
|
|
|
|
notes:
|
|
- Apple rejects apps with generic permission descriptions
|
|
- Descriptions must explain specific feature usage
|
|
- Always show rationale before system dialog
|
|
- Test on physical device — simulator doesn't show permission dialogs realistically
|