paint-brush
StoreKit 2 を使ってアプリに無料トライアルを実装する: ステップバイステップガイド@namaswic
260 測定値

StoreKit 2 を使ってアプリに無料トライアルを実装する: ステップバイステップガイド

Namaswi Chandarana11m2024/09/17
Read on Terminal Reader

長すぎる; 読むには

StoreKit 2 では、Apple は、ユーザーが初回特典の対象かどうかを確認できる強化されたツールを導入しました。この記事では、アプリに無料トライアルを実装する方法と、ユーザーの対象かどうかを確認するためのコード スニペットについて説明します。また、記事全体に散りばめられた「**プロのヒント**」にも注目してください。ここでは、私の経験から得た個人的な洞察を共有しています。
featured image - StoreKit 2 を使ってアプリに無料トライアルを実装する: ステップバイステップガイド
Namaswi Chandarana HackerNoon profile picture
0-item
1-item


無料トライアルを提供することは、ユーザーにアプリのプレミアム機能を試用してもらい、有料会員になる可能性を高めるための優れた方法です。StoreKit 2 では、Apple は、ユーザーが入門オファーの対象かどうかを確認できる強化されたツールを導入しました。この記事では、アプリに無料トライアルを実装する方法と、ユーザーの対象を確認するためのコード スニペットについて説明します。また、対象ユーザーと対象外ユーザーの両方に対するテスト シナリオについても説明します。また、記事全体に散りばめられた「プロのヒント」にも注目してください。そこでは、私の経験から得た個人的な洞察を共有しています。


App Store Connectでアプリの無料トライアルを設定する方法

コーディングを始める前に、App Store Connect でアプリ内購入の設定を必ず構成してください。

  1. App Store Connect にログインし、「マイアプリ」セクションに移動します。
  2. アプリを選択し、 「機能」タブに移動します。
  3. 「アプリ内購入」で、新しい自動更新サブスクリプション製品を作成します。
  4. 導入オファーを設定して、価格や無料試用期間(例: 7 日間) などのサブスクリプションの詳細を定義します。
  5. 変更を保存します。

サブスクリプション ビューを設定し、ユーザーが無料トライアルの対象かどうかを確認するにはどうすればよいでしょうか?

ユーザーのトライアル資格を計算するコードスニペットを示して、これを簡単に説明します。

無料トライアル オファーを表示し、ユーザー インタラクションを処理する 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() } } }

Xcode で無料トライアルの資格状態をテストする

Apple は、 Xcode の StoreKit テストを使用して、さまざまなユーザー状態 (無料トライアルの対象か対象外かなど) をテストするための堅牢なツールを提供しています。

  • StoreKit 構成ファイルを作成します。
    • Xcode で、 「ファイル」>「新規」>「ファイル...」>「StoreKit 構成ファイル」に移動します。

    • 試用期間や資格状態など、サブスクリプション製品を設定します。


  • プロのヒント: 新しい構成ファイルを作成して、App Store Connect から構成ファイルを同期することもできます。そうすれば、すべての製品をセットアップする必要がなくなります。


  • さまざまなシナリオをシミュレートする:

    • スキーム エディターの [オプション]で、StoreKit 構成ファイルを選択します。
    • StoreKit テスト環境でアプリを実行して、さまざまなシナリオをシミュレートします。
      • 無料トライアルの対象:

        無料トライアル ユーザーをシミュレートするには、トランザクション マネージャーにトランザクションがないことを確認してください。

        トランザクションマネージャを確認するには、 「デバッグ」「StoreKit」「トランザクションの管理」に移動します。


  • 無料トライアルの対象外:

    無料トライアルの対象外のユーザーをシミュレートするには、トランザクション マネージャーのトランザクション マネージャーから手動でサブスクリプションを追加できます。トランザクション マネージャー画面で追加ボタンをタップし、追加するトランザクションを選択します。ここでは、ユーザーの月額サブスクリプションを構成しようとしています。そのトランザクションを追加してアプリを再度実行すると、トライアルの資格が false としてマークされているはずです。


    プロのヒント:このフィールドを使用してユーザーの ID を保存し、購入に UUID を含めることもできます。これにより、どのユーザーがアプリで購入したかを確認できます。この情報は、後でユーザーの取引履歴から取得できます。

サンドボックステストを実行する

サンドボックステストでは、App Storeの実稼働環境を模倣した環境でアプリのアプリ内購入やサブスクリプションをテストできるほか、購入中断、ファミリー共有、アプリ外または別のデバイスでの購入のシミュレーションなど、いくつかのエッジケースを自由にモックアップできます。また、


しかし、その前に、サンドボックス テストを設定して使用する方法を説明します。

  1. サンドボックステスターアカウントを作成します:

    • 「App Store Connect」>「ユーザーとアクセス」>「サンドボックステスター」に移動します。
    • 一意の電子メール アドレス、パスワード、その他の必要な詳細を指定して、新しいサンドボックス テスター アカウントを作成します。
  2. サンドボックステスターアカウントでサインインします:

    • テストデバイスで、 「設定」>「App Store」>「サンドボックスアカウント」に移動します。
    • 作成したサンドボックス テスターの資格情報を使用してサインインします。
  3. サンドボックスモードでアプリを実行する:

    • 物理デバイス上でアプリをビルドして実行します (サンドボックス テストはシミュレータでは機能しません)。
    • サンドボックス テスター アカウントを使用して、無料トライアルを開始するか、購入を試みます。トランザクションはサンドボックス環境で進行し、無料トライアルの資格、購入の成功、キャンセル、その他の状態を含む完全なフローをテストできます。
  4. さまざまなシナリオをテストする:

    • 初めてのユーザー:初回購入時にサンドボックスアカウントを使用して、無料トライアルが正しく提供されていることを確認します。同じサンドボックスアカウントを QA の連続試行に使用するには、ユーザーの資格をリセットし、サンドボックスアカウントのすべてのトランザクションをクリアします。これは、App Store Connect または設定から行うことができます。
    • 購入のキャンセル:フロー中にユーザーが購入をキャンセルした場合にアプリがどのように処理するかをテストします。
    • ネットワーク障害:ネットワークを切断して再接続することでネットワークの問題をシミュレートし、失敗したトランザクションをアプリがどのように処理するかを確認します。
    • 無料トライアルの対象外:これは少し難しいですが、不可能ではありません。まず、「設定」→「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/