The checklist I wish I had before my first submission.
I got rejected 5 times. Each time I thought I'd covered everything, and each time Apple found something I missed. Some were obvious in hindsight, others were things I had no idea existed as requirements.
So I wrote it all down. Every item here is either something that got me rejected, or something I learned the hard way during the process. If even one of these saves you a rejection cycle, it was worth making.
Before you hit submit
If any of these apply to your app right now, you will get rejected. This is the 30-second gut check.
- App has placeholder screens, "coming soon" text, or broken buttons
- No Privacy Policy URL in App Store Connect
- No Terms of Service link inside the app or on the listing
- Subscriptions missing metadata, unclear pricing, or no restore button
- Login required but no test account provided for the reviewer
- Users can create accounts but cannot delete them in-app
- UIBackgroundModes declares capabilities the app does not use
- App sends data to a third-party AI without an explicit in-app consent prompt
- Keyboard extension has zero functionality when Full Access is off
- Keyboard extension has no globe button to switch keyboards
- App does not work on iPad, even in iPhone compatibility mode
- Paywall shows weekly calculated price more prominently than the actual billed amount
App completeness
Most rejections are bugs. Apple reviews on real devices. If it crashes or gets stuck, it's an instant rejection.
- No placeholder text, Lorem Ipsum, or "beta" labels anywhere
- No dead-end screens or navigation that leads nowhere
- Every button either does something or doesn't exist
- Primary screens have real empty, loading, error, and populated states
- Tested every flow end-to-end: onboarding through core action through settings
- Tested every button on every screen
- Tested clean install and upgrade install
- Tested slow network and airplane mode without crashes
- Tested on the oldest iOS version you support
- No crashes on launch, during core flows, or on device rotation
- Custom keyboard launches and works after enabling it in Settings
- Custom keyboard still works after toggling Full Access on, off, and on again
- Onboarding flow is completable from start to finish without getting stuck
iPad compatibility
Apple reviews on iPad Air. Even iPhone-only apps run there in compatibility mode. Yours needs to work.
- Tested on iPad or iPad simulator, even with
supportsTablet: false - Onboarding screens render without overlapping or clipped content on larger screens
- Text input fields work with the iPad keyboard layout
- Scroll views and lists don't overflow or leave dead space
- Modal and bottom sheets scale correctly
- Keyboard extensions work on iPad's different keyboard layout
- iPhone compatibility mode on iPad renders every screen acceptably
- iPad screenshots provided if iPad is listed as supported in App Store Connect
Extensions
Keyboard extensions have strict, specific rules. I was rejected three separate times for extension issues alone.
- Keyboard provides real functionality when Full Access is OFF, not just a help screen
- Globe/next-keyboard button exists using
advanceToNextInputMode() - Globe button is positioned near where the system globe key normally appears
- Keyboard works after toggling Full Access on, off, and on again
- Keyboard doesn't crash on first launch after being added in Settings
- Keyboard works on both iPhone and iPad
- If network is required, the keyboard explains why Full Access is needed
RequestsOpenAccessset totruein the extension's Info.plist- Extension only uses APIs permitted for extensions
- App Groups entitlements match between the app and extension provisioning profiles
AI and third-party data
If your app touches AI or sends anything to an external service, Apple wants explicit consent shown in-app, not buried in your privacy policy.
- In-app consent prompt appears before any data is sent to an external AI service
- Consent states what data is being sent
- Consent states who the data is sent to
- Consent states whether data is stored and for how long
- User must actively tap to agree. No silent defaults
- If user declines, no data is sent and the app handles it gracefully
- Privacy policy names every third-party service that receives user data
- Privacy policy confirms each third-party provides equal data protection
- This information exists in-app, not only in the privacy policy or terms
- AI-generated content has safeguards, disclosure, and server-side rate limits
Privacy and legal
Permission strings, privacy policy completeness, data collection transparency.
- Privacy Policy hosted at a public URL
- Terms of Service hosted at a public URL
- Both linked inside the app somewhere accessible
- Privacy Policy URL added in App Store Connect
- Support URL is live and working
- Contact email is valid and monitored
- Privacy Policy explains what data is collected, why, how, and how to delete it
- Privacy Policy matches the App Privacy "nutrition label" answers
- Permission purpose strings are specific, not generic
- Purpose strings explain why and what for, with an example
- Permissions requested only when the feature actually needs them
- App still works if any permission is denied
- ATT implemented if you track users
- App Privacy nutrition label accurately reflects reality
- No required collection of info irrelevant to core functionality
- Optional data screens like "How did you find us?" allow skipping
- Demographic collection screens explain why the data improves the experience
Subscriptions and IAP
Pricing clarity, restore flow, and making sure the reviewer can actually find every purchase option.
- All IAPs created with complete metadata in App Store Connect
- Each IAP has review assets (screenshot + notes)
- IAPs submitted for review with the build, not left in Draft
- Billed amount is the most prominent price on the paywall (largest, boldest)
- Calculated prices like "per week" are visually subordinate to the billed amount
- No fake urgency or "limited-time" language
- All digital features use IAP, no external payment links
- Restore Purchases button exists and works
- Manage Subscription link exists somewhere accessible
- Hidden IAPs (exit offers, promos) have exact step-by-step instructions in Review Notes
- Instructions for testing a new purchase if sandbox already has an active subscription
- Paid Apps Agreement signed and active
- Yearly plans show the full yearly price, not only a weekly/monthly equivalent
- Free trial and auto-renewal terms clearly stated
Accounts
Account creation and deletion, login requirements.
- Account deletion available in-app if account creation exists
- Sign in with Apple offered if using any third-party social login
- Real names not forced, usernames/nicknames allowed
- Password reset and email verification tested and working
- Anonymous auth explained in reviewer notes if applicable
Community and UGC
Required only if your app has social features, chat, or user-generated content.
- Users can block other users
- Users can report content or users
- Reports are reviewable and actionable
- Safety or community policy exists and is linked publicly
Info.plist and capabilities
Declare only what you use. Apple checks.
- UIBackgroundModes only includes modes the app actually uses
- Background audio declared only if the app plays audio in background
- Background location declared only if the app uses location in background
- No leftover entitlements from templates or earlier development
- Export compliance and encryption declarations completed
- App Group entitlements match between app and all extensions
- Provisioning profiles include all declared entitlements
- Age rating questionnaire completed accurately
Business setup
Agreements, tax forms, and banking. Must be done before paid features work in sandbox review.
- Enrolled in Small Business Program (15% vs 30%)
- Paid Apps Agreement signed and active
- Tax forms completed with Submitted/Active status
- Bank account added and marked usable
- Export compliance completed
Store listing
Accurate, honest, and showing real app screens.
- Description explains what the app does in the first 2-3 lines
- Screenshots show real app usage, not splash screens or login pages
- No mentions of competitors or unbuilt features
- Keywords are relevant, no brand spam
- Promotional text is accurate if used
- Pricing and availability configured
Localization
Either complete it or remove it. Half-done locales will get flagged.
- Every enabled locale has title, subtitle, description, and keywords translated
- Localized screenshots provided where needed
- Accidental locales removed or completed
Design and UI
If the interface is hard to use, Apple will reject it.
- No overlapping elements at any supported device size
- Text legible at default font sizes
- Touch targets at least 44x44pt
- Nothing hidden behind notches, home indicators, or status bars
- No misleading UI hiding real functionality
- Safe area insets respected everywhere
- App doesn't break with larger accessibility text sizes
Content and IP
- No copyrighted content you don't own
- No misleading UI hiding functionality
- AI/LLM usage has safeguards, disclosure, and rate limits
Reviewer access
Make their job easy. The less they have to guess, the more likely they approve.
- Test account credentials provided if login is needed
- Clear step-by-step instructions for using the core feature
- Screen recording linked if the flow isn't obvious (highly recommended for v1)
- App's purpose and the problem it solves described in review notes
- All external services listed (AI, auth, analytics, payments)
- Regional consistency confirmed, or differences explained
- Complex flows have individual step-by-step instructions
- Hidden IAPs have exact navigation instructions
- Special requirements (hardware, location) explained
- Anonymous auth stated explicitly so they don't look for a login
Final pass
One last sweep before you press Submit for Review.
- Build matches the listing: features, screenshots, and copy all align
- All listing URLs load and don't 404
- No placeholders anywhere in the app or listing
- Core use case completable in under 60 seconds
- Re-read every previous rejection and confirmed each issue is resolved
- Tested on a physical device
- Tested on iPad
- Ready to respond quickly if Apple asks for changes
- Review Notes are thorough and include everything from the Reviewer Access section