ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
StoreKitとアプリ内課金の新機能
App Storeのアプリ内課金システムを活用して、これまで以上に優れた購入体験を構築し提供する方法をご紹介します。サブスクリプションのカスタマイズを向上させる、StoreKitのビューコントロールの新しいスタイルと最新のAPIのデモを通じて、トランザクションレベルの情報を表示する新しいフィールドと、Xcodeの新しいテスト機能について解説します。また、StoreKitの重要な非推奨の機能についても確認します。
関連する章
- 0:00 - Introduction
- 0:36 - Core API enhancements
- 3:12 - Merchandise using SwiftUI
- 15:35 - Test in Xcode
- 21:06 - Update to StoreKit 2
リソース
- Forum: App Store Distribution & Marketing
- In-App Purchase
- Introducing StoreKit 2
- Message
- Original API for In-App Purchase
- Product.SubscriptionInfo.RenewalInfo
- Setting up StoreKit Testing in Xcode
- StoreKit views
- Testing in-app purchases with StoreKit transaction manager in Xcode
- Transaction properties
関連ビデオ
WWDC24
WWDC23
WWDC22
WWDC21
WWDC20
-
ダウンロード
こんにちは Rudyです 「What’s new in StoreKit and In-App Purchase」にようこそ 本セッションでは StoreKitの新機能をご紹介します また Xcodeでのテスト体験における 機能強化について説明し StoreKitの構成を使って 新機能をテストする方法をお教えします まず フレームワークの新しいコア機能を 確認します 次に マーチャンダイジングUIの 新しい構築方法をいくつかご紹介します アプリの動作を Xcode内でテストする方法も説明します
最後に アプリをアップデートして StoreKit 2を使用するメリットについて 説明します まず ユーザーの ユーザートランザクション履歴に関する アップデートの説明から始めましょう これまで トランザクション履歴APIには 自動更新サブスクリプション 非自動更新サブスクリプション 非消耗型製品 未完了の消耗型製品のトランザクションが 含まれていました つまり アプリを使用しているユーザーが 消耗型製品を購入した場合 消耗型製品の購入の 完了済みのトランザクションには これらのAPIからは アクセスできませんでした iOS 18以降では 完了済みの 消費型製品のトランザクションが トランザクション履歴の APIの対象になります
完了済みの消耗型製品の購入に対する 手動でのトラッキングが不要になり 完了済みかどうかに関わらず すべての消耗型製品のトランザクションを フレームワークがトラッキングします これは新しいオプトイン機能であり プロジェクトのinfo.plistファイルで 設定できます
消耗型製品の購入の完了済みの トランザクションの受信を開始するには 新しい SKIncludeConsumableInAppPurchaseHistory キーの値をtrueに設定します そのうえで 通常通り トランザクションをリッスンします
完了済みの消耗型製品の購入は App Store Server APIからも 取得できます また TransactionとRenewalInfoの データモデルへの 新しいフィールドの追加も行いました これにより提供されるのは アプリ内課金の トランザクションレベルの追加情報です Transactionの型の新しいフィールドの 1つ目はcurrencyです 名前の通り 購入時に使用された通貨を示します
これと共に追加された 2つ目の新しいフィールドはpriceです このフィールドに入力されるのは App Store Connectで設定した価格です
RenewalInfoモデルでは Transactionモデルのものに相当する 2つの新しいフィールドを追加しました 新しいフィールドの1つ目はcurrencyです 2つ目はrenewalPriceです renewalPriceは サブスクリプションの更新時に ユーザーに請求される金額です renewalPriceを解釈する際は 新しいcurrencyのメンバーから得られる コンテキストを考慮する必要があります これは重要な点です これらの新しいTransaction APIと renewalInfo APIは Xcode 16で アプリを構築する際に利用できます 古いバージョンのOSで アプリを実行する場合でも利用できます iOS 15以降であればOKです 古いバージョンのOSでの実行に 対応するアプリで これらのフィールドを 利用する方法については アプリ内課金のドキュメントを 参照してください 主要なAPIに今年導入された アップデートのうち 最後にご紹介するのは ウィンバックオファーという 新しい種類の サブスクリプションオファーです ウィンバックオファーは 解約した登録者に 再登録してもらうために利用できます この新しいオファータイプは 非常に簡単にアプリに統合できます App Store Connectから 利用資格をカスタマイズできる 新しいパワフルなツールがあるためです さらに StoreKit Message APIにより 追加のコードを必要とせずに オファーを販売できる点も便利です
ウィンバックオファーは App Storeで宣伝することもできます 例えば Editorialチームは やタブで ユーザーごとにパーソナライズされた おすすめのオファーを作成する際に ウィンバックオファーを宣伝できます ウィンバックオファーの詳細については WWDC24のセッション「Implement App Store Offers」をご覧ください では アプリ内課金を販売するための 新しい方法をいくつか見てみましょう 昨年のWWDC23で StoreKitビューの導入を発表して以来 デベロッパのみなさんが構築する アプリ内課金UIの素晴らしさに 常に驚嘆しています みなさんからのフィードバックを反映して サブスクリプションストアのビューを カスタマイズする 優れた方法を開発しました これらの優れた新機能を 披露するのに最適な方法は Apple推奨のストリーミングアプリである Destination Videoのサブスクリプションの アップセルを作成することです マーチャンダイジングUIのイテレーションを 高速化するために Xcodeプレビューを使用するので StoreKitの構成ファイルを 製品のメタデータで すでに設定しています これは アプリ内課金UIをXcodeプレビューと 連携させるうえで必須の手順です XcodeでStoreKitの構成ファイルを 設定する方法の詳細については WWDC22のセッション 「What’s new in StoreKit testing」と WWDC20のセッション「Introducing StoreKit Testing in Xcode」をご覧ください ここで作成するDestination Videoの サブスクリプションでは ユーザーは2つの サブスクリプション方法を選べます
プレミアムプランと より低料金のベーシックです
購入後は サブスクリプションの更新期間を 毎月か毎年の いずれかで選びます これらのプランを販売する サブスクリプションストアを Xcodeで作成する方法を説明します DestinationVideoShopというビューを すでに作成済みです これは サブスクリプションストアの 作成に使用します まず SubscriptionStoreViewを宣言し サブスクリプションの グループIDを指定します
この1行のコードだけでも 素晴らしいスタートですが ストアを適切な構造にして サービスの各レベルがユーザーに 分かりやすく表示されるようにしましょう これを実現するには プレミアムとベーシックの各サービスレベルの サブスクリプションオプショングループを 宣言します まず追加するのは サブスクリプションストア内での サブスクリプションオプショングループです
サブスクリプションオプショングループの 定義を どの製品が含まれるかを表す 条件を使用して行います 最初のグループは プレミアムプランの 両方のオプションのためのものなので 宣言する条件では サービスレベルがプレミアムの すべての製品を含むように指定します
サブスクリプションストアの 構築作業を容易にするために StreamingPassLevelという列挙型を 事前に作成しました これはプレミアムとベーシックのサービスの レベルをモデル化するために使います ストアが更新され プレミアムプランのみが 表示されるようになりました これは グループに対し宣言した 条件と一致しています
グループへのラベル追加もできます ここでは「Premium」にします
次に 2つ目のグループを宣言しますが ここからが面白い部分です さっそく宣言し ベーシックの オプションのためのグループを追加します
2つのグループを宣言したので サブスクリプションストアのビューでは タブビューが自動生成され ベーシックまたはプレミアムの 各プランが表示されるようになりました
新しい画面では サブスクリプションの 選択肢が分かりやすくなっています
SubscriptionStoreViewの 重要な機能の一つが カスタムの マーケティングコンテンツとして SwiftUIビューを提供可能にする機能です 通常は このビューを直接 SubscriptionStoreViewに提供しますが 階層構造を宣言しているので マーケティングコンテンツを グループに直接提供します
各サービスの価値の説明が表示されるように プレビューが更新されました
サブスクリプションオプショングループは どのグループがアクティブかによって 異なるマーケティングコンテンツビューを 提供できるため非常に便利です 使用方法を解説するために ベーシックの価値を説明する 修正版のビューを追加します
アクティブなタブを切り替えると マーケティングコンテンツは ベーシックの説明になります
個々のオプショングループの宣言は 表現力に優れています 宣言がUIの外観とよく似ているためです 今回のような構築では 一連の サブスクリプションオプショングループを 宣言することで 実装を効率化できます
次に StreamingPassLevelの値を 条件ではなく 各製品に対応させて指定します
グループセットは 最初のクロージャから返される それぞれ固有の値のグループを表します ここでは premiumとbasicに それぞれ1つずつグループが返されます
これにより マーケティングコンテンツの 宣言が容易になります マーケティングコンテンツビューに Streaming Passのレベルのみを渡すからです
Streaming Pass+は ユーザーに多くの価値をもたらすので マーケティングコンテンツは その価値を十分に伝えるものにすべきです
これで マーケティングコンテンツの 情報量が豊富になりました
しかし 画面表示の大部分を占有しています ストアの高さを抑えるために subscriptionStoreControlStyle モディファイアと コンパクトな新しいスタイルの ピッカーを使用します
サブスクリプションオプションのピッカーの 占有する表示スペースが大幅に減りました ほかのプランのオプションを さらに見つけやすくするために コントロールを 下部のバーに配置することもできます デフォルトでは 下部のバーにあるのは 登録のボタンのみです コントロールのスタイルは 非常にコンパクトなので スタイルのモディファイアに 配置パラメータ bottomBarを指定できます
サブスクリプションのオプションが常に 下部のバーに表示されるようになりました マーケティングコンテンツのサービス説明を 下にスクロールしても 常に表示されます
以上で説明したのが 新しいパワフルな Subscription Option Group APIと Subscription Option Group Setという 便利なAPIの使用法です ピッカーコントロールの 新しいコンパクトなスタイルと コントロール配置のためのAPIも ご紹介しました しかし StoreKitビューは今年 これ以外の点でも機能強化されています 注目の新機能が多数あります さっそく確認しましょう サブスクリプションオプショングループを 使用して ストアのコンテンツの構造を 宣言する方法を説明しました 先ほど構築したストアでは タブスタイルを使用して サブスクリプションオプションの グループを表示しました この方法はサブスクリプションプランの 各オプションの間に サービスレベルなど 明確な違いがある場合に最適です
タブは サブスクリプションオプションの グループを表示するスタイルの一つです StoreKitでのグループの表示方法は 選択するグループスタイルにより決まります 設定の際は モディファイアの subscriptionOptionGroupStyleを SubscriptionStoreViewに使用します ほかのスタイルも選択できます リンクスタイルも使用できます リンクは ユーザーに対し ナビゲーションコンテナ内で その他のプランオプションを 表示したい場合に最適です コンテナがない場合は ナビゲーションリンクをタップすると ほかのプランオプションが シートの形でストアに表示されます サブスクリプションオプショングループは サブスクリプションオプションを デベロッパが定義する階層へと 整理するための基本要素となります シンプルかつパワフルなAPIであり グループ内のサブグループや インライングループを作成できます
GroupSet APIも導入されました 1回の宣言で 複数のグループを作成できるAPIです また サブスクリプション期間に基づく グループ化などの 最も一般的なユースケースに利用できる 便利なAPIとして作成したのが SubscriptionPeriodGroupSetなどです
先ほど Destination Videoのストアを 構築する際に 配置のためのAPIの使用法を説明しました
この新しいAPIを使うと サブスクリプションのコントロールを サブスクリプションストア内の どこに配置するか選択できます
なお 一部のコントロールスタイルでは 使用できない配置もあります 特定の配置にしか互換性のない コントロールスタイルが存在するためです
安定的に利用できるAPIにするために 各コントロールスタイルで どの配置を利用できるかが はっきり確定しているAPIを設計しました
プラットフォームごとに デザインパターンが異なるため iOS 18以降および対応するリリースから 新しいレイアウトを使用可能にする プラットフォーム固有の配置を導入しました これを説明するために tvOS 18向けの開発をする際の コントロールスタイルのモディファイアを 詳しく見てみましょう tvOSでは コントロールに使用できる 唯一の標準スタイルは ボタンスタイルです
ただし このコントロールスタイルには 利用できる配置が複数あります 「.automatic」「.leading」 「.trailing」「.bottom」です 各配置の詳細を説明します まずは.leadingです tvOS 18で新たに導入された StoreKitビューの横方向のレイアウトでは サブスクリプションコントロールを placementの値で指定して 画面の端に配置します マーケティングコンテンツは コントロールの反対側の端に配置されます .leadingの配置を使用していますが .trailingの配置を使って 新しい横方向のレイアウトを 利用することもできます tvOS 18 SDKで構築されるアプリでは 配置の新しいデフォルト値は.trailingです マーケティングコンテンツの高さが コンパクトな垂直レイアウトに 適している場合は .bottomの配置を使用できます
Control Placement APIは 使い慣れた 既存のあらゆる コントロールスタイルで使用できます コントロールスタイルについては iOS 18の3つの 新しい標準スタイルをご紹介します それぞれ詳しく見てみましょう 1つ目は 先ほどご紹介した Compact Pickerスタイルです 多層の横方向のレイアウトを初めて採用した ピッカー型のコントロールスタイルです コンパクトなスタイルなので プラン間の明白な違いを 強調したい場合に最適です 例えば 各サブスクリプションプランの 期間が異なる一方 全プランのサービスレベルは同じという 場合などです
Compact Pickerスタイルは サブスクリプションの全オプションを 一度に画面に表示できるので サブスクリプションストアに 表示するオプションが 2〜3個の場合に最適です これにより ユーザーはストア内を スクロールする必要がありません
新しいスタイルの2つ目は Paged Pickerスタイルです Compact Pickerと同様に 横方向のレイアウトを採用しています 相違点は Compact Pickerが 2〜3個のプランを重ねて表示するのに対し Paged Pickerは 横方向のページごとの表示で プランについてより詳細に説明できます 3つ目は Paged Prominent Pickerスタイルです このスタイルは Paged Pickerスタイルによく似ていますが 選択中のサブスクリプションオプションに 明確な境界線と ズーム効果を適用します
これらの新しいスタイルは 垂直方向の スペース節約に優れた効果を発揮します 販売するサブスクリプションプランが少数で マーケティングコンテンツなど 他の重要な デザイン要素にストア内のスペースを 割り当てたい場合に有効です
これらのスタイルの追加により 選択肢となる標準スタイルの数が 3から6に増えました コントロールのスタイルは サブスクリプションストアの重要な要素です これらの新しい標準スタイルを 配置やグループ化のためのAPIと 組み合わせれば App Store上のアプリにおける アプリ内課金において 卓越した体験を創出できます サブスクリプションストアのデザインを さらにカスタマイズしたい場合は iOS 18から導入された 優れた機能があります 独自のカスタムコントロールスタイルを 作成する機能です
また カスタムスタイルを構築しやすいように StoreKitが使用しているのと同じ プリミティブを利用可能にしています 標準スタイルを作成する際に使われている 馴染みのあるものです では サブスクリプションストアを 一から構築して 独自のスタイルの実装が どれほど簡単かをお見せします
作成するのは ファミリー共有に 対応したプランに 特別なバッジが付く ピッカー型のレイアウトを採用した カスタムコントロールスタイルです
カスタムコントロールスタイル作成の 最初のステップは SubscriptionStoreControlStyle プロトコルに 適合する型を宣言することです このプロトコルに必須のメソッドはただ1つ makeBodyです
makeBody関数に渡される configurationの値には カスタムコントロールの作成に必要な すべての情報が含まれています このconfigurationの値は 新しい SubscriptionPicker APIで使用できます
SubscriptionPickerは 2つのクロージャを想定しています 1つ目のクロージャには 販売する 各サブスクリプションオプションを 表すために使用されるビューを返します この設定のために カスタムの SwiftUIビューを一から作成します
まず VStackと ピッカーオプションの表示名を追加します
先ほど作成したヘルパーメソッドを使用して 各オプションの ローカライズされた価格表示を追加します
次に ピッカーでファミリー共有が 有効になっているか確認します 有効である場合は ファミリー共有可能のバッジを追加します
次に サブスクリプションオプションの ローカライズされた説明文を追加します
どのオプションが選択されているかを 示すために このビューをHStackでラップして 選択インジケータを追加し ピッカーオプションが選択されている という情報を渡します
2つ目のクロージャには ユーザーが 選択したプランに サブスクリプション登録するための ビューを作成します 意味的には このビューはボタンです なぜなら ユーザーがビューを操作した時に 選択したオプションの購入が トリガーされるためです 1つ目のクロージャと同様に 独自の登録ボタンを作成するか 新しいSubscribeButton APIを使って クロージャに用意されている optionの引数を渡します
新しいカスタムコントロールスタイルを 使用するために 必要となるのは コントロールスタイルのモディファイアで サブスクリプションストアのビューを修正し カスタムコントロールスタイルの型の インスタンスを渡すことのみです SubscriptionStoreViewにより このように簡単に 独自のコントロールスタイルを実装できます カスタムコントロールスタイルは App Storeのデータフローなどの StoreKitのパワフルなインフラを 活用する優れた方法であると同時に アプリ内課金を通じて サブスクリプションストアでの販売で 創造性を存分に発揮できるようにします ここまで SubscriptionStoreViewの 新機能をご紹介しました 次に App Storeで提供されるアプリの テストをより容易にする Xcodeにおける テスト体験の強化について説明します XcodeのStoreKitテストは アプリ内課金の体験を 構築の早期段階から 継続的に最適化するための 最良の方法です
XcodeのStoreKitテストでは アプリが想定通りに動作するようになるまで App Store Connectでの 製品の構成を延期できます そのため 主要な機能の開発に 専念して アプリの独自性をより高めることができます 今年 Xcodeでアプリをテストする方法が 多数追加されました さっそく確認しましょう まずは StoreKitの構成に関する アップデートです Xcode 16の新機能として アプリのプライバシーポリシーと 使用許諾契約をローカルでテストできます この新しい設定は StoreKit構成ファイルエディタの 新しいセクションで 行います このオプションをクリックすると アプリのプライバシーポリシーと 使用許諾契約のエディタが開きます これらのフィールドに入力された値は ユーザーがボタンをタップすると アプリのサブスクリプションストアの ビューに表示されます
これもXcode 16の新機能ですが サブスクリプショングループの表示名の ローカリゼーションをテストできます この新しい設定は StoreKit構成エディタの に 移動して行います グループに含まれる サブスクリプションプランの下に という 新しいセクションがあります このセクションの下端にある ボタンをクリックすると エディタが開き ローカライズされた グループ表示名を追加できます
ウィンバックオファーのための 新しい構成方法も追加されています ウィンバックオファーを テスト構成に追加する方法は すでに馴染みのある ほかの サブスクリプションオファーと同様です StoreKit構成にオファーを追加する 方法については WWDC24のセッション「Implement App Store Offers」をご覧ください
次に アプリ内課金の画像を テストできるよう テスト構成でサポートを追加します この新しい設定は 新しいセクションの 製品エディタで行います StoreKitの構成で指定する画像は ローカルでのテストでのみ使用されるので 任意の画像を追加できます 画像がアプリでどう表示されるかテストする 最も簡単な方法は ProductViewか StoreViewを使って prefersPromotionalIconフラグを trueに設定する方法です
ProductViewの詳細は WWDC23の「Meet StoreKit for SwiftUI」をご覧ください StoreKit構成ファイルの もう1つのアップデートは という新しいセクションです
この設定では アプリ内課金に関連する システムダイアログの 有効/無効を切り替えられます
デフォルトでは システムダイアログは常に有効です システムダイアログを無効にすると アプリ内課金などにおいて ダイアログが表示される時は 常に 自動的に デフォルトのオプションが選択されます これが特に有用なのは UIの自動テストや手動テストを 実施する際に アプリにおけるアプリ内課金のロジックの デフォルトのフローのみを テストする場合です 次は Xcodeの トランザクションマネージャに関する アップデートをご紹介します トランザクションマネージャは アプリ内課金の テストとデバッグに不可欠です 様々なことができますが 例えば トランザクションの検査や Xcodeからインストールされる あらゆるアプリでの購入に関する 各種シミュレーションの実行や XcodeのStoreKitテストの利用が可能です また トランザクションマネージャは すべてのデバイスとシミュレータで 利用できます Xcodeを使用して トランザクションマネージャに導入予定の アップデートを確認しましょう Destination Videoを実行している シミュレータで トランザクションマネージャの新機能の デモを行います Xcode 15.2以降では Xcodeからアプリへ直接 購入インテントを送信できます
App Storeのおすすめ製品などに対し ユーザーがアプリ外で 購入プロセスを開始すると アプリは購入インテントを受信します
すると 購入データがアプリに送信され このデータを使用して 購入プロセスを完了できます
購入インテントを受信した時の アプリの動作をテストすることが重要です このテストを App Storeを経由せず 簡単に実行できるようになりました アプリ内課金のプロモーションや アプリへの購入インテントの実装について WWDC23の「What’s new in StoreKit 2 and StoreKit Testing in Xcode」で 詳細をご覧ください Destination Videoアプリで 購入インテントを リッスンするためのコードは すでに追加済みなので テストの方法を説明します アプリに購入インテントを送信するには まず トランザクションマネージャの ウインドウのフィルタバーの左側にある をクリックします アプリの構成済み製品のリストの下に 通常の購入と購入インテントの いずれかを選ぶ 新しいコントロールがあります
購入インテントを送信する製品を選び 購入のタイプを に設定し をクリックすると 購入インテントが テストデバイスに送信されます 受信した購入インテントを処理するために SwiftUIで すでにカスタムUIを構築しています 受信した購入インテントを 処理することを選択した場合 製品販売のためのUIを 独自に作成することもできます 作成しない場合 アプリの起動時に ペイメントシートが表示され ユーザーはそのシートで 購入フローを完了できます 以上が Xcodeで 購入インテントをテストする方法です iOS 18のもう1つの新機能として 請求の問題のメッセージを アプリ内で 直接テストできるようになりました 請求の問題により サブスクリプションを更新できない場合 問題を通知するメッセージが アプリに表示されます この場合 StoreKitは シートを使って問題を 解決するよう ユーザーに促します Xcodeでは トランザクションマネージャで このメッセージをテストできます iOS 18を搭載しているデバイスでは アプリに表示されるシートで サブスクリプションをキャンセルするか 問題を解決するか選べます 請求に関する問題をテストするには StoreKitの構成画面の の を有効にします
テストでは サブスクリプションの更新が試行されると トランザクションの横に このバッジが表示され 再請求が開始されたことを示します
シミュレータはすでに メッセージを受信しており 問題解決のためのシートが表示されています 解決のボタンをタップすると 請求の問題が修正され 更新対象の サブスクリプションが表示されます
以上が 請求の問題のメッセージを Xcode内でテストする方法です アプリ内課金のための従来のAPIを 引き続き使用している場合は 重要なお知らせがあります iOS 18以降 および対応するOSリリースでは アプリ内課金のための従来のAPIは 統合レシートを含め非推奨です 既存のアプリは引き続き動作しますが 従来のAPIには機能強化は適用できず 今後のOSリリースで追加される 新機能も利用できません 最適なアプリ内課金を提供するために 既存のアプリをアップデートし StoreKit 2を使用されることを 強く推奨します StoreKit 2は 従来のStoreKit APIに比べ 多くの点で機能が向上しています ユーザーのトランザクション履歴や サブスクリプション更新情報を いつでもアプリで確認できます フレームワークが自動的に 暗号化を検証します またStoreKit 2は Swift async/awaitなどの 最新の言語機能もサポートするため 商品のメタデータの取得 購入 ユーザーのトランザクション履歴の 取得などのタスクを実行できます
さらに Swiftの @backDeployed属性により StoreKit 2では 古いOSを搭載したデバイスに インストールしたアプリでも App Storeの最新機能を利用できます ほかにも StoreKit 2には アプリ内課金の処理を 大幅に容易にする 一連のツールが備わっています 今すぐアプリに導入できるAPIの 詳細については Apple Developer Webサイトの StoreKitのドキュメントをご確認ください 本セッションの内容は以上です 内容を簡単にまとめましょう アプリ内課金で最適な体験を 提供するための取り組みは StoreKit 2の導入から始まります サブスクリプションストアのビューに 導入された 各種の新機能を使えば アプリ内課金の販売が容易になります アプリ内課金のフローのテストには XcodeのStoreKitテストを お試しください 今回紹介した機能やその他の StoreKitの機能の詳細は 過去のセッションで確認できます 「Meet StoreKit 2」 「What’s new in StoreKit Testing」 「Meet StoreKit for SwiftUI」 をご覧ください みなさんがStoreKitで どのような体験を構築するか楽しみです ご視聴ありがとうございました
-
-
4:26 - Destination Video Shop
import StoreKit import SwiftUI struct DestinationVideoShop: View { var body: some View { SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { streamingPassLevel in StreamingPassMarketingContent(level: streamingPassLevel) StreamingPassFeatures(level: streamingPassLevel) } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) } }
-
9:06 - Subscription Option Groups - Tabs style
SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) .subscriptionStoreOptionGroupStyle(.tabs)
-
9:20 - Subscription Option Groups - Links style
SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) .subscriptionStoreOptionGroupStyle(.links)
-
13:41 - Custom control style implementation
import StoreKit import SwiftUI struct BadgedPickerControlStyle: SubscriptionStoreControlStyle { func makeBody(configuration: Configuration) -> some View { SubscriptionPicker(configuration) { pickerOption in HStack(alignment: .top) { VStack(alignment: .leading) { Text(pickerOption.displayName) .font(title2.bold()) Text(priceDisplay(for: pickerOption)) if pickerOption.isFamilyShareable { FamilyShareableBadge() } Text(pickerOption.description) } Spacer() SelectionIndicator(pickerOption.isSelected) } } confirmation: { option in SubscribeButton(option) } } } struct DestinationVideoShop: View { var body: some View { SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionPeriodGroupSet { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(BadgedPickerControlStyle()) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。