הטמעת הצעות היכרות (הנחה לתקופה ראשונה) באפליקציות מובייל
הצעות היכרות הן כלי עוצמתי של StoreKit למשיכת מנויים חדשים. הנחיות הביקורת של App Store (סעיפים 4.2 ו-5.1) מסדירות את השימוש בהן. ללא הטמעה נכונה, המשתמש לא יראה את ההצעה, וההמרה יורדת. עם הגדרה נכונה, הצעת היכרות יכולה להגדיל את המרת המנויים ב-30–50%. אנו מבטיחים שה-paywall שלך יציג את ההצעה רק למי שבאמת זכאי. במאמר זה נסקור כיצד להגדיר ולבדוק זכאות, לשלב עם paywall, ולהימנע מטעויות נפוצות.
סוגי הצעות היכרות והגדרתן
Apple מציעה שלושה סוגים: freeTrial (חינם), payAsYouGo (הנחה על כל תקופה), ו-payUpFront (תשלום חד-פעמי עבור מספר תקופות). הבחירה תלויה במודל העסקי: freeTrial לניסיונות מוצר, payAsYouGo או payUpFront לרכישת לקוחות לטווח ארוך.
| סוג | תיאור | דוגמה |
|---|---|---|
| freeTrial | תקופת ניסיון חינם | 7 ימים חינם |
| payAsYouGo | הנחה על כל תקופה למשך N תקופות | 3 חודשים ראשונים בהנחה |
| payUpFront | תשלום חד-פעמי עבור N תקופות | 12 חודשים במחיר מופחת |
הצעת היכרות נוצרת ברמת המנוי: App Store Connect → Subscriptions → [מנוי] → Introductory Offers. ציין את הסוג, משך הזמן והמחיר. חשוב: ההצעה חלה רק על משתמשים שמעולם לא היו מנויים בקבוצת מנויים זו. Apple בודקת זאת בצד השרת. טעות נפוצה היא ציון משך זמן שגוי: עבור freeTrial, משך הזמן לא יכול להיות 0 ימים. משכי freeTrial אופייניים הם 3, 7 או 30 ימים.
כיצד לקרוא את ההצעה באמצעות StoreKit 2
ראשית, טען את המוצר ובדוק אם קיימת הצעת היכרות:
import StoreKit
// Загружаем продукт
let product = try? await Product.products(for: ["premium_monthly"]).first
// Проверяем наличие introductory offer
if let intro = product?.subscription?.introductoryOffer {
switch intro.paymentMode {
case .freeTrial:
let days = intro.period.value
let unit = intro.period.unit
showFreeTrialBanner(days: days)
case .payAsYouGo:
showDiscountedPriceBanner(price: intro.displayPrice, period: intro.period)
case .payUpFront:
showUpFrontBanner(price: intro.displayPrice, duration: intro.subscriptionPeriod)
@unknown default:
break
}
} מדוע בדיקת זכאות היא קריטית
Apple בודקת זכאות בצד השרת — תיעוד המפתחים של Apple.
import StoreKit // Загружаем продукт let product = try? await Product.products(for: ["premium_monthly"]).first // Проверяем наличие introductory offer if let intro = product?.subscription?.introductoryOffer { switch intro.paymentMode { case .freeTrial: let days = intro.period.value let unit = intro.period.unit showFreeTrialBanner(days: days) case .payAsYouGo: showDiscountedPriceBanner(price: intro.displayPrice, period: intro.period) case .payUpFront: showUpFrontBanner(price: intro.displayPrice, duration: intro.subscriptionPeriod) @unknown default: break } }קיים על כל מוצר ללא קשר לזכאות. לכן נדרשת בדיקה נוספת. StoreKit 2 מספק גישה להיסטוריית עסקאות:
// Проверяем статус подписки через Transaction
for await result in Transaction.currentEntitlements {
if case .verified(let transaction) = result {
if transaction.productID == "premium_monthly" {
userHasBeenSubscriber = true
}
}
}חלופה היא אימות בצד השרת באמצעות App Store Server API. השרת מחזיר product.subscription?.introductoryOffer והיסטוריה מלאה. זה אמין יותר אך מורכב יותר. כלל הזהב שלנו: החלטות UI בצד הלקוח, אימות זכאות בצד השרת. גישה זו מבטלת ניצול לרעה ושגיאות.
כיצד להטמיע הצעת היכרות: שלב אחר שלב
- צור את ההצעה ב-App Store Connect. ציין סוג, משך זמן ומחיר. בדוק את משך הזמן — עבור freeTrial הוא לא יכול להיות 0.
- טען את המוצר וקרא את ההצעה בקוד. השתמש ב-
// Проверяем статус подписки через Transaction for await result in Transaction.currentEntitlements { if case .verified(let transaction) = result { if transaction.productID == "premium_monthly" { userHasBeenSubscriber = true } } }ובדוק אתisInBillingRetryPeriod. - בדוק זכאות. באמצעות
Product.products(for:)או API של השרת. עבור iOS 15+, השתמש ב-introductoryOffer. - בנה את ממשק ה-paywall. הצג באנר עם תנאי ההצעה אם המשתמש זכאי.
- בדוק. השתמש בקובץ תצורת StoreKit ב-Xcode כדי לדמות תרחישים ללא המתנה של 24 שעות.
- תעד והעבר לתמיכה. ציין אילו הצעות פעילות וכיצד הן מוצגות.
שימוש ב-RevenueCat
RevenueCat מטפל בבדיקת הזכאות. הקוד הופך לפשוט יותר:
Purchases.shared.getOfferings { offerings, error in
if let intro = offerings?.current?.monthly?.product.introductoryDiscount {
Purchases.shared.checkTrialOrIntroductoryPriceEligibility(
productIdentifiers: ["premium_monthly"]
) { eligibilityDict in
let eligible = eligibilityDict["premium_monthly"]?.status == .eligible
}
}
}לפי הנתונים שלנו, מעבר ל-RevenueCat מקצר את זמן פיתוח לוגיקת המנויים פי 2–3 ומפחית שגיאות ב-70%. RevenueCat גם מטפל אוטומטית בשחזור רכישות והודעות.
הצגה בממשק ה-paywall
paywall טיפוסי מציג את ההצעה בתנאי:
struct PaywallView: View {
let product: Product
@State private var isEligibleForIntro = false
var body: some View {
VStack {
if let intro = product.subscription?.introductoryOffer, isEligibleForIntro {
IntroOfferBanner(offer: intro)
.transition(.opacity)
}
SubscriptionButton(product: product)
}
.task {
await checkEligibility()
}
}
func checkEligibility() async {
isEligibleForIntro = await checkIntroEligibility()
}
} השוואת שיטות בדיקת זכאות
| שיטה | מורכבות | אמינות | המלצה |
|---|---|---|---|
| StoreKit 2 (Transaction.currentEntitlements) | בינונית | גבוהה (iOS בלבד) | לאפליקציות פשוטות |
| App Store Server API | גבוהה | מקסימלית | לפרויקטים מורכבים |
| RevenueCat | נמוכה | גבוהה | פתרון אוניברסלי |
טעויות נפוצות בהגדרת הצעות היכרות
- משך freeTrial שגוי (לדוגמה, 0 ימים) — ההצעה לא תוחל.
- התעלמות מזכאות — ההצעה מוצגת לכולם, מה שגורם לשגיאות רכישה.
- חוסר בדיקות באמצעות קובץ תצורת StoreKit — דורש המתנה של 24 שעות לבדיקה חוזרת.
- התעלמות מגרסת iOS:
Transaction.currentEntitlementsזמין רק מ-iOS 15. עבור גרסאות ישנות יותר, השתמש ב-API של השרת או בספרייה כמו RevenueCat. - שכחת עדכון ה-paywall כאשר מצב המנוי משתנה (לדוגמה, לאחר שחזור).
מה כלול בעבודה
- קריאה והצגה של הצעת ההיכרות מאובייקט
eligibleForIntroOffer(StoreKit 2) - בדיקת זכאות באמצעות
Purchases.shared.getOfferings { offerings, error in if let intro = offerings?.current?.monthly?.product.introductoryDiscount { Purchases.shared.checkTrialOrIntroductoryPriceEligibility( productIdentifiers: ["premium_monthly"] ) { eligibilityDict in let eligible = eligibilityDict["premium_monthly"]?.status == .eligible } } }או אימות שרת - רכיב UI ל-paywall עם הצגת הצעה מותנית
- בדיקות באמצעות קובץ תצורת StoreKit ב-Xcode (sandbox ללא המתנה של 24 שעות)
- רישום אנליטיקה: הצגת הצעה, המרה, סוג הצעה
- תיעוד והעברת ידע לצוות שלך
לוחות זמנים ועלות
בין 3 ל-5 ימים בהתאם למורכבות ממשק ה-paywall ולזמינות אימות בצד השרת. העלות מחושבת באופן אישי לאחר ניתוח דרישות. צור קשר להערכה מדויקת. קבל ייעוץ בנושא הטמעת מנויים בפרויקט שלך.
יש לנו ניסיון של למעלה מ-5 שנים בפיתוח פתרונות מנויים ל-iOS ו-Android. המפתחים המוסמכים שלנו מבטיחים עמידה בהנחיות הביקורת של App Store.







