shipcheck

Guideline 4.8: when you must offer Sign in with Apple

Updated September 7, 2026 · published by Baker Ventures LLC · sources cited inline

Guideline 4.8 is narrower than its reputation, and it still catches people.

It applies when your app uses a third-party or social login service as a primary way to set up an account. In that case you must also offer an equivalent privacy-focused login option, one that limits data collection to name and email, lets the user keep their email address private from you, and does not collect interactions with your app for advertising without consent.

If you only offer your own email-and-password account, 4.8 does not apply to you. The rule is about what you place alongside a social login, not a universal obligation to adopt Apple's.

The React Native version of the failure is rarely the policy. It is the implementation: the entitlement that prebuild did not write because the capability was never declared in app config, and the private relay email address that the backend treats as invalid or mails to from an unregistered domain. Both produce a broken sign-in on a reviewer's device, which becomes a Guideline 2.1 rejection rather than a 4.8 one.

Deciding whether it applies

Answer these in order:

  1. Does the app offer any third-party or social login (Google, Facebook, X, LINE, Kakao, and so on) as a way to create an account? If no, stop; 4.8 is not your problem.
  2. Do you also offer an option meeting the equivalence conditions above? If yes, you are done.
  3. If no: add one. Sign in with Apple is the obvious choice, and it is not the only permissible one — the guideline describes conditions, not a brand.

The frequent misreading is that offering email-and-password automatically satisfies it. It can, if it genuinely meets the conditions, including the email-privacy one. Read the conditions rather than the summary, because "we have an email option" is the answer that gets appealed and lost.

The three ways it actually breaks in React Native

1. The entitlement is missing. expo-apple-authentication needs the Sign in with Apple capability, which means declaring it in app config so that prebuild writes the entitlement into the generated project. Adding it by hand in Xcode works until the next expo prebuild --clean, at which point the entitlement disappears and sign-in fails on device with an error that does not name the cause.

// app.json
"ios": {
  "usesAppleSignIn": true
}

Verify after building, not after editing:

# the built app should declare the capability
grep -A2 'applesignin' ios/*/\*.entitlements

2. The private relay email is rejected. A user who chooses "Hide My Email" gives you [email protected]. Backends break on this in two ways: validation logic that treats the domain as disposable and refuses it, and transactional email that never arrives because your sending domain is not registered with Apple's private email relay service. Register it. A signup that succeeds and then never delivers the confirmation is indistinguishable, to a reviewer, from a broken app.

3. The name comes back exactly once. Apple returns the user's name only on the first authorization. If your app does not persist it then, it is gone, and every subsequent sign-in yields an account with no name. Testers hit this immediately, because they delete the app and reinstall: the second run returns no name, and the code path that assumed one crashes or shows a blank profile. Revoke the app in Settings to get a genuine first-run again, or you will test the wrong path forever.

What a reviewer does with it

The test is short and it is always the same: install, tap the Apple button, complete the flow, land in the app. Then, frequently, sign out and sign back in.

That second half is where implementations fail, because the first run and the returning run take different code paths and only the first one gets tested during development. What reviewers actually test.

If the flow fails, the rejection you receive is usually 2.1 App Completeness, with a screenshot. It is not filed as a 4.8 problem, which is why searching the guideline number does not find you an answer.

RequirementWhat it actually says
4.8 Login ServicesOffer an equivalent privacy-focused option alongside third-party login
5.1.1(v) Account deletionAn app that lets you create an account must let you delete it, in-app
5.1.1 Data minimisationDo not require an account for features that do not need one
3.1.1 In-app purchaseDigital content unlocks go through IAP

Account deletion is the one that pairs with 4.8 in practice. Adding a login service means adding accounts, and adding accounts means 5.1.1(v) applies from that release onward. Teams add the sign-in button in one sprint and discover the deletion requirement in the rejection.

The pre-submission check

# capability declared where prebuild will see it
grep -n 'usesAppleSignIn\|apple-authentication' app.json app.config.js package.json

# and present in what actually got built
ls ios/*/*.entitlements && grep -c applesignin ios/*/*.entitlements

# backend does not reject the relay domain
grep -rn 'privaterelay\|appleid.com' src server 2>/dev/null | head

Then do the two-run test on a real device: fresh authorization, then revoke in Settings, then authorize again. If the name is only present on the first run and your code needs it on both, you have found the bug before Apple did, which is the entire point.

shipcheck reads app config, the generated entitlements and Podfile.lock together and flags a Sign in with Apple integration whose capability is not declared where prebuild can write it, citing the guideline text. What it checks. · The first-submission checklist.

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

Do I have to offer Sign in with Apple?

Only if your app uses a third-party or social login service exclusively or primarily as its account setup, and you do not already offer an equivalent privacy-focused option. An app with only email-and-password, or only its own account system, is not covered by Guideline 4.8.

What counts as an equivalent login option?

Per Guideline 4.8, one that limits data collection to name and email, allows the user to keep their email private from the app, and does not collect interactions with the app for advertising without consent. Sign in with Apple qualifies; so does any other service meeting those conditions.

Does Google Sign-In alone trigger the requirement?

If Google Sign-In is your third-party login and you offer no equivalent privacy-focused alternative, yes, that is the situation the guideline addresses. Adding an email-and-password option that meets the equivalence conditions is one way to satisfy it, and adding Sign in with Apple is the other.

Does guest mode satisfy Guideline 4.8?

No, because guest mode is not a login service. It can help with other guidelines, notably requiring an account for functionality that does not need one, but it does not substitute for the equivalent login option when third-party login is offered.

How do I add Sign in with Apple in Expo?

expo-apple-authentication, with the capability enabled in app config so prebuild writes the entitlement. On the backend you verify the identity token against Apple's public keys. The two things that break are the missing entitlement and the private relay email, and both are visible before submission.

What is the private relay email problem?

Users can hide their real address, and Apple gives you a per-app relay address instead. An app that rejects it, or that mails to it from an unregistered sender domain, is broken for those users. Register your outbound domain with Apple's private email relay service.

Cite this pageshipcheck. “Guideline 4.8: when you must offer Sign in with Apple.” Baker Ventures LLC, September 7, 2026. https://shipcheck.bakerventuresstudio.com/rejections/guideline-4-8-login-services/