خرید درون برنامه ای (In-App Purchases)
خرید درون برنامه ای یعنی پرداخت داخل اپ. با StoreKit 2 محصولات را می گیریم، خرید می کنیم و تراکنش را تأیید می کنیم. مثل خرید سکه در بازی است، اما با قوانین اپ استور.
انواع محصول در IAP
- مصرف شدنی (Consumable): چندبار قابل خرید، مثل سکه.
- غیرمصرفی (Non-Consumable): یک بار باز می شود، مثل نسخه پریمیوم.
- اشتراک خودکار (Auto-Renewable): دسترسی دوره ای.
پایه های StoreKit 2
با StoreKit 2 محصولات را می گیری، خرید می کنی، سپس تراکنش امضا شده را تأیید می کنی و در پایان finish() می زنی.
نمونه: انجام خرید
import StoreKit
@MainActor
func buy(productID: String) async throws {
let products = try await Product.products(for: [productID])
guard let product = products.first else {
return
}
let result = try await product.purchase()
switch result {
case .success(let verification):
let transaction = try verification.payloadValue
// unlock content
await transaction.finish()
default:
break
}
}
گرفتن فهرست محصولات
محصولات را یک بار بگیر و برای فروشگاه نگه دار. سپس مرتب نشان بده.
نمونه: واکشی و مرتب سازی
import StoreKit
@MainActor
func loadProducts(ids: [String]) async throws -> [Product] {
let products = try await Product.products(for: ids)
return products.sorted { $0.displayName < $1.displayName }
}
جریان خرید و نتایج
همه وضعیت ها را مدیریت کن. همیشه قبلِ بازکردن محتوا، تأیید کن.
نمونه: مدیریت نتایج خرید
import StoreKit
@MainActor
func purchase(_ product: Product) async {
do {
let result = try await product.purchase()
switch result {
case .success(let verification):
let transaction = try verification.payloadValue
// unlock content guarded by transaction.productID
await transaction.finish()
case .userCancelled:
// restore UI state
break
case .pending:
// approval pending
break
@unknown default:
break
}
} catch {
// handle errors
}
}
گوش دادن به به روزرسانی تراکنش
خریدهای بیرون از UI اپ هم می آیند. باید پردازش و تمام شوند.
نمونه: شنونده تراکنش
import StoreKit
func startTransactionListener() {
Task.detached {
for await update in Transaction.updates {
do {
let transaction = try update.payloadValue
// update entitlements
await transaction.finish()
} catch {
// verification failed
}
}
}
}
بازیابی خریدها
برای غیرمصرفی ها و اشتراک ها، حقوق فعلی را بخوان و فعال کن.
نمونه: بازیابی حقوق
import StoreKit
@MainActor
func restore() async {
for await result in Transaction.currentEntitlements {
if let transaction = try? result.payloadValue {
// re-unlock by transaction.productID
}
}
}
نکته: IAP را در App Store Connect پیکربندی کن و با Sandbox تست کن. برای بازشدن حساس، از اعتبارسنجی سمت سرور استفاده کن.
گام های عملی سریع
- 1) محصولات را در Connect بساز.
- 2) با StoreKit 2 محصولات را بگیر.
- 3) خرید را اجرا و تأیید کن.
- 4) محتوا را باز و تراکنش را تمام کن.
- 5) بازیابی و به روزرسانی ها را پشتیبانی کن.
جمع بندی سریع
- StoreKit 2 خرید را ساده می کند.
- قبل از بازکردن، تأیید ضروری است.
- به روزرسانی ها را همیشه گوش بده.
- Sandbox برای تست ضروری است.
مطالب مرتبط: حریم خصوصی اپ، دسترس پذیری، بومی سازی.