無料トライアルを提供することは、ユーザーにアプリのプレミアム機能を試用してもらい、有料会員になる可能性を高めるための優れた方法です。StoreKit 2 では、Apple は、ユーザーが入門オファーの対象かどうかを確認できる強化されたツールを導入しました。この記事では、アプリに無料トライアルを実装する方法と、ユーザーの対象を確認するためのコード スニペットについて説明します。また、対象ユーザーと対象外ユーザーの両方に対するテスト シナリオについても説明します。また、記事全体に散りばめられた「プロのヒント」にも注目してください。そこでは、私の経験から得た個人的な洞察を共有しています。
コーディングを始める前に、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() } } }
Apple は、 Xcode の StoreKit テストを使用して、さまざまなユーザー状態 (無料トライアルの対象か対象外かなど) をテストするための堅牢なツールを提供しています。
Xcode で、 「ファイル」>「新規」>「ファイル...」>「StoreKit 構成ファイル」に移動します。
試用期間や資格状態など、サブスクリプション製品を設定します。
プロのヒント: 新しい構成ファイルを作成して、App Store Connect から構成ファイルを同期することもできます。そうすれば、すべての製品をセットアップする必要がなくなります。
さまざまなシナリオをシミュレートする:
無料トライアルの対象:
無料トライアル ユーザーをシミュレートするには、トランザクション マネージャーにトランザクションがないことを確認してください。
トランザクションマネージャを確認するには、 「デバッグ」 → 「StoreKit」 → 「トランザクションの管理」に移動します。
無料トライアルの対象外:
無料トライアルの対象外のユーザーをシミュレートするには、トランザクション マネージャーのトランザクション マネージャーから手動でサブスクリプションを追加できます。トランザクション マネージャー画面で追加ボタンをタップし、追加するトランザクションを選択します。ここでは、ユーザーの月額サブスクリプションを構成しようとしています。そのトランザクションを追加してアプリを再度実行すると、トライアルの資格が false としてマークされているはずです。
プロのヒント:このフィールドを使用してユーザーの ID を保存し、購入に UUID を含めることもできます。これにより、どのユーザーがアプリで購入したかを確認できます。この情報は、後でユーザーの取引履歴から取得できます。
サンドボックステストでは、App Storeの実稼働環境を模倣した環境でアプリのアプリ内購入やサブスクリプションをテストできるほか、購入中断、ファミリー共有、アプリ外または別のデバイスでの購入のシミュレーションなど、いくつかのエッジケースを自由にモックアップできます。また、
しかし、その前に、サンドボックス テストを設定して使用する方法を説明します。
サンドボックステスターアカウントを作成します:
サンドボックステスターアカウントでサインインします:
サンドボックスモードでアプリを実行する:
さまざまなシナリオをテストする:
プロのヒント: Apple アカウントには複数のアクティブなサブスクリプションを設定できないため、2 人のユーザーが同じ 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/