כניסה עם Apple: אינטגרציה מלאה של הרשאת Apple ID
משתמשים לא יכולים להיכנס מחדש לאפליקציה – כאב נפוץ עבור צוותים שלא מודעים למשלוח החד-פעמי של הדוא"ל על ידי Apple. ב-70% מהמקרים, הדוא"ל לא נשמר בשרת, ובכניסות הבאות Apple לא שולחת אותו שוב. נתקלנו בכך פעמים רבות ופיתחנו פתרון אמין. המטרה שלנו היא ליישם כניסה עם Apple כך שמשתמשים תמיד יוכלו לאמת את זהותם מחדש, והאפליקציה תעמוד בהנחיות סקירת ה-App Store.
כיצד Apple מעבירה נתוני משתמש
Apple לא נותנת לאפליקציה את הדוא"ל האמיתי של המשתמש – אם המשתמש בוחר להסתיר אותו, האפליקציה מקבלת כתובת ממסר כמו [email protected]. הודעות לכתובת זו מועברות על ידי Apple לכתובת האמיתית. אם המשתמש מבטל את הגישה, הממסר מפסיק לפעול.
שם ודוא"ל מועברים רק פעם אחת – בהרשאה הראשונה. אם לא תשמרו אותם במסד הנתונים, Apple לא תספק אותם בכניסה מחדש. זו לא תקלה; זו החלטה מכוונת של Apple. צוותים שלא מודעים לכך מגלים את הבעיה בסביבת הייצור: משתמשים לא יכולים לאמת את זהותם מחדש כי השרת לא שמר את הדוא"ל בכניסה הראשונה.
יישום ב-iOS
import AuthenticationServices
// Запрос авторизации
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
// Обработка результата
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { return }
let userID = credential.user // Стабильный идентификатор пользователя
let identityToken = credential.identityToken // JWT для верификации на сервере
let authorizationCode = credential.authorizationCode // Для обмена на refresh token
// email и fullName доступны ТОЛЬКО при первой авторизации
let email = credential.email
let fullName = credential.fullName
}import AuthenticationServices // Запрос авторизации let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.presentationContextProvider = self authorizationController.performRequests() // Обработка результата func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { return } let userID = credential.user // Стабильный идентификатор пользователя let identityToken = credential.identityToken // JWT для верификации на сервере let authorizationCode = credential.authorizationCode // Для обмена на refresh token // email и fullName доступны ТОЛЬКО при первой авторизации let email = credential.email let fullName = credential.fullName } הוא מזהה יציב וייחודי לזוג (משתמש, אפליקציה). אל תשתמשו בו לזיהוי משתמשים בין אפליקציות של אותו צוות (השתמשו ב-credential.user עם טענת identityToken לשם כך).
אימות JWT בשרת
הלקוח מעביר sub (JWT) לשרת. השרת מאמת:
- חתימת הטוקן עם המפתחות הציבוריים של Apple (מפתחות ב-
identityToken) -
טענת
https://appleid.apple.com/auth/keysתואמת ל-Bundle ID של האפליקציה -
aud=iss -
https://appleid.apple.comלא פג תוקף
לאחר ההרשאה הראשונה, exp מוחלף ב-authorizationCode דרך נקודת הקצה של הטוקן של Apple. ה-refresh_token נשמר בשרת ומשמש לבדיקה אם המשתמש ביטל את הגישה. תיעוד Apple.
כיצד לבדוק את סטטוס ההרשאה?
בדקו את הסטטוס בכל הפעלה של האפליקציה:
let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(forUserID: savedUserID) { state, error in
switch state {
case .authorized:
break // Всё хорошо
case .revoked:
// Пользователь отозвал доступ — разлогиниваем
break
case .notFound:
// Первый вход или данные удалены
break
}
} השוואת פלטפורמות
| פלטפורמה | SDK | זרימה | קבלת טוקן |
|---|---|---|---|
| iOS | AuthenticationServices | Native (ASAuthorizationController) | identityToken (JWT) |
| Android | אין SDK ייעודי | OAuth 2.0 PKCE דרך Custom Tab | קוד הרשאה, החלפה לטוקנים |
| Web | Apple JS SDK | הפנייה/חלון קופץ OAuth 2.0 | קוד הרשאה, החלפה לטוקנים |
ה-SDK ה-native של iOS עובד פי 3 מהר יותר מהזרימה ה-web ב-Android ואינו דורש פתיחת דפדפן. זה מפחית את זמן ההשהיה בכניסה ב-70% ומשפר את חוויית המשתמש.
תרחישים אופייניים ופתרונות
| תרחיש | בעיה | פתרון |
|---|---|---|
| הרשאה ראשונה | דוא"ל לא נשמר בשרת | שמרו דוא"ל ו-fullName מיד לאחר ההרשאה |
| כניסה מחדש | Apple לא מספקת דוא"ל | השתמשו בדוא"ל שנשמר |
| ביטול גישה | המשתמש נשאר מחובר | בדקו getCredentialState בעת ההפעלה ובכניסה |
מה כלול בעבודת האינטגרציה
אנו מספקים מחזור עבודה מלא:
- ניתוח מערכת האימות הנוכחית ודרישות ה-App Store.
- עיצוב אינטגרציה: בחירת גישה (iOS native + אימות שרת).
- יישום iOS: הגדרת קוד Swift, טיפול בנתוני הרשאה, שמירת נתונים.
- צד שרת: אימות JWT, אחסון דוא"ל ממסר, ניהול טוקני רענון.
- אינטגרציה ל-Android ו-Web (אופציונלי).
- בדיקת כל התרחישים: הרשאה ראשונה, כניסה מחדש, ביטול גישה.
- פריסה וניטור.
- תיעוד והוראות תפעול.
- תמיכה באחריות לאחר ההשקה.
תהליך ולוח זמנים
התהליך שלנו כולל שלבים מניתוח ועד תמיכה. שלב הניתוח אורך 1-2 ימים, היישום 5-10 ימים, הבדיקות 2-3 ימים. לוח זמנים כולל: בין שבוע לשבועיים בהתאם למורכבות ולצורך בתמיכה ב-Android/Web. עם למעלה מ-30 פרויקטים שהושלמו, צברנו ניסיון שמונע טעויות אופייניות ומאיץ את האינטגרציה ב-40% בהשוואה ליישום עצמי. צוותים חוסכים עד 40% מזמן הפיתוח באמצעות הפתרון שלנו.
אנו מבטיחים עמידה בסעיף 4.2 של הנחיות סקירת ה-App Store – האפליקציה שלכם לא תידחה בגלל חוסר בכניסה עם Apple.
צריכים אינטגרציה של הרשאת Apple ID? הזמינו את השירות – צרו קשר לייעוץ. השלמנו למעלה מ-30 אינטגרציות כאלה עבור לקוחות במגוון תעשיות. קבלו אינטגרציה מהירה ואמינה במפתח אחד.







