RORK LABJP
MAX — Rork Max generates native Swift apps for iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessagePUBLISH — Rork Max ships 2-click App Store publishing and runs $200/monthRN — The standard Rork builds native iOS/Android apps with React Native (Expo) — the quicker path to a working appPRICE — Rork is free to start, with paid plans from $25/monthFUND — Rork raised $2.8M from a16z; the platform now sees 743k+ monthly visits with 85% growthFLOW — Describe your app in plain English and Rork generates deployable code that can use the camera, notifications, and moreMAX — Rork Max generates native Swift apps for iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessagePUBLISH — Rork Max ships 2-click App Store publishing and runs $200/monthRN — The standard Rork builds native iOS/Android apps with React Native (Expo) — the quicker path to a working appPRICE — Rork is free to start, with paid plans from $25/monthFUND — Rork raised $2.8M from a16z; the platform now sees 743k+ monthly visits with 85% growthFLOW — Describe your app in plain English and Rork generates deployable code that can use the camera, notifications, and more
Articles/Dev Tools
Dev Tools/2026-06-19Advanced

Make ITMS-91053 Stop Catching Your Rork Max App — A Release-Proof Privacy Manifest Workflow

Fixing ITMS-91053 once doesn't keep it away — every new dependency can bring it back. Here's a field-tested workflow to audit your dependency tree, generate declarations, and catch the rejection locally before you upload.

Privacy Manifest4ITMS-910532Required Reason API3Rork Max174EAS Build14App Store Review8Release Automation

Premium Article

The truly annoying thing about ITMS-91053 in App Store Connect validation isn't the first rejection — it's that it comes back. You add one PrivacyInfo.xcprivacy, slip past the rejection, and then the next release, the moment you add one useful-looking library, you're bounced to the same place with a different reason code. As an indie developer who ships several apps to the App Store, I lost real time to this loop early on. You upload, you get the rejection email half a day later, you investigate, you rebuild — and that single cycle can easily eat a whole day.

So this piece isn't about "how to write PrivacyInfo.xcprivacy." It's about never hitting ITMS-91053 after upload again. There are three jobs: mechanically identify the affected APIs by auditing your dependency tree, aggregate the declarations without gaps, and catch problems locally before you upload. Build those three into a system and your Rork Max project stops getting stuck at review even as you add new libraries.

Why It Comes Back After You "Fixed" It

Apple's Required Reason API policy requires you to declare why in PrivacyInfo.xcprivacy whenever code in your binary accesses certain API categories — UserDefaults, file timestamps, available disk space, system boot time, and a few others. The key point: it doesn't matter whether your own code calls them. A Rork Max project bundles plenty of libraries for storage, notifications, analytics, and billing, and if any of them touches a covered API internally, the declaration obligation is yours.

So "fixing it once" only covers the libraries bundled at that moment. Your dependency tree shifts a little with every release — a new package, a major bump on an existing one, a swapped-out transitive dependency. Each of those changes the set of APIs in the binary. As long as you treat the declaration as something you write once at first submission, the drift is structural and recurs. The only way to stop it is to promote the manifest to something you regenerate and validate on every release.

Step 1: Find Which Dependencies Pull in a Required Reason API

The first move isn't hunting for a culprit — it's taking inventory. Apple's covered categories have fixed internal identifiers, so you can scan your build output and the PrivacyInfo.xcprivacy files bundled with each library to see which categories are in play. Run this against the ios/ directory Rork Max emits and your node_modules.

#!/usr/bin/env bash
# scan-required-reason.sh
# Inventory the Privacy Manifests and covered-category references in the tree
set -euo pipefail
 
PROJECT_ROOT="${1:-.}"
 
echo "== PrivacyInfo.xcprivacy shipped by libraries =="
find "$PROJECT_ROOT/node_modules" -name "PrivacyInfo.xcprivacy" 2>/dev/null \
  | while read -r f; do
      pkg=$(echo "$f" | sed -E 's#.*/node_modules/(@[^/]+/[^/]+|[^/]+)/.*#\1#')
      printf '%-45s %s\n' "$pkg" "$f"
    done
 
echo
echo "== Covered API categories referenced in source/config =="
grep -rhoE "NSPrivacyAccessedAPICategory[A-Za-z]+" \
  "$PROJECT_ROOT/ios" "$PROJECT_ROOT/node_modules" 2>/dev/null \
  | sort | uniq -c | sort -rn

The top block shows libraries that carry their own manifest; the bottom block shows which categories are referenced across the whole project and how often. The frequently appearing categories are exactly the ones you must declare in your app-level manifest. In Rork Max projects I usually see @react-native-async-storage/async-storage and react-native-mmkv pull in UserDefaults, while cache and sync libraries pull in file timestamps.

If you have the rejection email, use the NSPrivacyAccessedAPICategory... values it lists as a confirmed minimum set. Cross-checking the script's inventory against the email leaves almost no gaps.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A shell script that mechanically finds every library in your tree that touches a Required Reason API
How to aggregate declarations correctly given app-level vs library-level manifest precedence
A local validation flow that catches ITMS-91053 before upload, so you never lose a day to review
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-05-23
Auditing Privacy Manifests for Rork-Generated Expo Apps — A One-Day Pre-Submission Workflow for Indie Developers
A pre-submission workflow for indie developers shipping Rork-generated Expo apps. Walks through how to enumerate every dependency, detect missing PrivacyInfo.xcprivacy files, and ship without ITMS-91053 rejections — based on twelve years of personal app development.
Dev Tools2026-06-14
When Your Rork App Gets ITMS-91053 — A Practical Guide to Privacy Manifests and Required Reason APIs
Submitting a Rork-generated Expo app to the App Store can trigger Privacy Manifest warnings even when you never wrote the offending code. Here is how to clear both Required Reason API and SDK manifest issues before you submit.
Dev Tools2026-06-14
Reading Steps and Sleep into Your Rork Max Native App — HealthKit for Calm, Number-Light Wellness Apps
A walkthrough of adding HealthKit to the native Swift app Rork Max generates: reading steps, sleep, and heart rate, writing mindful sessions, and handling background delivery — including the App Store review wording and the production-only 'permission granted but zero data' trap.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →