Skip to content

feat(privacy): iOS privacy manifest + Android 14 photo picker permission#35

Merged
heznpc merged 1 commit intomainfrom
feat/privacy-manifests
May 2, 2026
Merged

feat(privacy): iOS privacy manifest + Android 14 photo picker permission#35
heznpc merged 1 commit intomainfrom
feat/privacy-manifests

Conversation

@heznpc
Copy link
Copy Markdown
Member

@heznpc heznpc commented May 2, 2026

From the 2026-05-01 audit (P1.6). App Store / Play Store first-submission gates.

Changes

app.json — iOS privacyManifests

  • 4 NSPrivacyAccessedAPIType entries with approved reason codes covering UserDefaults / FileTimestamp / SystemBootTime / DiskSpace (everything a fresh Expo + expo-secure-store app already touches)
  • NSPrivacyTracking: false, empty tracking domains/data types — flip when adding analytics

app.json — Android

  • permissions: ["READ_MEDIA_VISUAL_USER_SELECTED"] — Android 14 partial photo access fallback

docs/PRIVACY_MANIFEST.md — when to add new reason codes, mapping table, Apple/Android links

tests/app.test.js — locks the policy in:

  • iOS privacyManifests exists, every declared API carries ≥1 reason code, NSPrivacyTracking === false
  • Android permissions contain READ_MEDIA_VISUAL_USER_SELECTED

Test plan

  • Local: 19 tests passing (+2 new)
  • CI green
  • EAS Build picks up the manifest on prebuild

…mission

Audit (2026-05-01, P1.6) flagged App Store / Play Store gates the starter
would hit on first submission.

iOS — NSPrivacyAccessedAPITypes
  Apple rejects iOS 17+ apps that link a "required reason API" without
  declaring an approved reason. Ship default reason codes for the four
  APIs every fresh Expo + expo-secure-store app already touches:
    - NSPrivacyAccessedAPICategoryUserDefaults  (CA92.1)
    - NSPrivacyAccessedAPICategoryFileTimestamp (C617.1)
    - NSPrivacyAccessedAPICategorySystemBootTime (35F9.1)
    - NSPrivacyAccessedAPICategoryDiskSpace     (E174.1)
  + NSPrivacyTracking: false (flip when adding analytics/ads SDKs)

Android — partial photo access (Android 14, API 34+)
  Always include READ_MEDIA_VISUAL_USER_SELECTED — it's the fallback
  granted when the user picks "Selected photos." Without it, partial
  grants silently fail and the app sees zero photos despite the user
  thinking they shared some.

docs/PRIVACY_MANIFEST.md
  Tabular reference for the reason codes, when to add more, and the
  Apple / Android docs links. Future contributors can extend the manifest
  without re-deriving the policy.

tests/app.test.js
  Lock in: iOS privacyManifests block exists with at least one API and
  at least one reason code per API, NSPrivacyTracking is false, and
  android.permissions contains READ_MEDIA_VISUAL_USER_SELECTED.
@heznpc heznpc merged commit 987d496 into main May 2, 2026
3 checks passed
@heznpc heznpc deleted the feat/privacy-manifests branch May 2, 2026 01:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant