Guideline 4.8: e obligatoriu Sign in with Apple?
De Mehdi Azizi
Publicat pe , 9 min.
Guideline 4.8: dacă aplicația ta are login cu Google sau Facebook, adaugă unul care protejează e-mailul, cum e Apple. Excepții, cod Expo, ștergerea contului.
Guideline 4.8 se aplică imediat ce aplicația ta folosește Google, Facebook sau alt login terț pentru crearea contului principal. În cazul ăsta, îți cere o altă opțiune de conectare, echivalentă, care limitează datele la nume și e-mail, permite ascunderea e-mailului și nu urmărește utilizatorul în scop publicitar fără acordul lui. Din ianuarie 2024, opțiunea asta nu mai trebuie să fie neapărat „Sign in with Apple”, dar e cea pe care Apple o citează chiar el în mesajele de respingere.
Dintre aplicațiile mele, Solys și Nolera oferă Apple, Google și e-mail. Ghidul ăsta pornește de la textul actual al Apple, apoi îți arată cum adaug conectarea cu Apple într-o aplicație Expo legată de Supabase și ce schimbă ea la ștergerea contului. Pentru imaginea de ansamblu a motivelor de respingere, citește mai bine de ce respinge Apple o aplicație.
Ce spune guideline 4.8 Login Services?
Regula 4.8 se găsește în secțiunea 4, „Design”, din App Review Guidelines. Vizează aplicațiile care folosesc „a third-party or social login service” ca să creeze sau să autentifice contul principal: Facebook Login, Google Sign-In, Log in with X, LinkedIn, Amazon sau WeChat. Aceste aplicații trebuie să ofere și, „as an equivalent option”, un alt serviciu de conectare care îndeplinește trei condiții.
| Condiția Apple | Pe românește |
|---|---|
| Date limitate | Nume și e-mail, nimic în plus |
| E-mail privat posibil | Utilizatorul îl poate ascunde |
| Fără reclame fără acord | Nicio urmărire publicitară fără acord |
Textul definește și contul principal: cel pe care persoana îl creează în aplicația ta ca să se identifice, să se conecteze și să ajungă la funcțiile tale. Conform acestei definiții, un buton Google care servește doar la importul unui fișier nu creează un cont principal. Regula 4.8 vizează ecranul prin care intri în aplicația ta.
Ce s-a schimbat în ianuarie 2024
Înainte de 2024, regula impunea „Sign in with Apple” aplicațiilor care foloseau un login terț pentru contul principal. Pe 25 ianuarie 2024, Apple a relaxat acest punct: poți oferi conectarea cu Apple sau un serviciu echivalent care protejează viața privată. Multe pagini spun încă opusul. Documentația Expo scrie și acum că o aplicație cu login terț trebuie să ofere Apple.
În practică, mesajul de respingere 4.8 publicat pe forumurile pentru dezvoltatori ale Apple se termină așa: „Note that Sign in with Apple meets the requirements specified in guideline 4.8”. Apple nu numește niciun alt serviciu conform. Ca să nu mă joc de-a ghicitul cu reviewerul, adaug conectarea cu Apple.
Cele cinci excepții prevăzute de text
Apple enumeră cinci cazuri în care nu e cerută nicio altă metodă de conectare:
- Aplicația ta folosește doar propriul sistem de conturi, de exemplu e-mail cu parolă sau un cod trimis pe e-mail.
- Aplicația ta e un magazin de aplicații alternativ sau e distribuită de unul, cu o conectare proprie acelui magazin.
- Aplicația ta e educațională, enterprise sau profesională și cere un cont existent de școală sau de companie.
- Aplicația ta folosește un sistem de identitate electronică susținut de un stat sau de un sector.
- Aplicația ta e clientul unui serviciu terț anume: persoana se conectează la e-mailul sau la rețeaua ei socială ca să-și acceseze propriul conținut.
Chiar înainte de excepțiile astea, pune-ți o întrebare: aplicația ta are nevoie de cont? Dacă nu, guideline 5.1.1(v) cere ca ea să poată fi folosită fără conectare, cum explic în ghidul despre guideline 5.1.1.
| Ecranul tău de conectare | Se aplică 4.8? |
|---|---|
| Fără cont | Nu |
| Doar e-mail sau cod | Nu |
| Doar Google | Da |
| Google și e-mail | Da, în principiu |
| Google și Apple | Da, și e conform |
| Cont de școală existent | Nu |
| Google pentru un import | Nu, nu există cont |
Cum adaugi „Sign in with Apple” într-o aplicație Expo
1. Instalează modulul și declară capabilitatea
npx expo install expo-apple-authentication
Documentația Expo cere apoi activarea capabilității în configurația aplicației:
{
"expo": {
"ios": {
"usesAppleSignIn": true,
"infoPlist": { "CFBundleAllowMixedLocalizations": true }
}
}
}
A doua linie afișează butonul în limba iPhone-ului. Cu EAS Build, capabilitatea e activată pe identificatorul aplicației tale în momentul buildului. E o setare nativă: pleacă doar cu un build nou, niciodată cu un update la distanță.
O capcană pe care am găsit-o recitind codul de pornire din kiturile mele: capabilitatea asta impune o semnătură, chiar și ca să rulezi aplicația în simulator. Pe un Mac fără certificat „Apple Development”, compilarea locală eșua cu „No code signing certificates are available to use”. Soluția: activezi conectarea cu Apple doar când serverul de autentificare e configurat.
2. Afișează butonul oficial, la fel de vizibil ca Google
Regulile de design ale Apple sunt clare: butonul Apple nu trebuie să fie mai mic decât celelalte butoane de conectare și nu trebuie să derulezi ecranul ca să-l vezi. Componenta Expo desenează butonul oficial, cu un titlu permis de Apple.
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: fără conectare Apple, fără buton.
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 precizează că butonul nu apare fără lățime și înălțime. Culoarea și rotunjirea se setează prin buttonStyle și cornerRadius, nu prin style.
3. Deschide sesiunea în 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("Token Apple lipsă");
const { error } = await supabase.auth.signInWithIdToken({
provider: "apple",
token: credential.identityToken,
});
if (error) throw error;
// Prenumele vine doar la prima autorizare: îl salvăm imediat.
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;
}
}
Patru detalii contează, luate din documentația Supabase, din cea Expo și din regulile de design ale Apple:
- În Supabase, declară identificatorul de bundle în Client IDs ale providerului Apple. O aplicație exclusiv nativă nu are nevoie de cheie secretă ca să se conecteze. Adaugă
host.exp.Exponentdacă testezi în Expo Go. - Prenumele și e-mailul vin o singură dată. Apple nu le mai trimite la conectările următoare: salvează-le de la primul răspuns.
- E-mailul poate fi o adresă releu. Apple recomandă să nu ceri apoi din nou o adresă personală.
- O anulare nu e o eroare. Pe Nolera, închiderea foii Apple nu declanșează niciun mesaj roșu: e un gest voluntar.
Un caz trăit pe Solys, în august 2026: butoanele Apple și Google erau în aplicație, dar niciunul dintre cei doi provideri nu era activat în Supabase. Codul era bun, corectura s-a făcut pe server, fără build nou. Un buton Apple care eșuează în fața reviewerului înseamnă o respingere 2.1 în loc de o respingere 4.8. Detaliile sunt în ghidul despre guideline 2.1.
4. Testează pe un iPhone real
Expo avertizează că simulatorul permite doar un test limitat și că identificatorii primiți în Expo Go diferă de cei ai aplicației publicate. Testează conectarea, deconectarea și apoi o reconectare pe un iPhone real, cu un build TestFlight.
Conectarea cu Apple și ștergerea contului
Guideline 5.1.1(v) cere ca un cont creat în aplicație să poată fi șters din aplicație. Cu conectarea Apple, pagina Apple despre ștergerea contului adaugă un pas: folosești REST API-ul Sign in with Apple ca să revoci tokenurile persoanei.
Revocarea asta cere două lucruri: un token al persoanei, pe care îl obții validând un cod de autorizare, și un secret semnat cu cheia ta privată Sign in with Apple. Chiar dacă conectarea nativă nu are nevoie de cheie secretă, revocarea cere una, și ea rămâne pe serverul tău. De ce, afli în cheie API secretă într-o aplicație Expo.
Pe Nolera, când ștergi contul, aplicația cere din nou o conectare Apple ca să obțină un cod de autorizare proaspăt. Îl trimite unei funcții de pe server, care îl schimbă la Apple și apoi revocă tokenul. Dacă persoana anulează, un mesaj clar îi spune asta și nu se șterge nimic. Restul parcursului, inclusiv datele, abonamentul și testele, e în ștergerea contului pe iOS.
Ce îi răspunzi Apple după o respingere 4.8
Mesajul Apple propune două ieșiri. Fie adaugi o opțiune echivalentă. Fie aplicația ta are deja una: răspunzi în App Store Connect, spui care e și de ce îndeplinește cele trei condiții. Apple sugerează și să actualizezi capturile care arată ecranul de conectare. Procedura ca să răspunzi la App Review e aceeași ca pentru celelalte reguli.
Iată un model în engleză, de adaptat (înlocuiește numărul buildului):
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-listul 4.8 înainte de trimitere
- Știi dacă aplicația ta are nevoie de cont. Dacă nu, se folosește fără conectare.
- Dacă Google, Facebook sau X creează contul, conectarea cu Apple e pe același ecran.
- Butonul Apple e butonul oficial, la fel de mare ca celelalte, vizibil fără derulare.
- Providerul Apple e activat pe server, cu identificatorul tău de bundle.
- O anulare te duce înapoi la ecranul de conectare, fără mesaj de eroare.
- Prenumele și e-mailul sunt salvate de la prima conectare.
- Ștergerea contului revocă tokenul Apple, de pe serverul tău.
- Totul e testat pe un iPhone real, cu un cont Apple care nu s-a conectat niciodată la aplicație.
- Capturile tale arată ecranul de conectare exact cum e în buildul trimis.
Corectează respingerea înainte să retrimiți aplicația
Dacă aplicația ta tocmai a fost respinsă pe 4.8, Apple Review Kit adună tot ce verific înainte de fiecare trimitere, cu două skilluri care îți recitesc proiectul în Claude Code și îți pregătesc răspunsul dacă Apple respinge. Pentru o privire umană, rezervă o oră cu mine: citim mesajul împreună și ne uităm la ecranul tău de conectare. Demersul complet după o respingere e pe pagina aplicație respinsă de Apple.
Dacă îți pregătești prima lansare, fă-ți diagnosticul gratuit: îți spune ce etapă să abordezi mai întâi și îți trimite checklistul meu anti-respingere Apple.
Nimeni nu poate garanta că Apple îți va accepta aplicația. Dacă adaugi conectarea cu Apple unde trebuie, măcar scoți motivul ăsta de pe listă.
Întrebări frecvente
Conectarea cu Apple e obligatorie pe iOS?
Nu, nu în toate cazurile. E cerută doar dacă aplicația ta oferă un login terț, cum ar fi Google sau Facebook, pentru crearea contului principal. Din ianuarie 2024, o poate înlocui alt serviciu echivalent, dar Apple citează doar conectarea cu Apple ca fiind conformă.
Ce înseamnă „Guideline 4.8 - Design - Login Services”?
E titlul respingerii din mesajul Apple. Înseamnă că aplicația ta oferă un login terț fără o opțiune echivalentă care limitează datele la nume și e-mail, permite ascunderea e-mailului și nu e folosită pentru reclame fără acord.
Înregistrarea mea prin e-mail e suficientă lângă Google?
Nu e garantat. Textul cere un serviciu care îți permite să-ți păstrezi e-mailul privat, iar un formular clasic ți-l cere. Apple nu a publicat o poziție pe cazul ăsta, iar mesajul lui de respingere citează doar conectarea cu Apple. Eu nu mi-aș asuma riscul.
Trebuie să ofer conectarea cu Apple pe Android?
Nu. Regula 4.8 ține de App Store, iar modulul Expo funcționează doar pe iOS. Pe Android, isAvailableAsync() returnează false: butonul Apple nu se afișează, iar Google poate rămâne singur.
E nevoie de un build nou după o respingere 4.8?
Da, în majoritatea cazurilor. Conectarea cu Apple cere o capabilitate nativă, activată în momentul buildului. Un update la distanță nu o poate adăuga. Singura excepție: aplicația ta avea deja o opțiune conformă și e suficient să-i explici asta Apple în răspuns.