Push notifications: the rules and the RN failures
Three rules and one self-inflicted injury.
Marketing pushes need consent, obtained in your app, with a way to opt out. Push used for promotion without that is one of the clearer cases in the guidelines, and it is not fixed by a line in a privacy policy.
Push is not required to use the app. You cannot make notifications a condition of functionality.
Sensitive information does not belong in a notification. A notification is visible on a lock screen to whoever is holding the phone. Health-related content belongs behind the unlock, with the notification saying only that something is waiting. Guideline 1.4.1, medical apps.
And the self-inflicted part: asking for permission on first launch.
iOS lets you ask once. A prompt with no context is declined at high rates, and a declined prompt cannot be re-shown through the system — you can only send the user to Settings, which almost nobody does. A badly timed first prompt costs you the channel for the lifetime of that install.
Ask after the user has seen why it is useful. Not at launch, not during onboarding, and ideally attached to an action where the answer is obviously yes.
The permission moment
Explain before you prompt. A short in-app screen saying what you will send and why, with a "not now" that does not fire the system prompt. Then prompt only when they say yes.
This costs one screen and it is the highest-leverage thing in this whole subject, because it converts the one irreversible ask into a reversible one.
Attach it to an action. "Notify me when this is ready" is a request with a purpose. A prompt during onboarding is a tax.
And handle the decline gracefully. The app should be fully usable without notifications, which is both a guideline requirement and the thing that determines whether someone re-enables them later.
The RN failures, all silent
The capability was never declared, so prebuild did not write the entitlement, and registration fails on device with no obvious cause.
// app.json
"ios": { "entitlements": { "aps-environment": "production" } }Verify after building, not after editing, because the generated ios/ is regenerated:
npx expo prebuild --clean
grep -A2 'aps-environment' ios/*/*.entitlementsThe token is registered against the wrong environment. Development tokens do not work in production builds. This is the classic "works in TestFlight, not in the store" symptom, and it produces no error anywhere.
Permission is requested at module load. A requestPermissions() at import time fires the prompt before the user has seen anything. Easy to do accidentally, particularly when a library's example code is copied.
# where the prompt is actually triggered
grep -rn "requestPermission\|getPermissionsAsync\|requestPermissionsAsync" src app | headIf any of those are outside a user-initiated handler, that is the bug. The EAS submission checklist.
For App Review
If notifications are a core feature, a reviewer needs to see one.
They will not wait for a scheduled push and they will not create the conditions that trigger one. Provide a demo path — a debug action on the demo account, or a documented step that sends one immediately — and describe it in the review notes.
Notifications: on the demo account, Settings > Send test
notification triggers one immediately. In production these fire
when a job's status changes.Without that, a reviewer trying to evaluate a notification feature finds nothing, and it is filed under 2.1 completeness rather than as a notification problem. When a reviewer cannot test your app. · Review notes that work.
Content rules worth internalising
No sensitive personal data in the body. Health, finance, anything a person would not want a colleague reading over their shoulder. Say "you have a new result" and put the result behind the unlock.
No promotional content without consent, and consent means an in-app mechanism, not a checkbox in a policy nobody read.
An opt-out that works. Per category is better than all-or-nothing, and it materially reduces the number of people who turn everything off.
Do not send at unreasonable hours. Not a guideline in itself; it is the fastest route to a user disabling the channel permanently, which is the same outcome as never having had it.
The declaration side
Push involves a device token, which is an identifier, which means it appears in your App Privacy label and your Play Data safety form. Neither updates itself when you add the feature. App privacy labels. · Play Data safety.
shipcheck reports whether the push entitlement is declared where prebuild will write it, whether permission is requested outside a user-initiated path, and whether adding push has changed what your privacy declarations need to say. What it checks. · The first-submission checklist.
More in this section
About shipcheck
shipcheck is a pre-submission checker from Baker Ventures LLC that runs inside Claude Code. It reads your React Native or Expo project, finds the things that get apps rejected or blocked at upload, cites the exact App Store Review Guideline or Google Play policy clause, and names the file and line to fix.
It exists because React Native and Expo apps fail for reasons that are invisible in the code you wrote: capability arriving through a dependency, purpose strings added by a config plugin, a privacy manifest missing from an SDK you never chose directly, and a generated ios/ directory that discards your edits on the next prebuild. shipcheck checks what the binary and the config actually declare, not what you intended. The rejection references on this site are free, need no account, and link to the primary Apple or Google document for every claim.
Questions and answers
Can you send marketing push notifications?
Only with the user's consent obtained through a mechanism in your app, and you must provide a way to opt out. Push used for advertising or promotion without that is one of the clearer cases in the guidelines.
Can a notification contain health information?
Notifications are visible on a lock screen to anyone holding the phone, and Apple's guidelines address sensitive personal data in notifications. Health-related content belongs behind the unlock, with the notification saying only that something is waiting.
When should you ask for notification permission?
After the user has seen why it is useful, not on first launch. A prompt at launch has no context, gets declined at high rates, and iOS only lets you ask once, so a declined prompt is a permanently degraded feature.
What happens if a user declines?
You cannot ask again through the system prompt. You can direct them to Settings, and the practical consequence is that a badly timed first prompt costs you the channel for the lifetime of that install.
Do notifications need to work for App Review?
If notifications are a core feature, a reviewer will want to see them work. That usually means a demo path that triggers one on demand, described in the review notes, because a reviewer will not wait for a scheduled push.
What breaks in React Native specifically?
Entitlements not written because the capability was not declared in app config, a token registered against the wrong environment, and permission requested at module load rather than at a moment with context. All three are silent.
shipcheck. “Push notifications: the rules and the RN failures.” Baker Ventures LLC, September 7, 2026. https://shipcheck.bakerventuresstudio.com/guides/push-notifications-without-getting-rejected/