StoreKit 2, uygulama içi satın almaları bir delegate labirentinden birkaç satırlık async Swift koduna dönüştürdü. Kendi uygulamalarımızda kullandığımız kurulum şu: küçük bir Store sınıfı, bir ödeme ekranı ve App Review'u memnun tutan birkaç kural.
1. Ürünleri oluşturun
App Store Connect'te bir abonelik grubu oluşturun ve planlarınızı ekleyin, örneğin aylık ve yıllık. Ürün kimliklerini not alın. Yerel test için Xcode'da aynı kimliklerle bir StoreKit Configuration File ekleyin ve scheme'inizde seçin. Böylece sandbox hesabı olmadan simülatörde satın alabilir, yenileyebilir ve iptal edebilirsiniz.
2. Tüm uygulama için tek bir Store
import StoreKit
@MainActor
final class Store: ObservableObject {
@Published private(set) var products: [Product] = []
@Published private(set) var isPro = false
private let ids = ["com.example.pro.monthly", "com.example.pro.yearly"]
private var updates: Task<Void, Never>?
init() {
// Renewals, refunds and purchases made on other devices arrive here.
updates = Task { [weak self] in
for await result in Transaction.updates {
await self?.handle(result)
}
}
Task {
await loadProducts()
await refreshEntitlements()
}
}
func loadProducts() async {
do {
products = try await Product.products(for: ids).sorted { $0.price < $1.price }
} catch {
print("Could not load products: \(error)")
}
}
func buy(_ product: Product) async throws {
switch try await product.purchase() {
case .success(let result):
await handle(result)
case .userCancelled, .pending:
break
@unknown default:
break
}
}
func restore() async {
try? await AppStore.sync()
await refreshEntitlements()
}
func refreshEntitlements() async {
var active = false
for await result in Transaction.currentEntitlements {
if case .verified(let transaction) = result, transaction.revocationDate == nil {
active = true
}
}
isPro = active
}
private func handle(_ result: VerificationResult<Transaction>) async {
guard case .verified(let transaction) = result else { return }
await transaction.finish()
await refreshEntitlements()
}
}
Bunu bir kez oluşturun, örneğin App içinde bir @StateObject olarak, ve .environmentObject ile aşağıya aktarın. Transaction.updates dinlemesini olabildiğince erken başlatın; aksi halde uygulama dışında tamamlanan satın almalar kaçabilir.
3. Doğrulama neden önemli?
Her işlem bir VerificationResult içinde gelir. StoreKit, Apple'ın imzasını cihazda kontrol eder; yani .verified satın almanın gerçek olduğu anlamına gelir. İçeriği yalnızca doğrulanmış işlemler için açın ve teslim ettikten sonra her zaman finish() çağırın.
4. Birkaç satırda bir ödeme ekranı
iOS 17 ve sonrasında SubscriptionStoreView, App Review dostu, eksiksiz bir ödeme ekranı sunar:
SubscriptionStoreView(groupID: "YOUR_GROUP_ID") {
VStack(spacing: 8) {
Text("Go Pro").font(.largeTitle.bold())
Text("Unlimited exports and every template.")
}
}
.storeButton(.visible, for: .restorePurchases)
Kendi ekranınızı tasarlarsanız her planın fiyatını ve dönemini product.displayPrice ile gösterin, kullanım koşulları ve gizlilik bağlantılarını ekleyin ve bir geri yükleme düğmesi koyun.
5. Ücretsiz deneme ve tanıtım teklifleri
Tanıtım tekliflerini App Store Connect'te ayarlayın. "Ücretsiz denemeyi başlat" düğmesini yalnızca kullanabilecek kişilere göstermek için önce uygunluğu kontrol edin:
let eligible = await product.subscription?.isEligibleForIntroOffer ?? false
6. App Review ödeme ekranında neye bakar?
- Fiyat ve faturalama dönemi satın almadan önce net
- Ücretsiz denemenin süresi ve sonrasında ne olacağı
- Çalışan bir satın almaları geri yükle düğmesi
- Kullanım koşulları ve gizlilik politikası bağlantıları
- Gizlenmiş kapatma düğmesi gibi yanıltıcı tasarımlar yok
Geri kalanı en sık App Store red sebepleri listemizde.
7. Gerektiğinde sunucu tarafı
Tek cihazlı bir uygulamada cihazdaki yetkiler yeterlidir. Kullanıcılar birden fazla platformda giriş yapıyorsa ya da gelir verisine ihtiyacınız varsa, sunucunuzun yenilemeleri ve iadeleri anında öğrenmesi için App Store Server Notifications V2 ekleyin.
Sık sorulan sorular
StoreKit 2 ile hâlâ makbuz doğrulaması gerekiyor mu?
Cihazda gerekmiyor; StoreKit 2 imzalı işlemleri sizin yerinize doğrular. Sunucu yalnızca yetkileri platformlar ya da hesaplar arasında paylaşıyorsanız gerekir.
Abonelikleri ödeme yapmadan nasıl test ederim?
Yerel testler için Xcode'da bir StoreKit Configuration File, uçtan uca testler için sandbox hesabı ya da TestFlight kullanın. Sandbox yenilemeleri hızlandırılmış bir takvimle çalışır.
StoreKit 2 için minimum iOS sürümü nedir?
StoreKit 2, iOS 15 ve sonrasında çalışır. SubscriptionStoreView ve diğer satış görünümleri iOS 17 gerektirir.
Apple aboneliklerden ne kadar komisyon alır?
Varsayılan olarak %30, Small Business Program üyeleri için %15 ve abonenin ilk yılından sonra abonelikte %15.