-
Appleアプリ内購入の新機能
より手頃な料金オプションをアピールして長期契約を確保できる、12か月契約の月払いサブスクリプションのメリットについて紹介します。この新しい決済オプションの設定とテストを、App Store Connect、StoreKit API、Xcodeによるテストなどを活用して実施する方法を学びましょう。さらに、オファーコード利用のためのAPIの改善点や、App Reviewへの提出時の体験の向上についても解説します。
関連する章
- 0:01 - Introduction
- 0:51 - Overview of monthly subscriptions with a 12-month commitment
- 1:42 - Set up in App Store Connect
- 2:28 - Merchandise with StoreKit
- 6:55 - Monitor subscriptions with App Store Server APIs
- 8:50 - Bundles and Suites
- 9:26 - Offer code redemption
- 10:35 - Enhanced submission experience
- 12:38 - Next steps
リソース
- In-App Purchase types
- Managing the life cycle of monthly subscriptions with a 12-month commitment
- Supporting monthly subscriptions with a 12-month commitment
- App Store Server Notifications V2
- Supporting offer codes in your app
- Implementing a store in your app using the StoreKit API
関連ビデオ
WWDC26
WWDC24
WWDC23
WWDC22
-
このビデオを検索
こんにちは Samです StoreKitチームのエンジニアです。 App Storeは安全で信頼性の高い マーケットプレイスを提供し 世界中の人々があなたのアプリを 見つけられます。 App Store APIを活用することで デジタルコンテンツやサービスを お客様に提供でき App Storeのコマースプラットフォームで 取引を円滑に処理します エンドツーエンドの決済処理も 実現できます。 このセッションでは製品の マーチャンダイジングに役立つ新機能を紹介し アプリビジネスの成長を サポートします。 まずサブスクリプション製品の 価格オプション拡張について紹介します 次にオファーコード引き換えAPIの 更新内容について説明します 最後にIn-App Purchaseに追加される App Store Connectの強化された申請 エクスペリエンスを確認します。 まずサブスクリプションの 価格設定の更新から始めます。 iOS 26.5では12ヶ月コミット付きの 月払いサブスクリプションが導入されました。 この新しい価格機能により 年間サブスクリプションの月払いオプションを お客様に提供できます。 請求プランは新規・既存の App Store Connectの1年間の 自動更新サブスクリプションに追加できます。 一括払いか月払いかをお客様に 選択してもらうことで より広いお客様層に アプローチでき 最適な請求プランを お客様自身が選べます。 26.5 SDKでアプリをコンパイルすると 対応市場のお客様が 新しい請求プランでサブスクライブできます iOS iPadOS macOS tvOS visionOS 26.4以降のデバイスで利用できます。 SKDemoアプリで新しい請求プランを 設定する方法をご紹介します。 このアプリはStoreKitを使って In-App Purchase製品を販売しています。 リソースからサンプルコードを ダウンロードして このセッションに沿って 試してみてください。 App Store ConnectでSKDemoアプリを 設定したところです セクションに 移動しました。 SKDemo+サブスクリプションの より手頃な選択肢を 提供したいと思います 1年間の期間を持つ製品を 選択します。 次に12ヶ月コミットの月払い 提供状況から を選択します。 手順に従って請求プランを設定します。 作成後は各請求プランタイプに サブスクリプションオファーを設定できます。 たとえば12ヶ月コミットで サブスクライブするお客様のみに 無料トライアルを追加しました。
App Store ConnectのSKDemoに 新しいサブスクリプション価格を設定したので StoreKitを使ってお客様に 新しい支払いオプションを提示できます。
PricingTermsはSubscriptionInfoの 新しいプロパティで 請求プランのマーチャンダイジングに 使用します。 PricingTerms配列には製品ごとに 利用可能な請求プランが一覧表示されます。 すべての自動更新サブスクリプションには この配列に少なくとも1つの請求プランが含まれ デフォルトの billingPlanTypeは.upFrontです。 SKDemo+に12ヶ月コミットの 月払いサブスクリプションを 設定したため PricingTerms配列に2番目の オブジェクトが返されます。 この請求プランは billingPlanTypeが.monthlyで 12ヶ月コミットの月払い サブスクリプションにのみ適用されます。 アプリで価格条件をマーチャンダイジングするには StoreKitビューを使用します。 StoreKitビューのAPIが App Storeから製品メタデータを 読み込みレイアウトを自動調整します ストアがすべてのプラットフォームで 自然に馴染むよう自動的に適応します。 コードでの実装方法をご紹介します。 新しいSwiftUIビューモディファイアを 追加することから始めます .preferredSubscriptionPricingTerms 既存のSubscriptionStoreViewに アタッチします。 .monthly .billingPlanTypeで .pricingTermsをフィルタリングします。 これでサブスクリプションストアが更新され 12ヶ月コミットの月払いサブスクリプションを マーチャンダイジングする準備が整いました。 SubscriptionStoreViewをさらに カスタマイズしたい場合は WWDC23の"Meet StoreKit for SwiftUI"をご覧ください StoreKitビューでアプリのスタイルを 合わせる方法と カスタムアイコンや背景など 様々な変更方法を学べます。 アプリのカスタムストアUIで コミットメントプランを表示するには Product APIで製品を取得します。 .monthly .billingPlanTypeで .pricingTermsをフィルタリングし monthlyとtotalCommitmentPriceを 取得してUIに表示します。 請求プランのメタデータは ストアフロントで利用可能な場合のみ 返されることに注意してください。
購入を行うには 新しい.billingPlanType購入オプションを渡し 結果を処理します。
お客様がコミットメントプランに 初めてサブスクライブする前に 開示シートに 新しいメッセージが表示されます。 App Storeがこのシートを 自動的に表示し Apple Accountごとに 1回表示されます。 シートにはコミットメント達成に 必要な支払い回数が記載され キャンセルに関する ガイダンスも含まれています。 サブスクリプションがアクティブな場合 App Storeはお客様向けの 新しいUIも自動的に提供します 12ヶ月コミットの月払い サブスクリプションを管理するための お客様はすべての利用可能な プランを確認でき 残りの支払い回数も 確認できます 請求コミットメントの 更新日も表示されます。 .manageSubscriptionsSheetを アプリ内から直接表示できます SwiftUIの.manageSubscriptionsSheet APIを使います。 UIKitではshowManageSubscriptions APIを呼び出します。
アプリでアクティブなサブスクリプション 情報を取得するには 請求プランのメタデータを提供する Transactionの新しいフィールドを使います。 .upfront billingPlanTypeの Transactionでは commitmentInfoはnilです。 .monthly billingPlanTypeの Transactionでは commitmentInfoで進捗が返され 12ヶ月コミットの価格と 有効期限も返されます。 最新のトランザクションから これらのフィールドを使って お客様のエンタイトルメントを確認したり コミットメントの進捗インジケーターを 独自に作成したりできます。 正確なexpirationDateを取得するには 必ず最新のトランザクションを使用してください。
同様にRenewalInfoから renewalBillingPlanTypeを取得したり commitmentInfoも取得して コミットメント全体の 更新情報を確認できます。 これらの新しいフィールドは OS 26.4以降で利用可能です。
新しい請求プランのマーチャンダイジングと コンテンツのアンロックのロジックを追加したら XcodeのStoreKit Testingで テストを開始できます。 Xcode 26.5からStoreKit設定ファイルを 開いて 1年間の自動更新サブスクリプションを 選択します。 次に新しい請求プランピッカーを使って 12ヶ月コミットの月払いを選択して 請求プランを作成します。 新しいフィールドが作成され 価格を設定できます 12ヶ月コミットの月払い サブスクリプション向けです。 App Store Connectと同様に Xcodeでも各請求プランタイプに 固有のオファーを作成できます。
設定後はトランザクションマネージャで 購入フローをテストし トランザクションインスペクタで commitmentInfoを確認します。
XcodeでのベストプラクティスとStoreKit Testingの設定については WWDC23の"What's new in Storekit 2 and Storekit Testing in Xcode"をご覧ください。 App Store Server APIまたは App Store Server Notifications V2を使用している場合 12ヶ月コミットの月払いで サブスクライブするお客様向けに 新しい機能を活用できます。 新しいフィールドが利用可能で 署名済みトランザクションと 更新情報オブジェクトに含まれています コミットメントプランに関する 追加情報を提供します。 サブスクリプション通知は 引き続き更新情報を提供し サブスクリプションの ライフサイクルを追跡します 12ヶ月コミット中の 月次更新などが含まれます。
Retention Messaging APIも この新しい支払いオプションに対応しています 自動更新サブスクリプション向けです。 WWDC26のセッション "Explore Retention Messaging in App Store Connect"をご覧ください このサーバー間APIがお客様の 維持戦略にどう役立つかを学べます。 サーバーからのトランザクション ペイロードの例を紹介します 12ヶ月コミットの 1請求期間購入のケースです。 このデコードされたJWSTransactionには 新しいフィールドが含まれています 先ほどStoreKitで説明したものと 対応しています。 これらのフィールドで 請求期間の購入を検出し コミットメント全体における 位置を把握できます。
署名済み更新情報オブジェクトにも 同様のフィールドがあり お客様の更新設定を反映しています 現在のコミットメント終了後の設定です。 したがってこれらのフィールドは 更新情報にのみ存在し サブスクリプションがコミットメント中の 場合のみ表示されます。 この例ではお客様が サブスクリプションを変更し コミットメント終了後に 別のBILLED_UPFRONTプランに 更新するよう設定しています。
更新の処理の詳細については 12ヶ月コミット中の その他のイベントへの対応も含め デベロッパ向けドキュメントをご覧ください "Managing the life cycle of monthly subscriptions with a 12-month commitment."
年間サブスクリプションの 新しい価格機能に加えて サブスクリプションの提供を拡大する もう1つの新機能をご紹介できます 大変うれしく思います。 BundlesとSuitesです。 サブスクリプションのBundlesとSuitesを 提供することは 複数のアプリにわたるサブスクリプションで お客様により多くの価値を提供する方法です。 BundlesとSuitesの違いを 確認しましょう。 Bundleは個別に購入できる サブスクリプションのグループで 1回の購入でまとめて購入でき より良い価格で提供されます すべてのサブスクリプションを 個別に購入するより安くなります。
SuiteはSuiteのコンテキスト内にのみ 存在するサブスクリプションのグループです。 これらは個別に購入できませんが まとめることで関連するアプリ群に サービスを提供します。 Xcode 27でBundlesとSuitesの APIのテストを開始できます このプログラムの詳細は 2026年後半に公開予定です。 次にオファーコードについてです。 オファーコードはコンシューマブルや 非コンシューマブルの 自動更新サブスクリプションや 非更新サブスクリプション製品に追加でき 特定の期間無料または割引の In-App Purchaseを お客様に提供できます。 App Store Connectでのオファーコード 設定については WWDC24の"Implement App Store Offers" をご覧ください。
お客様はアプリ内で直接 オファーコードを引き換えできます OfferCodeRedemption APIを使って シートを表示するときです。 購入の作成と同様にAPIは verificationResultを返すようになりました 引き換え完了時に返されます。 APIはコードの引き換えを設定する RedeemOption値のセットも受け入れます。 引き換えが成功した場合 verificationResultで トランザクションオブジェクトを受け取ります。 引き換えが失敗した場合 引き換えが失敗した理由を説明する エラーを受け取ります。 更新された引き換えAPIの UIKitバリアントも利用可能で presentOfferCodeRedeemSheetを 使用します。
Xcode 27でオファーコードの引き換えを テストできるようになりました 新しい引き換えAPIを使って すべての対応製品タイプで行えます。
App Storeへのアプリ申請の 準備ができたら 強化された申請エクスペリエンスを App Store ConnectのIn-App Purchaseで 活用できます。 複数の製品を審査アイテムとして グループ化する機能が含まれ 1回のApp Review申請に まとめられます。 In-App Purchase製品を他の 審査アイテムと組み合わせることができ アプリ内イベントや カスタムプロダクトページ プロダクトページの最適化も 含まれます。 申請後はApp Reviewのステータスを 確認でき すべての審査アイテムを 一元管理されたビューで確認できます。 これらの機能強化で申請ワークフローを 整理でき すべての審査アイテムタイプで 一貫した体験を実現し 申請プロセスを統合します。 App Store ConnectのSKDemoアプリを 使って 強化された申請フローの例を ご紹介します。 App ReviewへのIn-App Purchase製品の 申請準備ができたら ドロップダウンで 下書きの申請に追加できます。 その後申請内のすべての 審査アイテムを確認するには 進行中の下書きをクリックします。
多数の製品を申請に追加するには In-App Purchase製品の リストに移動して まとめて審査してもらいたい製品を それぞれ選択します。 をクリックし 進行中の申請を選択します。
App Store ConnectのWebサイトに加えて 強化された申請エクスペリエンスが App Store Connect APIにも導入されます。 reviewSubmissionsが拡張され In-App Purchaseとサブスクリプション サブスクリプショングループの リソースもサポートします。 reviewSubmissions API コレクションにより すべての審査アイテムのタスクを 単一インターフェースで自動化できます。
In-App Purchaseの既存リソースと サブスクリプション サブスクリプショングループは非推奨になる予定で reviewSubmissionと reviewSubmissionItemsリソースに移行します 今すぐ移行を始めましょう。
WWDC22の"What's New in App Store Connect"をご覧ください 審査アイテムの仕組みを 詳しく解説しています App Reviewへの申請についても 説明しています。 In-App Purchaseのこれらの新機能は より多くの手段を提供します お客様ベースを拡大し 素晴らしい価値を提供するための手段です。 最後に次のステップをご紹介します。 まず新しい請求プランを追加して 月払いサブスクリプションの柔軟性を お客様に提供しながら 長期コミットメントも確保します 年間サブスクリプション製品向けです。 アプリ全体のオファーコード引き換えの 呼び出し箇所を更新して 拡張された引き換えAPIを 活用してください。 Xcode 27とサンドボックスでこれらの 新機能のテストを今すぐ始めましょう。 準備ができたら更新した In-App Purchase製品を 強化されたApp Reviewエクスペリエンスで 申請してください。
ご参加いただきApple Developerコミュニティの 一員としてありがとうございます。 これらの機能がIn-App Purchaseを さらに多くの方々に届け より多くのユーザーに リーチできることを願っています 皆さんが人々に愛される 素晴らしいアプリやゲームの開発に集中できますように。
-
-
3:29 - Merchandise pricing terms with StoreKit views
// Merchandise pricing terms with StoreKit views import StoreKit import SwiftUI struct SubscriptionStore: View { var body: some View { SubscriptionStoreView(groupID: "3F19ED53") { // Custom marketing content } .preferredSubscriptionPricingTerms {_, subscriptionInfo in subscriptionInfo.pricingTerms.first { $0.billingPlanType == .monthly } } } } -
4:02 - Get subscription pricing terms and make a purchase
// Get subscription pricing terms and make a purchase import StoreKit var product: Product? // Fetch and assign product // Get the monthly billing plan's pricing terms for merchandising let pricingTerms = product?.subscription?.pricingTerms .first(where: {$0.billingPlanType == .monthly }) if let pricingTerms { let monthlyPrice = pricingTerms.billingDisplayPrice let totalCommitmentPrice = pricingTerms.commitmentInfo.price // Display both monthly and total commitment price to the customer } let result = try? await product?.purchase(options: [.billingPlanType(.monthly)]) switch result { // Verify the transaction, give the customer access to // the purchased content, and then finish the transaction } -
5:05 - Sheet to manage subscriptions by subscriptionGroupID
// Sheet to manage subscriptions by subscriptionGroupID import SwiftUI import StoreKit struct ManageSubscriptionsButton: View { let subscriptionGroupID: String @State var presentingManageSubscriptionsSheet: Bool = false var body: some View { Button("Manage Subscriptions") { presentingManageSubscriptionsSheet = true } .manageSubscriptionsSheet( isPresented: $presentingManageSubscriptionsSheet, subscriptionGroupID: subscriptionGroupID ) } } -
7:45 - JWSTransaction (decoded) for a monthly subscription with a 12-month commitment
// JWSTransaction (decoded) for a monthly subscription with a 12-month commitment { // … "expiresDate": 1783503660000, // for this billing period "price": 10990, // for this billing period "productId": "plus.pro.annual", "purchaseDate": 1780911660000, "type": "Auto-Renewable Subscription", "billingPlanType": "MONTHLY", "commitmentInfo": { "billingPeriodNumber": 1, "totalBillingPeriods": 12, "commitmentExpiresDate": 1812447660000, "commitmentPrice": 131880, } } -
7:59 - JWSRenewalInfo (decoded) for a monthly subscription with a 12-month commitment
// JWSRenewalInfo (decoded) for a monthly subscription with a 12-month commitment { // … "renewalBillingPlanType": "MONTHLY", "commitmentInfo": { "commitmentAutoRenewProductId": “plus.standard.annual”, "commitmentAutoRenewStatus": 0, "commitmentRenewalDate": 1812447660000, "commitmentRenewalPrice": 10990, "commitmentRenewalBillingPlanType": "BILLED_UPFRONT" } } -
9:58 - Sheet to redeem an offer code
// Sheet to redeem an offer code struct OfferCodeRedemption: View { @State var presentingOfferCodeSheet: Bool = false var body: some View { Button("Redeem Offer Code") { presentingOfferCodeSheet = true } .offerCodeRedemption(options: [], isPresented: $presentingOfferCodeSheet) {result in switch result { case .success(let verificationResult): switch verificationResult { // Verify the transaction, give the customer access to // the purchased content, and then finish the transaction } case .failure(let error): // Handle error } } } }
-
-
- 0:01 - Introduction
Learn how to merchandise products and grow your business with expanded subscription pricing options, updates to the offer code redemption API, and an enhanced App Store Connect submission experience.
- 0:51 - Overview of monthly subscriptions with a 12-month commitment
Monthly subscriptions with a 12-month commitment is a new pricing option that lets customers pay monthly for an annual subscription; can be added to new or existing one-year subscriptions in App Store Connect to reach a wider customer base.
- 1:42 - Set up in App Store Connect
Configure monthly subscriptions with a 12-month commitment in App Store Connect. Set up pricing, offers, and availability.
- 2:28 - Merchandise with StoreKit
Learn how SKDemo merchandises monthly subscriptions with a 12-month commitment using StoreKit and learn how to test with StoreKit Testing in Xcode.
- 6:55 - Monitor subscriptions with App Store Server APIs
New fields in App Store Server APIs to manage the subscription lifecycle of monthly subscriptions with a 12-month commitment.
- 8:50 - Bundles and Suites
Offering subscription Bundles and Suites is another way to provide customers with more value in their subscriptions across apps.
- 9:26 - Offer code redemption
The offer code redemption API is extended to take in a set of RedeemOption values and returns a VerificationResult.
- 10:35 - Enhanced submission experience
When you’re ready to submit an app to the App Store, you can utilize our enhanced submission experience for In-App Purchases in App Store Connect.
- 12:38 - Next steps
Utilize the new features; adopt the expanded subscription pricing, update offer code redemption call sites, test in Xcode 27 and sandbox, and submit through the enhanced App Review experience.