הטמעת מנוי Family Sharing באפליקציית iOS
אנו מיישמים מנויי Family Sharing באפליקציות iOS באמצעות StoreKit 2, תוך הבטחת בדיקות הרשאות נכונות וטיפול בביטולי גישה. גישת משפחה למנויים היא תכונה הנתמכת על ידי App Store, אך היישום שלה גורם לעיתים קרובות לבעיות. בן משפחה אחד רוכש מנוי, ועד 6 אחרים מקבלים גישה אוטומטית. עם זאת, אם האפליקציה מטפלת בצורה לא נכונה בביטול גישה כאשר משתמש עוזב את המשפחה, הגישה נשארת—מה שגורם לאובדן הכנסות (עד 30% בחלק מהפרויקטים). כמפתחים עם ניסיון של למעלה מ-5 שנים ועשרות רכישות בתוך האפליקציה שיושמו, אנו פותרים בעיה זו במפתח פתוח. במאמר זה, נעבור על התצורה הנכונה של Family Sharing באמצעות StoreKit 2, בדיקות וטעויות אופייניות.
יישום שלב אחר שלב
- הפעלת Family Sharing ב-App Store Connect – עבור מוצר המנוי שלך, הפעל את Family Sharing בהגדרות רכישה בתוך האפליקציה.
-
בדיקת הרשאות בעת ההפעלה – השתמש ב-
ownershipTypeכדי לעבור על עסקאות מאומתות ולבדוק.purchased. -
הגדרת מאזין רציף – צור משימה שמאזינה ל-
.familySharedכדי לטפל בביטולי גישה באופן מיידי. -
הענקת או ביטול גישה – בהתבסס על
Transaction.currentEntitlementsו-for await verificationResult in Transaction.currentEntitlements { switch verificationResult { case .verified(let transaction): if transaction.productID == "com.app.premium" { switch transaction.ownershipType { case .purchased: grantAccess(source: .directPurchase) case .familyShared: grantAccess(source: .familySharing) @unknown default: break } } case .unverified: // не доверяем транзакции — логируем, не даём доступ break } }, עדכן את מצב ההרשאות של האפליקציה שלך. - בדיקה עם חשבונות Sandbox – צור מספר מזהי Apple לבדיקה, קבץ אותם למשפחה, ובדוק תרחישים של רכישה, גישה ויציאה.
כיצד פועלת בדיקת Family Sharing באמצעות StoreKit 2?
ב-StoreKit 2, כל עסקה מכילה שדה .familyShared: revocationDate (נרכש על ידי המשתמש) או Transaction.currentEntitlements (התקבל דרך המשפחה). האפליקציה חייבת לבדוק את שתי האפשרויות בעת ההפעלה ולהאזין ברציפות לעדכונים. הנה בדיקה בסיסית באמצעות Transaction.updates:
for await verificationResult in Transaction.currentEntitlements {
switch verificationResult {
case .verified(let transaction):
if transaction.productID == "com.app.premium" {
switch transaction.ownershipType {
case .purchased:
grantAccess(source: .directPurchase)
case .familyShared:
grantAccess(source: .familySharing)
@unknown default:
break
}
}
case .unverified:
// не доверяем транзакции — логируем, не даём доступ
break
}
}כדי להפעיל Family Sharing עבור מנוי, עליך להפעיל אותו ב-App Store Connect. בהגדרות רכישה בתוך האפליקציה, מצא את המוצר והפעל את המתג "Family Sharing" → "מופעל לכל החברים". פעולה זו מתבצעת פעם אחת ואינה מבטלת מנויים שכבר נרכשו.
מדוע מתרחשת חוסר סנכרון בגישה לאחר יציאה ממשפחה?
הטעות העיקרית היא שמירת סטטוס המנוי במטמון ללא בדיקת תקפותו. כאשר משתמש עוזב קבוצת משפחה, עסקת func listenForTransactionUpdates() { Task { for await verificationResult in Transaction.updates { if case .verified(let transaction) = verificationResult { if transaction.revocationDate != nil { revokeAccess() } else { await transaction.finish() grantAccess() } } } } } מקבלת currentEntitlements. .familyShared מפסיק להחזיר אותה, אך אם האפליקציה שומרת את סטטוס הפרימיום ב-UserDefaults או Keychain, הגישה נשארת. הניסיון שלנו מראה שעד 30% ממקרי הגישה המשפחתית מכילים בעיה זו. יישומים קודמים עם StoreKit 1 דרשו אימות בצד השרת, מה שהכפיל את העלות.
הפתרון הנכון הוא להאזין ל-ownershipType ברציפות, לא רק בעת הפעלת האפליקציה:
func listenForTransactionUpdates() {
Task {
for await verificationResult in Transaction.updates {
if case .verified(let transaction) = verificationResult {
if transaction.revocationDate != nil {
revokeAccess()
} else {
await transaction.finish()
grantAccess()
}
}
}
}
}קוד זה רץ בעת הפעלת האפליקציה ונשאר פעיל לכל משך חיי התהליך. בלעדיו, אפילו בדיקת in_app[].is_in_family_sharing בכל פתיחה עלולה לפספס ביטול גישה אם האפליקציה לא מופעלת מחדש.
מה חשוב בבדיקת Family Sharing?
בדיקה ב-Xcode Sandbox דורשת מספר מזהי Apple לבדיקה המקובצים למשפחה. ב-App Store Connect → משתמשים וגישה → בודקי Sandbox, צור לפחות שני משתמשים, ולאחר מכן הגדר Family Sharing ב-Sandbox שם. ללא שלב זה, לא תוכל לדמות עסקאות ownershipType. אנו מבטיחים כיסוי מלא—אנו בודקים תרחישים: רכישה על ידי המשתמש הראשי, גישה על ידי בני משפחה, יציאה מהמשפחה וכניסה חוזרת.
לשם הבהירות, התרחישים מסוכמים בטבלה:
| תרחיש | פעולה | תוצאה צפויה |
|---|---|---|
| המשתמש הראשי רוכש מנוי | רכישה באמצעות StoreKit 2 | עסקה עם ownershipType == .purchased |
| בן משפחה מקבל גישה | אוטומטית באמצעות Family Sharing | עסקה עם ownershipType == .familyShared |
| בן משפחה עוזב את הקבוצה | יציאה דרך הגדרות Apple ID | revocationDate מוגדר, הגישה מבוטלת |
| כניסה חוזרת למשפחה | חזרה לקבוצה | עסקת familyShared חדשה (אם המנוי עדיין פעיל) |
StoreKit 1 לעומת StoreKit 2: מה לבחור?
ה-API הישן (SKPaymentTransaction) אינו מספק Transaction.updates. כדי לבדוק עסקאות משותפות למשפחה ב-StoreKit 1, יש צורך באימות קבלה בצד השרת—נתח את שדה ownershipType. זה מסבך את הארכיטקטורה ומגדיל את זמן הפיתוח. StoreKit 2 מהיר פי 2-3 ליישום ואמין פי 5 בשל טיפול מובנה בביטולי גישה.
| היבט | StoreKit 1 | StoreKit 2 |
|---|---|---|
| בדיקת ownershipType | אימות קבלה בצד השרת | שדה Transaction.updates בעסקה |
| מורכבות | גבוהה (נדרש צד שרת) | נמוכה (צד לקוח, ללא שרת) |
| תגובה לביטול גישה | דורש מאזין נפרד + סנכרון שרת | Transaction.updates מובנה |
| תמיכה ב-Swift Concurrency | לא (רק @escaping) | כן (async/await) |
מעבר ל-StoreKit 2 מפחית את זמן היישום פי 2–3 ומקטין באגים. עבור פרויקטים חדשים, אנו ממליצים בחום על כך. פרטים נוספים ניתן למצוא ב-תיעוד הרשמי של Apple.
שאלות נפוצות
כיצד להפעיל Family Sharing עבור מנוי?
ב-App Store Connect, בהגדרות רכישה בתוך האפליקציה, הפעל את מתג Family Sharing עבור המוצר. לאחר השמירה, המוצר הופך לזמין לשיתוף משפחתי. לא ניתן לבטל פעולה זו עבור מנויים שכבר נרכשו.
מדוע המנוי נעלם לאחר יציאה ממשפחה?
כאשר משתמש עוזב קבוצת משפחה, עסקת .familyShared מקבלת revocationDate. Transaction.currentEntitlements מפסיק להחזיר אותה. כדי למנוע גישה לא מורשית, עליך להאזין ברציפות ל-Transaction.updates ולהגיב מיד לביטול הגישה.
כיצד לבדוק Family Sharing ב-Sandbox?
צור מספר מזהי Apple לבדיקה ב-App Store Connect וקבץ אותם למשפחה דרך בודקי Sandbox. לאחר מכן התחבר במכשיר עם חשבונות שונים כדי לבדוק תרחישי רכישה וגישה.
מה ההבדל בין StoreKit 1 ל-StoreKit 2 עבור Family Sharing?
ל-StoreKit 1 חסר שדה ownershipType; הוא דורש אימות קבלה בצד השרת ובדיקת שדה is_in_family_sharing. StoreKit 2 מספק ownershipType ישירות בעסקה, מפשט את הלוגיקה ותומך ב-async/await. המעבר מפחית מורכבות ומשפר אמינות.
מה אם משתמש לא מקבל גישה למנוי?
בדוק ש-Family Sharing מופעל ב-App Store Connect עבור המוצר. ודא שהאפליקציה מעבדת כראוי Transaction.currentEntitlements ו-Transaction.updates. כמו כן, ודא שחשבונות ה-Sandbox מוגדרים כראוי והמשתמש נמצא באותה קבוצת משפחה.
מה כוללת העבודה שלנו
- הגדרת Family Sharing עבור מוצרים ב-App Store Connect
- יישום בדיקת
ownershipTypeבאמצעות StoreKit 2 - טיפול בביטול גישה בעת יציאה מקבוצת משפחה
- מאזין רציף עבור
Transaction.updatesלאורך כל חיי האפליקציה - בדיקה עם משפחת Sandbox (עד 6 חברים, תרחישים מרובים)
- תיעוד לצד השרת (אם נדרש אימות backend)
- אחריות לפעולה תקינה למשך 30 יום לאחר המסירה
לוח זמנים ועלות
לוח זמנים משוער: 3–5 ימים, כולל הגדרת App Store Connect ובדיקות עם חשבונות Sandbox. עלות אופיינית נעה בין $1500 ל-$3000, תלוי במורכבות. צור קשר לקבלת הצעת מחיר. הזמן ביקורת על הקוד שלך לטיפול ב-Family Sharing—זה לוקח שעה וחוסך שבועות של עבודה חוזרת.







