הצעת ניסיון חינם היא דרך מצוינת לעודד משתמשים לנסות את תכונות הפרימיום של האפליקציה שלך, ולהגדיל את הסיכויים להמיר אותם למנויים משלמים. עם StoreKit 2, אפל הציגה כלים משופרים שיעזרו לך לבדוק את זכאותו של משתמש להצעות היכרות. במאמר זה, נדריך אותך דרך הטמעת ניסויים בחינם באפליקציה שלך, עם קטעי קוד כדי לאמת את זכאות המשתמש. נסקור גם תרחישי בדיקה עבור משתמשים כשירים וגם לא כשירים. והקפידו לשים עין על " טיפים למקצוענים " הפזורים לאורך המאמר, שם אני חולק כמה תובנות אישיות מניסיוני!
לפני שתתחיל בקידוד, הקפד להגדיר את הגדרות הרכישה בתוך האפליקציה ב-App Store Connect:
אני אעשה את זה פשוט על ידי הצגת קטע הקוד, לאופן שבו אתה רוצה לחשב את זכאות הניסיון עבור המשתמש
צור תצוגת SwiftUI כדי להציג את הצעת הניסיון בחינם ולטפל באינטראקציות של משתמשים. אני אשאיר הרבה הערות בקטע הקוד כדי להדריך אותך.
import StoreKit2 // StoreManager is responsible to communicate with Storekit Framework provided by Apple for monetization class StoreManager: ObservableObject { @Published var message: String = "" // We will use this property to display the right message to the user @Published var products: [Product] = [] // This will be responsible to store the products fetched that we defined // in App Store Connect // Fetch products from the App Store func fetchProducts() { Task { do { // product_id is the id that you would have defined in App Store Connect. let storeProducts = try await Product.products(for: ["product_id"]) products = storeProducts } catch { message = "Failed to fetch products: \(error.localizedDescription)" } } } // Initiate purchase func purchase() { guard let product = products.first else { // There is a possibility of products not being fetched from App Store Connect. // Pro Tip: From experience, even though we defined the products on App Store Connect, it is possible // that the products are not found post attempting to fetch. So, it is important to handle this case. message = "No product available." return } Task { do { let result = try await product.purchase() switch result { case .success(let verification): switch verification { case .verified: message = "Purchase successful!" case .unverified: message = "Could not verify the purchase." } case .userCancelled: message = "Purchase cancelled." case .pending: message = "Purchase is pending." @unknown default: message = "Unknown result." } } catch { message = "Purchase failed: \(error.localizedDescription)" } } } // Check if the user is eligible for a free trial func checkTrialEligibility() async -> Bool { guard let product = products.first else { return false } do { // So when you define a auto renewable subscriptions, there are usually bond in a group. The group can again be // found in App Store Connect let eligibility = try await product.subscription?.isEligibleForIntroOffer(for groupID: 111111) return eligibility ?? false } catch { message = "Error checking trial eligibility: \(error.localizedDescription)" return false } } }
import SwiftUI import StoreKit struct SubscriptionView: View { @StateObject private var storeManager = StoreManager() @State private var isEligibleForFreeTrial = false var body: some View { VStack { Text("Unlock Premium Features") .font(.title) .padding() Text("Get a 7-day free trial of our premium subscription.") .multilineTextAlignment(.center) .padding() Button(action: { storeManager.purchase() }) { // Based on user status, we can display the text Text(isEligibleForFreeTrial ? "Start Free Trial" : "Start Subscription") .bold() .frame(width: 200, height: 50) .background(Color.blue) .foregroundColor(.white) .cornerRadius(10) } Text(storeManager.message) .padding() } .onAppear { storeManager.fetchProducts() checkTrialEligibility() } } private func checkTrialEligibility() { Task { isEligibleForFreeTrial = await storeManager.checkTrialEligibility() } } }
אפל מספקת כלים חזקים לבדיקת מצבי משתמש שונים (למשל, כשיר או לא כשיר לגרסת ניסיון בחינם) באמצעות StoreKit Testing ב-Xcode :
עבור אל קובץ > חדש > קובץ... > קובץ תצורה של StoreKit ב-Xcode.
הגדר את מוצרי המנוי שלך, כולל תקופות ניסיון ומצבי זכאות.
טיפ מקצוען : אתה יכול גם ליצור קובץ תצורה חדש לסנכרון קובץ תצורה מ-App Store Connect וככה לא צריך להגדיר את כל המוצרים.
הדמיית תרחישים שונים:
זכאי לניסיון חינם:
כדי לדמות משתמש בגרסת ניסיון בחינם, ודא שאין עסקאות במנהל העסקאות.
לראות את מנהל העסקאות. עבור אל ניפוי באגים ← StoreKit ← ניהול עסקאות
לא זכאי לניסיון חינם:
כדי לדמות משתמש שאינו כשיר לתקופת ניסיון בחינם. אתה יכול להוסיף מנוי באופן ידני ממנהל העסקאות במנהל העסקאות. אתה יכול להקיש על כפתור ההוספה במסך מנהל העסקאות ולאחר מכן לבחור את העסקה שברצונך להוסיף. כאן, אני מנסה להגדיר מנוי חודשי עבור המשתמש. לאחר הוספת העסקה והפעלת האפליקציה שוב, אתה אמור לראות את זכאות הניסיון מסומנת כשקרית.
טיפ מקצוען: אתה יכול גם לכלול UUID עם הרכישה, באמצעות שדה זה לאחסון מזהה המשתמש. כך תוכלו לוודא איזה משתמש ביצע את הרכישה באפליקציה שלכם. מאוחר יותר ניתן לאחזר מידע זה מהיסטוריית העסקאות של המשתמש.
בדיקת ארגז חול מאפשרת לך לבדוק את הרכישות וההרשמות של האפליקציה שלך בתוך האפליקציה בסביבה המחקה את סביבת הייצור של App Store ובמקביל נותנת לך את החופש ללעוג לכמה מקרי קצה כמו רכישה מופרעת, שיתוף משפחתי והדמיית רכישות שבוצעו מחוץ ל-App Store. אפליקציה או במכשיר אחר. זה גם מאפשר לך
אבל לפני הכל, הנה איך להגדיר ולהשתמש בבדיקת ארגז חול:
צור חשבון בודק ארגז חול:
היכנס עם חשבון הבודק של ארגז חול:
הפעל את האפליקציה שלך במצב ארגז חול:
בדוק תרחישים שונים:
טיפ מקצוען: לחשבון אפל לא יהיו מנויים פעילים מרובים, כך ששני משתמשים שונים לא יכולים לבצע רכישות נפרדות באפליקציה באמצעות אותו Apple ID. הקפד לבדוק את האפליקציה שלך עבור מקרה משתמש זה.
https://developer.apple.com/documentation/storekit
https://developer.apple.com/documentation/xcode/setting-up-storekit-testing-in-xcode/
https://developer.apple.com/app-store-connect/