Guideline 4.8 Login Services: treba li prijava s Appleom?
Autor: Mehdi Azizi
Objavljeno , 9 min
Guideline 4.8: ako tvoja aplikacija nudi Google ili Facebook, dodaj prijavu koja štiti e-mail, poput Applea. Iznimke, Expo kod i brisanje računa.
Guideline 4.8 primjenjuje se čim tvoja aplikacija koristi Google, Facebook ili neku drugu prijavu treće strane za stvaranje glavnog računa. Tada traži još jednu, ravnopravnu opciju prijave koja ograničava podatke na ime i e-mail, omogućuje skrivanje e-maila i ne prati korisnika za oglašavanje bez njegova pristanka. Od siječnja 2024. ta opcija više ne mora nužno biti "Sign in with Apple", ali upravo nju Apple sam navodi u svojim porukama o odbijanju.
Na mojim aplikacijama, Solys i Nolera nude Apple, Google i e-mail. Ovaj vodič polazi od Appleova trenutnog teksta, zatim pokazuje kako dodajem prijavu s Appleom u Expo aplikaciju povezanu sa Supabaseom i što ona mijenja kod brisanja računa. Za pregled svih razloga odbijanja radije pročitaj zašto Apple odbija aplikaciju.
Što kaže guideline 4.8 Login Services?
4.8 se nalazi u odjeljku 4, "Design", u App Review Guidelines. Cilja aplikacije koje koriste "a third-party or social login service" za stvaranje ili autentifikaciju glavnog računa: Facebook Login, Google Sign-In, Log in with X, LinkedIn, Amazon ili WeChat. Te aplikacije moraju ponuditi i, "as an equivalent option", drugu uslugu prijave koja ispunjava tri uvjeta.
| Appleov uvjet | Jednostavno rečeno |
|---|---|
| Ograničeni podaci | Ime i e-mail, ništa više |
| Mogućnost privatnog e-maila | Korisnik ga može sakriti |
| Bez oglasa bez pristanka | Nikakvo praćenje za oglase bez pristanka |
Tekst definira i glavni račun: onaj koji osoba stvara u tvojoj aplikaciji da bi se identificirala, prijavila i pristupila tvojim funkcijama. Prema toj definiciji, gumb Google koji služi samo za uvoz datoteke ne stvara glavni račun. 4.8 cilja ekran kroz koji se ulazi u tvoju aplikaciju.
Što se promijenilo u siječnju 2024.
Prije 2024. pravilo je nametalo "Sign in with Apple" aplikacijama koje su koristile prijavu treće strane za glavni račun. 25. siječnja 2024. Apple je to ublažio: možeš ponuditi prijavu s Appleom ili ekvivalentnu uslugu koja štiti privatnost. Mnoge stranice i dalje tvrde suprotno. Expo dokumentacija još uvijek piše da aplikacija s prijavom treće strane mora ponuditi Apple.
U praksi, poruka o odbijanju 4.8 objavljena na Appleovim forumima za developere završava ovako: "Note that Sign in with Apple meets the requirements specified in guideline 4.8". Apple ne navodi nijednu drugu usklađenu uslugu. Da ne bih igrao pogađanja s reviewerom, dodajem prijavu s Appleom.
Pet iznimaka predviđenih tekstom
Apple navodi pet slučajeva u kojima se ne traži nikakva druga prijava:
- Tvoja aplikacija koristi samo vlastiti sustav računa, na primjer e-mail s lozinkom ili kod poslan e-mailom.
- Tvoja aplikacija je alternativna trgovina aplikacija ili se distribuira kroz neku od njih, s prijavom specifičnom za tu trgovinu.
- Tvoja aplikacija je obrazovna, poslovna ili profesionalna i zahtijeva postojeći školski ili poslovni račun.
- Tvoja aplikacija koristi sustav elektroničkog identiteta koji podržava država ili neki sektor.
- Tvoja aplikacija je klijent točno određene usluge treće strane: osoba se prijavljuje u svoj e-mail ili društvenu mrežu da bi pristupila vlastitom sadržaju.
Prije samih iznimaka, postavi si pitanje: treba li tvojoj aplikaciji uopće račun? Ako ne treba, guideline 5.1.1(v) traži da bude upotrebljiva bez prijave, kako objašnjavam u vodiču za guideline 5.1.1.
| Tvoj ekran za prijavu | Primjenjuje li se 4.8? |
|---|---|
| Nema računa | Ne |
| Samo e-mail ili kod | Ne |
| Samo Google | Da |
| Google i e-mail | Da, u načelu |
| Google i Apple | Da, i usklađeno je |
| Postojeći školski račun | Ne |
| Google za uvoz | Ne, nema računa |
Dodavanje "Sign in with Apple" u Expo aplikaciju
1. Instaliraj modul i deklariraj capability
npx expo install expo-apple-authentication
Expo dokumentacija zatim traži da uključiš capability u konfiguraciji aplikacije:
{
"expo": {
"ios": {
"usesAppleSignIn": true,
"infoPlist": { "CFBundleAllowMixedLocalizations": true }
}
}
}
Drugi redak prikazuje gumb na jeziku iPhonea. S EAS Buildom capability se uključuje na identifikatoru tvoje aplikacije u trenutku builda. To je nativna postavka: ide s novim buildom, nikad s udaljenim ažuriranjem.
Zamka koju sam našao pregledavajući početni kod svojih kitova: ovaj capability zahtijeva potpisivanje, čak i za pokretanje aplikacije na simulatoru. Na Macu bez certifikata "Apple Development" lokalna kompilacija pucala je s "No code signing certificates are available to use". Rješenje: uključi prijavu s Appleom tek kad je poslužitelj za autentifikaciju konfiguriran.
2. Prikaži službeni gumb, jednako vidljiv kao Google
Appleova pravila dizajna su jasna: gumb Apple ne smije biti manji od ostalih gumba za prijavu i ne smije se morati skrolati da bi se vidio. Expo komponenta crta službeni gumb, s naslovom koji Apple dopušta.
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 i web: nema prijave s Appleom, nema gumba.
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 napominje da se gumb ne pojavljuje bez širine i visine. Boja i zaobljenje idu kroz buttonStyle i cornerRadius, ne kroz style.
3. Otvori sesiju u Supabaseu
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("Nedostaje Apple token");
const { error } = await supabase.auth.signInWithIdToken({
provider: "apple",
token: credential.identityToken,
});
if (error) throw error;
// Ime stiže samo kod prve autorizacije: spremamo ga odmah.
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;
}
}
Bitna su četiri detalja, iz Supabase dokumentacije, Expo dokumentacije i Appleovih pravila dizajna:
- U Supabaseu upiši svoj bundle identifier u Client IDs Apple providera. Čisto nativnoj aplikaciji ne treba tajni ključ za prijavu. Dodaj
host.exp.Exponentako testiraš u Expo Go. - Ime i e-mail stižu samo jednom. Apple ih više ne šalje kod sljedećih prijava: spremi ih čim prvi put stignu.
- E-mail može biti relay adresa. Apple preporučuje da poslije ne tražiš ponovno osobnu adresu.
- Otkazivanje nije greška. Na Noleri zatvaranje Apple prozora ne pokreće nikakvu crvenu poruku: to je namjerna radnja.
Stvarni slučaj na Solysu, u kolovozu 2026.: gumbi Apple i Google bili su u aplikaciji, ali nijedan od dva providera nije bio uključen u Supabaseu. Kod je bio dobar, ispravak se napravio na poslužitelju, bez novog builda. Gumb Apple koji ne radi pred reviewerom znači odbijanje 2.1 umjesto odbijanja 4.8. Detalji su u vodiču za guideline 2.1.
4. Testiraj na pravom iPhoneu
Expo upozorava da simulator omogućuje samo ograničeno testiranje i da se identifikatori dobiveni u Expo Go razlikuju od onih u objavljenoj aplikaciji. Testiraj prijavu, odjavu pa ponovnu prijavu na pravom iPhoneu, s TestFlight buildom.
Prijava s Appleom i brisanje računa
Guideline 5.1.1(v) traži da se račun stvoren u aplikaciji može obrisati iz aplikacije. S prijavom s Appleom, Appleova stranica o brisanju računa dodaje korak: korištenje Sign in with Apple REST API-ja za opoziv tokena te osobe.
Taj opoziv traži dvije stvari: token osobe, koji dobiješ validacijom autorizacijskog koda, i secret potpisan tvojim privatnim Sign in with Apple ključem. Iako nativna prijava ne treba tajni ključ, opoziv ga traži, i on ostaje na tvom poslužitelju. Zašto, piše u tajni API ključ u Expo aplikaciji.
Na Noleri, u trenutku brisanja računa, aplikacija ponovno traži prijavu s Appleom kako bi dobila svjež autorizacijski kod. Šalje ga serverskoj funkciji, koja ga razmjenjuje kod Applea i zatim opoziva token. Ako osoba otkaže, jasna poruka to kaže i ništa se ne briše. Ostatak procesa, uključujući podatke, pretplatu i testove, nalazi se u brisanje računa na iOS-u.
Što odgovoriti Appleu nakon odbijanja 4.8
Appleova poruka nudi dva izlaza. Ili dodaš ekvivalentnu opciju. Ili tvoja aplikacija već ima jednu: odgovoriš u App Store Connectu, kažeš koju i zašto ispunjava tri uvjeta. Apple predlaže i da ažuriraš snimke zaslona koje prikazuju ekran za prijavu. Postupak za odgovor App Reviewu isti je kao za ostala pravila.
Evo predloška na engleskom, za prilagodbu (zamijeni broj builda):
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,
Check-lista za 4.8 prije slanja
- Znaš treba li tvojoj aplikaciji račun. Ako ne, koristi se bez prijave.
- Ako Google, Facebook ili X stvaraju račun, prijava s Appleom je na istom ekranu.
- Gumb Apple je službeni gumb, jednako velik kao ostali, vidljiv bez skrolanja.
- Apple provider je uključen na poslužitelju, s tvojim bundle identifierom.
- Otkazivanje vraća na ekran za prijavu, bez poruke o grešci.
- Ime i e-mail spremaju se već kod prve prijave.
- Brisanje računa opoziva Apple token, s tvog poslužitelja.
- Sve je testirano na pravom iPhoneu, s Apple računom koji se nikad nije prijavio u aplikaciju.
- Tvoje snimke zaslona prikazuju ekran za prijavu točno kakav je u poslanom buildu.
Ispravi odbijanje prije ponovnog slanja
Ako je tvoja aplikacija upravo odbijena zbog 4.8, Apple Review Kit okuplja sve što provjeravam prije svakog slanja, s dva skilla koji pregledavaju tvoj projekt u Claude Codeu i pripremaju tvoj odgovor ako Apple odbije. Za ljudski pogled, rezerviraj sat sa mnom: zajedno čitamo poruku i gledamo tvoj ekran za prijavu. Cijeli postupak nakon odbijanja nalazi se na stranici aplikacija odbijena od Applea.
Ako pripremaš svoje prvo izdanje, napravi besplatnu dijagnostiku: reći će ti kojim korakom krenuti i poslati ti moju checklistu protiv Appleovih odbijanja.
Nitko ne može jamčiti da će Apple prihvatiti tvoju aplikaciju. Dodavanje prijave s Appleom na pravo mjesto barem miče ovaj razlog s popisa.
Česta pitanja
Je li prijava s Appleom obavezna na iOS-u?
Ne, ne u svim slučajevima. Traži se samo ako tvoja aplikacija nudi prijavu treće strane, poput Googlea ili Facebooka, za stvaranje glavnog računa. Od siječnja 2024. može je zamijeniti druga ekvivalentna usluga, ali Apple kao usklađenu navodi samo prijavu s Appleom.
Što znači "Guideline 4.8 - Design - Login Services"?
To je naslov odbijanja u Appleovoj poruci. Znači da tvoja aplikacija nudi prijavu treće strane bez ekvivalentne opcije koja ograničava podatke na ime i e-mail, omogućuje skrivanje e-maila i ne koristi se za oglašavanje bez pristanka.
Je li moja registracija e-mailom dovoljna uz Google?
Nije zajamčeno. Tekst traži uslugu koja omogućuje da e-mail ostane privatan, a klasični obrazac ga traži. Apple nije objavio stav o tom slučaju, a njegova poruka o odbijanju navodi samo prijavu s Appleom. Ja ne bih riskirao.
Treba li nuditi prijavu s Appleom na Androidu?
Ne. 4.8 je pravilo App Storea, a Expo modul radi samo na iOS-u. Na Androidu isAvailableAsync() vraća false: gumb Apple se ne prikazuje i Google može ostati sam.
Treba li novi build nakon odbijanja 4.8?
Da, u većini slučajeva. Prijava s Appleom traži nativni capability, uključen u trenutku builda. Udaljeno ažuriranje ga ne može dodati. Jedina iznimka: tvoja aplikacija je već imala usklađenu opciju i dovoljno je to objasniti Appleu u odgovoru.