Guideline 4.8 Login Services: je nutné Sign in with Apple?
Autor: Mehdi Azizi
Publikováno , 9 min
Guideline 4.8: pokud tvoje appka nabízí Google nebo Facebook, přidej přihlášení, které chrání e-mail, třeba Apple. Výjimky, kód pro Expo a smazání účtu.
Guideline 4.8 platí, jakmile tvoje appka používá Google, Facebook nebo jiné přihlášení třetí strany k vytvoření hlavního účtu. V tu chvíli vyžaduje další, rovnocennou možnost přihlášení, která omezí data na jméno a e-mail, umožní e-mail skrýt a bez souhlasu uživatele ho nesleduje kvůli reklamě. Od ledna 2024 to už nemusí být nutně „Sign in with Apple“, ale právě tu Apple sám uvádí ve svých zprávách o zamítnutí.
V mých appkách nabízí Solys a Nolera přihlášení přes Apple, Google a e-mail. Tenhle návod vychází z aktuálního textu Applu, pak ukazuje, jak přidávám přihlášení přes Apple do Expo appky napojené na Supabase, a co to mění u mazání účtu. Pro celkový přehled důvodů zamítnutí si radši přečti, proč Apple zamítá appky.
Co říká guideline 4.8 Login Services?
Pravidlo 4.8 najdeš v sekci 4, „Design“, v App Review Guidelines. Týká se appek, které používají „a third-party or social login service“ k vytvoření nebo ověření hlavního účtu: Facebook Login, Google Sign-In, Log in with X, LinkedIn, Amazon nebo WeChat. Takové appky musí navíc nabídnout, „as an equivalent option“, jinou přihlašovací službu, která splňuje tři podmínky.
| Podmínka Applu | Lidsky řečeno |
|---|---|
| Omezená data | Jméno a e-mail, nic víc |
| Možnost soukromého e-mailu | Uživatel ho může skrýt |
| Žádná reklama bez souhlasu | Žádné reklamní sledování bez souhlasu |
Text definuje i hlavní účet: ten, který si člověk ve tvé appce vytvoří, aby se identifikoval, přihlásil a dostal se k jejím funkcím. Podle této definice tlačítko Google, které slouží jen k importu souboru, hlavní účet nevytváří. Pravidlo 4.8 míří na obrazovku, kterou se do appky vstupuje.
Co se změnilo v lednu 2024
Před rokem 2024 pravidlo vyžadovalo „Sign in with Apple“ u appek, které pro hlavní účet používaly přihlášení třetí strany. 25. ledna 2024 Apple tenhle bod zmírnil: můžeš nabídnout přihlášení přes Apple, nebo rovnocennou službu, která chrání soukromí. Spousta stránek pořád tvrdí opak. Dokumentace Expa stále píše, že appka s přihlášením třetí strany musí nabízet Apple.
V praxi zpráva o zamítnutí 4.8 zveřejněná na vývojářském fóru Applu končí takto: „Note that Sign in with Apple meets the requirements specified in guideline 4.8“. Žádnou jinou vyhovující službu Apple nejmenuje. Abych si s reviewerem nehrál na hádanky, přidávám přihlášení přes Apple.
Pět výjimek, které text uvádí
Apple vyjmenovává pět případů, kdy se žádné další přihlášení nevyžaduje:
- Tvoje appka používá jen vlastní systém účtů, třeba e-mail s heslem nebo kód poslaný e-mailem.
- Tvoje appka je alternativní obchod s aplikacemi, nebo je jím distribuovaná, s přihlášením specifickým pro tento obchod.
- Tvoje appka je vzdělávací, firemní nebo pracovní a vyžaduje existující školní nebo firemní účet.
- Tvoje appka používá systém elektronické identity podporovaný státem nebo odvětvím.
- Tvoje appka je klientem konkrétní služby třetí strany: člověk se přihlašuje ke své poště nebo sociální síti, aby se dostal ke svému vlastnímu obsahu.
Ještě před těmi výjimkami si polož otázku: potřebuje tvoje appka vůbec účet? Pokud ne, guideline 5.1.1(v) požaduje, aby šla používat bez přihlášení, jak vysvětluju v návodu ke guideline 5.1.1.
| Tvoje přihlašovací obrazovka | Platí 4.8? |
|---|---|
| Žádný účet | Ne |
| Jen e-mail nebo kód | Ne |
| Jen Google | Ano |
| Google a e-mail | Ano, nejspíš |
| Google a Apple | Ano, a vyhovuje |
| Existující školní účet | Ne |
| Google pro import | Ne, žádný účet |
Přidání „Sign in with Apple“ do Expo appky
1. Nainstaluj modul a deklaruj capability
npx expo install expo-apple-authentication
Dokumentace Expa pak žádá zapnout capability v konfiguraci appky:
{
"expo": {
"ios": {
"usesAppleSignIn": true,
"infoPlist": { "CFBundleAllowMixedLocalizations": true }
}
}
}
Druhý řádek zobrazí tlačítko v jazyce iPhonu. S EAS Build se capability zapne na identifikátoru tvé appky v okamžiku buildu. Je to nativní nastavení: dostane se ven jen s novým buildem, nikdy ne vzdálenou aktualizací.
Past, na kterou jsem narazil při revizi startovního kódu svých kitů: tahle capability vyžaduje podepisování, i když appku spouštíš jen v simulátoru. Na Macu bez certifikátu „Apple Development“ lokální kompilace padala s „No code signing certificates are available to use“. Oprava: zapínat přihlášení přes Apple jen tehdy, když je nakonfigurovaný autentizační server.
2. Zobraz oficiální tlačítko, stejně viditelné jako Google
Designová pravidla Applu jsou jasná: tlačítko Apple nesmí být menší než ostatní přihlašovací tlačítka a nesmí být nutné kvůli němu scrollovat. Komponenta z Expa vykreslí oficiální tlačítko s textem, který Apple povoluje.
import * as AppleAuthentication from "expo-apple-authentication";
import { useEffect, useState } from "react";
export function BoutonApple({ onPress }: { onPress: () => void }) {
const [disponible, setDisponible] = useState(false);
useEffect(() => {
AppleAuthentication.isAvailableAsync().then(setDisponible);
}, []);
// Android a web: žádné přihlášení přes Apple, žádné tlačítko.
if (!disponible) return null;
return (
<AppleAuthentication.AppleAuthenticationButton
buttonType={AppleAuthentication.AppleAuthenticationButtonType.CONTINUE}
buttonStyle={AppleAuthentication.AppleAuthenticationButtonStyle.BLACK}
cornerRadius={12}
style={{ width: "100%", height: 50 }}
onPress={onPress}
/>
);
}
Expo upozorňuje, že bez šířky a výšky se tlačítko nezobrazí. Barva a zaoblení se nastavují přes buttonStyle a cornerRadius, ne přes style.
3. Otevři session v Supabase
import * as AppleAuthentication from "expo-apple-authentication";
import { supabase } from "./supabase";
export async function connexionApple(): Promise<"ok" | "annule"> {
try {
const credential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
});
if (!credential.identityToken) throw new Error("Chybí token od Applu");
const { error } = await supabase.auth.signInWithIdToken({
provider: "apple",
token: credential.identityToken,
});
if (error) throw error;
// Křestní jméno přijde jen při první autorizaci: hned si ho uložíme.
const prenom = credential.fullName?.givenName;
if (prenom) await supabase.auth.updateUser({ data: { prenom } });
return "ok";
} catch (e) {
if ((e as { code?: string }).code === "ERR_REQUEST_CANCELED")
return "annule";
throw e;
}
}
Důležité jsou čtyři detaily, vzaté z dokumentace Supabase, z dokumentace Expa a z designových pravidel Applu:
- V Supabase zadej svůj bundle identifier do Client IDs u poskytovatele Apple. Čistě nativní appka nepotřebuje k přihlášení tajný klíč. Pokud testuješ v Expo Go, přidej
host.exp.Exponent. - Křestní jméno a e-mail přijdou jen jednou. Při dalších přihlášeních je Apple už neposílá: ulož si je hned z první odpovědi.
- E-mail může být relay adresa. Apple doporučuje potom už nežádat o osobní adresu.
- Zrušení není chyba. V Nolera zavření Apple panelu nevyvolá žádnou červenou hlášku: je to vědomé rozhodnutí.
Zažitý případ ze Solys, v srpnu 2026: tlačítka Apple i Google v appce byla, ale ani jeden z poskytovatelů nebyl v Supabase zapnutý. Kód byl v pořádku, oprava proběhla na straně serveru, bez nového buildu. Tlačítko Apple, které před reviewerem selže, znamená zamítnutí 2.1 místo zamítnutí 4.8. Podrobnosti najdeš v návodu ke guideline 2.1.
4. Testuj na skutečném iPhonu
Expo upozorňuje, že simulátor umožňuje jen omezený test a že identifikátory získané v Expo Go se liší od těch ve vydané appce. Otestuj přihlášení, odhlášení a opětovné přihlášení na skutečném iPhonu, s buildem v TestFlightu.
Přihlášení přes Apple a smazání účtu
Guideline 5.1.1(v) požaduje, aby účet vytvořený v appce šlo z appky i smazat. U přihlášení přes Apple přidává stránka Applu o mazání účtu další krok: použít REST API Sign in with Apple k revokaci tokenů daného člověka.
Revokace potřebuje dvě věci: token uživatele, který získáš validací autorizačního kódu, a secret podepsaný tvým privátním klíčem Sign in with Apple. I když se nativní přihlášení bez tajného klíče obejde, revokace ho vyžaduje, a ten zůstává na tvém serveru. Proč, to vysvětluju v článku tajný API klíč v Expo appce.
V Nolera si appka při mazání účtu znovu vyžádá přihlášení přes Apple, aby získala čerstvý autorizační kód. Pošle ho serverové funkci, která ho u Applu vymění a pak token revokuje. Když to člověk zruší, jasná zpráva mu to oznámí a nic se nesmaže. Zbytek postupu, včetně dat, předplatného a testů, najdeš v článku smazání účtu v iOS appce.
Co odpovědět Applu po zamítnutí 4.8
Zpráva od Applu nabízí dvě cesty. Buď přidáš rovnocennou možnost. Nebo ji tvoje appka už má: odpovíš v App Store Connect, napíšeš, o kterou jde a proč splňuje všechny tři podmínky. Apple také doporučuje aktualizovat screenshoty, které ukazují přihlašovací obrazovku. Postup, jak odpovědět App Review, je stejný jako u ostatních pravidel.
Tady je šablona v angličtině, kterou si uprav (nahraď číslo buildu):
Hello,
Thank you for your review.
Build X adds Sign in with Apple as an equivalent login option.
It appears on the same screen as Google Sign-In, with the same
size, and is visible without scrolling.
How to verify: launch the app, open the sign-in screen and
tap "Continue with Apple".
We also updated the screenshots that show the sign-in screen.
Best regards,
Checklist 4.8 před odesláním
- Víš, jestli tvoje appka potřebuje účet. Pokud ne, jde používat bez přihlášení.
- Pokud účet vytváří Google, Facebook nebo X, přihlášení přes Apple je na stejné obrazovce.
- Tlačítko Apple je oficiální tlačítko, stejně velké jako ostatní, viditelné bez scrollování.
- Poskytovatel Apple je zapnutý na serveru, s tvým bundle identifierem.
- Zrušení vrátí uživatele na přihlašovací obrazovku, bez chybové hlášky.
- Křestní jméno a e-mail se uloží hned při prvním přihlášení.
- Smazání účtu revokuje token Applu, z tvého serveru.
- Všechno je otestované na skutečném iPhonu, s Apple účtem, který se do appky ještě nikdy nepřihlásil.
- Tvoje screenshoty ukazují přihlašovací obrazovku přesně tak, jak vypadá v odeslaném buildu.
Oprav zamítnutí, než appku pošleš znovu
Pokud ti Apple appku právě zamítl kvůli 4.8, Apple Review Kit shrnuje, co kontroluju před každým odesláním, plus dva skills, které v Claude Code projdou tvůj projekt a připraví ti odpověď, když Apple zamítne. Jestli chceš lidský pohled, zarezervuj si se mnou hodinu: projdeme zprávu spolu a podíváme se na tvoji přihlašovací obrazovku. Celý postup po zamítnutí je na stránce appka zamítnutá Applem.
Pokud chystáš své první vydání, udělej si diagnostiku zdarma: řekne ti, kterým krokem začít, a pošle ti můj checklist proti zamítnutí od Applu.
Nikdo ti nemůže zaručit, že Apple tvoji appku schválí. Přidáním přihlášení přes Apple na správné místo aspoň škrtneš tenhle důvod ze seznamu.
Časté dotazy
Je přihlášení přes Apple na iOS povinné?
Ne, ne ve všech případech. Vyžaduje se jen tehdy, když tvoje appka nabízí přihlášení třetí strany, třeba Google nebo Facebook, k vytvoření hlavního účtu. Od ledna 2024 ho může nahradit jiná rovnocenná služba, ale Apple jako vyhovující uvádí jen přihlášení přes Apple.
Co znamená „Guideline 4.8 - Design - Login Services“?
Je to název zamítnutí ve zprávě od Applu. Znamená, že tvoje appka nabízí přihlášení třetí strany bez rovnocenné možnosti, která omezuje data na jméno a e-mail, umožňuje e-mail skrýt a neslouží k reklamě bez souhlasu.
Stačí registrace e-mailem vedle Googlu?
To není jisté. Text požaduje službu, která umožní nechat si e-mail pro sebe, zatímco klasický formulář ho vyžaduje. Apple k tomuto případu nezveřejnil žádné stanovisko a jeho zpráva o zamítnutí uvádí jen přihlášení přes Apple. Já bych to riziko nepodstupoval.
Musím nabízet přihlášení přes Apple i na Androidu?
Ne. Pravidlo 4.8 je pravidlo App Store a modul z Expa funguje jen na iOS. Na Androidu vrací isAvailableAsync() false: tlačítko Apple se nezobrazí a Google může zůstat sám.
Je po zamítnutí 4.8 potřeba nový build?
Ano, ve většině případů. Přihlášení přes Apple vyžaduje nativní capability, zapnutou při buildu. Vzdálená aktualizace ji přidat neumí. Jediná výjimka: tvoje appka už vyhovující možnost měla a stačí to Applu vysvětlit v odpovědi.