I shipped ContentForge's iOS app on the fourth App Store submission. Here is what each rejection was and how I fixed it, because I could not find this information clearly written anywhere when I needed it. Rejection 1: Missing Info.plist purpose strings (ITMS-90683) If your Capacitor app uses any plugin that touches a privacy-sensitive iOS API, you need a corresponding NSUsageDescription string in your Info.plist. Apple's CI scanner catches this automatically and rejects the build before it ever reaches a human reviewer. My app used Capacitor's StatusBar plugin. The purpose string was missing. The fix: add the required string to ios/App/App/Info.plist. After fixing this the first time, I built a Node script that runs in CI and checks for missing strings automatically. It reads the Capacitor plugins from package.json, maps each one to the privacy APIs it touches, and verifies the corresponding purpose strings exist. That script runs on every push to main.…