ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
App Storeのオファーの実装
App Store Connect、および最新のStoreKitの機能とAPIを使用して、App Storeでのオファーに対するユーザーの関心を高める方法を学びましょう。ウィンバックオファー(以前のサブスクリプション登録者に再登録を促すための新しい方法)を設定し、Macアプリ用のオファーコードを生成する方法を説明します。SandboxとXcodeでオファーをテストし、スムーズな動作を確認する方法もご紹介します。
関連する章
- 0:00 - Introduction
- 1:32 - Updates to offers
- 4:37 - Introducing win-back offers
- 7:10 - Configure win-back offers
- 16:50 - Support win-back offers
- 28:44 - Streamlined purchasing
リソース
- Forum: App Store Distribution & Marketing
- Generating a signature for promotional offers
- Merchandising win-back offers in your app
- Message
- offer
- PurchaseIntent
- Setting up StoreKit Testing in Xcode
- StoreKit views
- Submit feedback
- Supporting subscription offer codes in your app
- Supporting win-back offers in your app
- Testing win-back offers in the sandbox environment
- Testing win-back offers in Xcode
関連ビデオ
WWDC24
WWDC23
-
ダウンロード
「App Storeのオファーの実装」へ ようこそ App Store Connectのエンジニアの Xiaolanです こんにちは Rickyです StoreKitチームのエンジニアです 今日は App Storeのオファーに追加された 素晴らしい新機能と それらの機能を使用して ユーザーを引き付ける方法を紹介します 最初に App Storeのオファーについて 簡単にまとめましょう サブスクリプションベースのビジネスにおいて ユーザーを維持することは 長期的に成功する上で非常に重要です App Storeのオファーは ユーザーを獲得して維持し 解約したユーザーを呼び戻すための 優れた方法です App Storeのオファーでは 対象となるユーザーに 無料または割引価格のサブスクリプションを 期間限定で提供することができます
App Storeには 3種類のオファーがあります お試しオファー プロモーションオファー そしてオファーコードです
お試しオファーを設定すると 新規登録者は 無料トライアルや割引価格を利用して サブスクリプションを 試せるようになります
プロモーションオファーはより柔軟です ビジネス要件に基づいて ユニークな割引を作成したり 独自の利用資格を定義できます オファーコードでは App Storeにより生成される 1回限りの固有のコードを使用するか 独自のカスタムコードを作成して 独自のマーケティングチャネルを通じて それらを配布できます サブスクリプションオファーのStoreKit API には多くの機能強化がなされています TransactionやRenewalInfoに 新しくofferメンバーが追加され 新たにmacOSがオファーコードに 対応するようになりました StoreKitには アプリでオファーを簡単に サポートできるようにするための 重要なAPIが含まれていますが それらのAPIをさらに強化する いくつかの改善点について紹介します
まず StoreKitと App Store Server APIの両方で TransactionとRenewalInfo APIの 機能を強化しました Transaction構造は アプリでユーザーが行う購入を 理解する上で重要です RenewalInfo構造では 将来のサブスクリプションステータスが わかります
Transactionの「offer」と呼ばれる 新しいタイプの新しいメンバーには オファーに関連するすべての情報が 含まれています オファーのID タイプ paymentModeなどです paymentModeは オファーが「無料トライアル」か 「都度払い」か それとも 「前払い」かを示します
offerメンバーはオプションです StoreKitは 顧客がサブスクリプションを購入する際に オファーを利用した場合にのみ offerをトランザクションに含めます
この新しいAPIは iOS 17.2以降の StoreKitで利用できます offerメンバーは iOS 18.0以降の RenewalInfo APIで利用できます サブスクリプションの次回の更新期間に オファーが適用された場合は StoreKitがそれを設定します
App Store Server APIを 使用している場合 JWSTransactionと JWSRenewalInfo APIにある 3つのフィールドで 同じオファーデータを利用できます
このフィールドのうち offerIdentifierとofferTypeは 現在すでに導入されています これに加えて 履歴トランザクションにも利用可能な offerDiscountTypeフィールドが 新たに追加されました
offerDiscountTypeの値は StoreKit APIの paymentModeに似ており オファーが「無料トライアル」か 「都度払い」か それとも 「前払い」かを示します
App Store Server APIについて 詳しくは 「Explore App Store server APIs for In-App Purchase」をご覧ください
次に アプリでStoreKitビューを使用して サブスクリプションを販売している場合 プロモーションオファーを SubscriptionStoreViewのUIに 表示することができる 新しいビューモディファイアが 用意されています
subscriptionPromotionalOffer というビューモディファイアです
この新しいビューモディファイアを使用して ビューにプロモーションオファーを 表示するかどうかを決定できます
StoreKitにより このプロダクトのプロモーションオファーの リストが生成されるため ロジックでどのオファーを返すかの 判断に集中できます
次に 選択したオファーに 署名を生成し それを返します StoreKitにより UIに詳細が表示され ユーザーがサブスクリプションを登録すると 購入にオファーが追加されます
このセッションの関連ドキュメントで プロモーションオファーのサポートと 署名の生成について ご確認ください
最後に iOSやvisionOSと同様に macOS 15.0でも オファーコード利用シートを 提示できるようになりました
SwiftUIアプリでは iOSと同じAPIを使用して オファーコード利用シートを提示できます
既存のサブスクリプションオファーの 新しいStoreKit APIについて紹介しました 今年登場した新しいオファータイプは 以前の登録者を再獲得するためのものです 過去にアプリの登録者だったユーザーに 簡単にリーチできる
ウィンバックオファーについて 紹介します App Storeにより提供される ユーザーの利用資格に基づいて ウィンバックオファーを設定できます また App Storeが所有する チャネルを利用して ウィンバックオファーを プロモーションできます ウィンバックオファーでは 期限切れや自動更新の無効化によって サブスクリプションを解約したユーザーを 呼び戻すことに重点が置かれています
ユーザーが対象であるかどうかの 処理と検証をアプリで行う代わりに ウィンバックではApp Storeを介して 特定のルールや基準に基づき ユーザーをセグメント化できます ユーザーとの関連性が高い新しいオファーを 効果的に作成できます
既存のオファーと同様に ウィンバックオファーも 独自のマーケティングチャネルで プロモーションできます
ウィンバックオファーは自動的に サブスクリプションページに表示され App Storeでウィンバックオファーを プロモーションできます これはその一例です 新しいウィンバックオファーが App Storeにカードで提示されています ウィンバックオファーカードには オファーの説明に加えて 価格の詳細と オファーが適用される サブスクリプションの情報が含まれています
ユーザーはプロダクトページで ウィンバックオファーを確認できます プロダクトページには App Storeにより 対象となっているオファーが表示されます
ユーザーがオファーカードをタップすると 詳しい説明と 大きな画像が掲載された 詳細ページが表示されます ユーザーは詳細ページで オファーの追加情報を確認できます
エディターチームが タブで ユーザー向けにパーソナライズされた おすすめを作成するときに ウィンバックオファーを 紹介することがあります
ユーザーはサブスクリプションページでも 対象となっているウィンバックオファーを 見つけることができます 今日は ウィンバックオファーについて 詳しく説明し App Store Connectでの設定方法を 見ていきます そのあと アプリでウィンバックオファーを サポートしてテストする方法を Rickyに例を使って紹介してもらいます 最後に ストリームライン購入機能と それをアプリでサポートする方法を 紹介します
最初に ウィンバックオファーについて 詳しく見ていきましょう これまでのオファーと同じように ウィンバックオファーを作成する時は 都度払い 前払い または 無料トライアルのいずれかを選択します 様々なタイプと サブスクリプションに基づいて 異なる期間をオファーに選択できます ウィンバックオファーをユーザーに 提供するタイミングを制御することができ オファーの終了日を指定することもできます オファーの優先度の設定では 通常の優先イベントや優先オファーの前に このオファーを表示するかどうかを 指定できます これは ウィンバックのおすすめを App Storeでパーソナライズする際に 使用される要素の1つでもあります さらに このオファーを提供する 特定の国と地域を 決定することができます App Store Connect 価格設定ツールを利用して 選択したそれぞれの国や地域の 価格を設定することができます
ウィンバックオファーでは 有料サブスクリプション期間 最後のサブスクリプション登録後の 経過時間 オファー間の待ち時間など 様々なユーザー利用資格がサポートされます
有料サブスクリプション期間とは ユーザーがサービスに対して 料金を支払った期間の長さのことです これにより ユーザーの登録期間の長さに応じて 割引を提供することができます
月単位で最小値を指定できます
直近の連続した有料サービスの 登録月数のみが考慮されます
ユーザーがグループ内の いずれかのサブスクリプションに 登録した期間もこれに含まれます 同じサブスクリプショングループでの アップグレードとダウングレードは 利用資格の計算には影響しません
最後のサブスクリプション登録後の 経過時間とは 直近のアクティブなサブスクリプションから どれくらい時間が経過したかを示しています 月単位で最小値と 最大値を指定する必要があります これにより 解約したユーザーを呼び戻すための 様々な戦略を 以前の登録から経過した期間の長さに応じて 適用できます
例を使って詳しく説明しましょう Destination Videoアプリには 「Streaming Pass」という サブスクリプショングループがあり BasicとPremiumの 2つの月額プランがあります
このウィンバックオファーでは 対象ユーザーがBasicサブスクリプションを 1か月間無料で利用できます ユーザーがこのオファーの対象となる 利用資格は サブスクリプションに対して 少なくとも3か月間 料金を支払っていること サブスクリプションがアクティブだったのが 2か月前から24か月前の間であることです また このオファーを 最後に利用したときから 6か月以上が経過している必要があります
ユーザーの視点から見てみましょう 最初 ユーザーはPremiumプランの サブスクリプションに登録しましたが
Basicプランにダウングレードし
最終的には 2か月後に サブスクリプションを解約しました この時点で ユーザーは このウィンバックオファーの 有料サブスクリプション期間の 利用資格を満たしています
この解約を起点として 最後の登録後の経過時間が計算されます
最小経過時間を2か月に設定しているため 2か月経過すると ユーザーは ウィンバックオファーの対象となります
オファー間の待ち時間は どうでしょうか これはオプションの要件ですが ユーザーがオファーを 再度利用できるようになるまで 待たなければならない 最小期間を設定することができます
ウィンバックオファー期間の終了後に この待ち時間が始まります
ユーザーはサブスクリプションを更新し
その3か月後にサブスクリプションを 解約しました
最後の登録後の経過時間は この解約を起点として計算されます
解約から2か月後に ユーザーは経過時間の要件を満たします しかし ユーザーが以前にオファーを 利用したことがあるため オファー間の待ち時間として少なくとも 6か月間待つ必要があります オファーが終了してから6か月経過すると ウィンバックオファーの対象となります
ウィンバックオファーの概要と ユーザー利用資格の仕組みについて 説明しました 次に App Store Connectで ウィンバックオファーを設定してみましょう
既存のサブスクリプションに ウィンバックオファーを作成するには まず サブスクリプション価格ページに 移動します
という名前の 新しいタブがあります このタブを初めてクリックする場合 このような画面が表示されます ボタンをクリックして 新しいウィンバックオファーの設定が始まり モーダルビューが表示されます 最初に オファーの参照名とオファーIDを 入力します いずれのフィールドもサブスクリプション グループ内で一意である必要があります アプリはオファーIDを使用して StoreKit APIとやり取りします これらのフィールドは 作成後に変更することはできません 開発作業を簡単にするために オファーに一貫した命名規則を 使うようにしましょう 次に 開始日と終了日を選択します そして オファーの優先度を選択し ユーザーの利用資格を定義します
開始日はオファーをApp Storeに 公開するために必須です
オファーの優先度は いつでも調整できます 最後に 利用資格を指定し それに基づいてユーザーを いつオファーの対象とするかを選択します これらの設定はすべて オファーの公開前に調整できますが オファーの開始日を過ぎると ロックされます
次に オファーを提供する 国と地域を選択します そのあと オファーを都度払いまたは前払い もしくは 無料トライアルにするかを選択します そして期間を選択します
有料オファーの場合は デフォルトの通貨に基づいて ドロップダウンから 価格を選択します 選択された価格に基づいて オファーに選択した それぞれの国や地域に最適な価格が App Store Connectによって 提示されます 各ドロップダウンメニューをクリックして それらを調整できます オファーの作成後にオファーの価格設定を 変更することはできません
最後に ウィンバックオファーの詳細を 確認して確定します 設定を更新したい場合は 戻るボタンをクリックして 前の手順に戻ります
設定に問題がなければ をクリックして この新しいオファーの作成を完了します
ウィンバックオファーを作成できました このオファーを 独自のマーケティングチャネルや App Storeでプロモーションできます
ここにオファーリンクがあります
これを使ってオファーを独自の マーケティングチャネルで配布できます
ウィンバックオファーを App Storeでプロモーションする場合 いくつかの詳細設定で サブスクリプションを設定します
オファーの詳細ページに という セクションがあります サブスクリプションに 画像がない場合は このように表示されます リンクをクリックしてサブスクリプションの 画像をアップロードします
サブスクリプションの詳細ページに移動し 画像をApp Reviewに送信します
承認済みのサブスクリプション画像を 用意し App Storeプロモーションを オファーに対して有効にすると ウィンバックオファーは公開時に自動的に App Storeでプロモーションされます
オファーをまだ公開していない場合は App Storeでのプロモーションを キャンセルできますが 一旦公開した場合は ウィンバックオファーを削除して App Storeにオファーが 表示されないようにする必要があります
App Storeでは プロモーション中のウィンバックオファーは 新しいオファーカードとして 詳細ビューに表示されます 承認済みのサブスクリプション画像と アプリアイコンを組み合わせて このような新しい画像が作成されます
ここまで App Store Connectで サブスクリプションに ウィンバックオファーを設定する 方法を見てきました App Store Connect API 3.6では 独自のカスタムフローを使用して ウィンバックオファーを設定するための リソースが用意されています
新しいWinBackOffers APIには ウィンバックオファーを作成 読み取り 更新 削除するエンドポイントが含まれています これらのAPIを使用して オファープロセスを簡単に管理できます SubscriptionとInAppPurchaseの 2つの新しい画像リソースも追加されました これに伴い既存のPromotedPurchaseImages リソースが非推奨となりました 以上 App Store Connectでの ウィンバックオファー設定方法でした StoreKit 2でのウィンバックオファーの サポートについてはRickyが説明します XiaolanがApp Store Connectでの ウィンバックオファーの設定方法について 説明してくれました 次のステップでは StoreKit 2を使用して アプリにコードを追加し 新しいオファーをサポートします まず ウィンバックオファーと その他の既存のオファータイプを 区別する方法を確認しましょう StoreKit 2ではOfferTypeモデルで SubscriptionOfferタイプを識別します サポートされているオファータイプは お試しとプロモーションに加えて iOS 18.0から ウィンバックが追加されました アプリ内での オファーの価格と期間は Productモデルにある SubscriptionInfoで見ることができます ここに 利用可能な各オファータイプの メンバーがあります お試しオファーと もしあればプロモーションオファーのリスト それにiOS 18.0からは ウィンバックオファーのリストもあります これらの情報は アプリでオファーを サポートする上で重要です SubscriptionOfferオブジェクトが どのタイプのオファーであるかを判断し サブスクリプションに設定された 特定のオファータイプの情報を取得できます では ウィンバックオファーを使用した サブスクリプションの販売と購入の サポート方法を見てみましょう
StoreKit Message APIは ウィンバックオファーをユーザーに表示する 最も迅速で簡単な方法です StoreKitビューには 優れたマーチャンダイジングUIを構築し サブスクリプションをオファー詳細と一緒に 表示するオプションが用意されています サブスクリプションの販売や UIをもっと細かく制御したい場合は コアStoreKit 2 APIを 使用することができます 希望するカスタマイズの程度に応じて これらのオプションを 1つまたは複数選択できます
winBackOfferメッセージを アプリが受け取ると StoreKitは サブスクリプションや オファー価格の詳細を示した このようなシートを ユーザーに表示します ユーザーは下側のボタンを使用して オファーを受け入れ サービスに再登録することができます
これをサポートするために Message APIにwinBackOfferという 新しいReasonが搭載されました
ユーザーがウィンバックオファーの 対象である場合 アプリがこのメッセージを 自動的に受け取ります
アプリでトランザクションの更新を リッスンするようにしてください ユーザーの購入について通知を受け取り 解禁されるコンテンツへのアクセスを 許可できるようになります
近日中には ウィンバックオファーを Sandboxでテストできるようになります iOSのSandboxアカウント設定を使います という スイッチを有効にすると 新しいオファーの対象となったときに アプリでメッセージを受信できます
ここまで iOS 18.0で StoreKit Messageを使用して ウィンバックオファーをアプリでサポートし Sandboxでテストする方法を紹介しました
マーチャンダイジングUIを もっとカスタマイズしたい方のために WWDC23でStoreKitビューの 使い方を紹介しました StoreKitビューはアプリ内課金の表示と 販売のためのすぐに使える美しいAPIです StoreKitビューでは ユーザーが対象となったときに ウィンバックオファーを含む すべての サブスクリプションオファーの価格の詳細を SubscriptionStoreViewsに 自動的に表示できます そのため 余分な作業は不要です ユーザーが複数のオファーの 対象となっている場合 どのオファーをビューに表示するか決定する 追加のロジックを 実行する必要があるかもしれません StoreKitビューにはそのための 新しいビューモディファイアが用意されています preferredSubscriptionOfferです
preferredSubscriptionOfferと SubscriptionStoreViewを組み合わせて 複数のオファーが利用可能な場合に 使用するオファーを制御できます オファーメタデータの取得や 購入の設定は StoreKitが自動で行ってくれます
次は SubscriptionStoreViewでの 新しいビューモディファイアの使い方です
Destination Videoアプリで サブスクリプションプランを販売するために Streaming Passプランの サブスクリプショングループIDを使用して SwiftUIビューを設定しました SubscriptionStoreViewは 利用可能なオファーの詳細を表示します 例えば この月額プランなどです ここには StoreKitによって自動的に 選択されたオファーの価格が表示されます
preferredSubscriptionOfferモディファイアを 追加して 他の利用可能なオファーを確認し どのオファーを表示するか決定できます
preferredSubscriptionOffer APIは 単一のパラメータを取ります それは StoreKitがグループ内の 各サブスクリプションに呼び出す関数です この関数において StoreKitは プロダクトオブジェクト サブスクリプション情報 また 現在ユーザーが対象となっている すべてのオファーのリストを提供します
独自のロジックを実行して 使用するオファーを決定するために StoreKitから取り出す必要がある情報は これで全部です 1つが選ばれるようにして ここに SubscriptionOfferオブジェクトを返します
サブスクリプションに ユーザーが利用可能な お試しオファーがある場合に nilを返すと アプリでは常にお試しオファーが ビューに表示されることに注意してください この例では 最も長い無料トライアルを 提供するオファーを探します 無料トライアルのオファーがない場合は リストの最初のオファーを 代わりに選択します アプリを開発するときには ここにオファーの価格や期間に基づく ロジックをさらに追加することもできます ユーザーは月間サブスクリプションの 3か月無料トライアルオファーの 対象となっていたため 新しい価格の詳細が SwiftUIビューに反映されています
以上が SubscriptionStoreViewsを カスタマイズして様々なオファーを ユーザーに表示する方法でした サブスクリプションの販売を もっと細かく制御する必要がある場合や カスタムUIを作成したい場合は コアStoreKit APIを使用して オファーの販売を 自分で管理することができます
先ほど Productモデルのどこに オファーの詳細があるか紹介しましたが ウィンバックオファーには ユーザーによってそれぞれ異なる 利用資格の設定もあります Xiaolanが これをApp Store Connectで 設定する方法について説明してくれましたが
設定をシンプルにして ユーザーに 適切なオファーを簡単に表示できるように StoreKitでは 新しいAPIである eligibleWinBackOfferIDsを使用して 各ユーザーに応じた ウィンバックオファーリストを提供できます
この新しいAPIは サブスクリプションステータスモデルの RenewalInfoオブジェクトにあり ユーザーがすぐに利用可能な ウィンバックオファーのIDのリストに すばやくアクセスできます このリストを使用して SubscriptionInfoで 対応するオファーを検索し 価格の詳細をビューに表示します
次に これらの新しいAPIを使用して Destination Videoで ウィンバックオファーをサポートする 方法を紹介します 私のアプリには マーチャンダイジングUIを ユーザーに表示する前に サブスクリプションステータスや お試しオファーの利用資格を確認する ロジックが含まれています これを行うにあたって ユーザーの現在の サブスクリプションステータスや ユーザーがオファーの対象であるかどうかを この関数によって判断しています この関数は2つのパラメータを取ります 1つはステータスを確認する サブスクリプションのグループIDで もう1つはプロダクトIDのリストです
まず サブスクリプションの 現在のステータスを取得します
次に 作成済みのデータ構造で解析を行い ユーザーがサービスの対象かどうか 自動更新が有効になっているかどうか を判断します
それらの情報から このenumを使用して マーチャンダイジングUIを 表示する必要があるかどうかを 決定できます
ユーザーが自動更新を有効にしている場合は フラグを返してマーチャンダイジングUIが 表示されないようにし
ユーザーが現在サブスクリプションに 登録していない場合は マーチャンダイジングUIを表示します その場合 まず 販売したいサブスクリプションの プロダクトをロードします 次に ユーザーがお試しオファーの 対象かどうか確認する必要があります 対象となっている場合は サブスクリプションプロダクトとオファーを 返してビューに表示します
お試しオファーの対象ではない場合は 以前に取得した サブスクリプションステータスを調べて 代わりにウィンバックオファーの 対象となっていないか確認できます
ウィンバックオファーを利用できるのは そのプロダクトを解約したユーザーのみです ファミリー共有でサービスに アクセスしている可能性もあるため ユーザーが保有していた サブスクリプションのステータスを 調べる必要があります
ウィンバックオファーの利用資格は そのサブスクリプションステータスの renewalInfoを見るとわかります この情報から最適な ウィンバックオファーIDを探せます 最適なオファーは通常 リストの最初のオブジェクトですが 複数ある場合は 他の利用可能な オファーを調べることもできます ウィンバックオファーが 1つでもあれば ユーザーが利用できるように それをプロダクトと一緒に返します ビューの作成に必要な オファーの詳細を入手するために SubscriptionInfoの すべてのオファーのリストで SubscriptionOfferオブジェクトを 探します
利用可能なウィンバックバックオファーの IDのリストが空の場合 ユーザーに利用可能なオファーはないため 通常のサブスクリプション価格が表示された マーチャンダイジングビューを表示します
ユーザーがウィンバックオファーの 対象かどうか確認する方法と 既存のサブスクリプションステータスの ワークフローを紹介しました ユーザーがオファーの利用を選択した場合は ウィンバックオファーを購入に 追加する必要があります
その方法は簡単です iOS 18.0には winBackOfferという 新しいPurchaseOption APIがあります
これを使用して ウィンバックオファーを 表すSubscriptionOfferオブジェクトを 購入に追加します 次に 購入オプションを Purchase APIに渡します StoreKitによってペイメントシートが アプリに表示される前に App Storeにより ユーザーがオファーの 対象かどうかが確認されます
ウィンバックオファーをアプリで サポートする方法は以上です StoreKit Messageは 最も迅速にウィンバックオファーを ユーザーに表示できるオプションです StoreKitビューを使用すれば 特定のケースに応じて コードを追加しなくても済むことがあります また 魅力的なサブスクリプション マーチャンダイジングUIを作成できます StoreKitビューのその他の 新しい機能については 2024年のセッション 「What’s new in StoreKit and In-App Purchase」をご覧ください アプリやサブスクリプションサービスに カスタムワークフローやUIを 作成する必要がある場合は SubscriptionStatusとSubscriptionInfo の新しいStoreKit APIを使用し ユーザーに適切なオファーを見つけて 独自のマーチャンダイジングビューに それを表示できます
ウィンバックオファーをサポートするための コードをアプリに追加したら 様々なシナリオや サブスクリプションステータスで テストする必要があります ウィンバックオファーの実装に利用可能な すべての方法をSandboxでテストできます このオファーのStoreKit Messageを テストする方法はすでに説明しました
StoreKitビューもしくは コアStoreKit APIのいずれか またはその両方を使用する場合は XcodeのStoreKitテストを使用して テストすることもできます これはアプリを開発しながら オファーをテストできる最も迅速な方法です
次に アプリでのウィンバックオファーの テストに役立つXcodeの新機能を紹介します
Xcodeでウィンバックオファーを 設定するには StoreKitの設定を開きます ここではローカルアプリ内課金を 設定することができます で 目的のサブスクリプションを探し セクションまで スクロールすると表があります
ボタンをクリックして新しいオファーを 追加し 必要な詳細を入力します オファーの名前
オファーID
そして 他のオファータイプと同様に 支払いモード
期間
該当する場合は価格も入力します
App Store Connectでは オファーを利用するために ユーザーが満たす必要がある ウィンバックオファーの利用資格を 様々なルール ステータス 条件で 設定できます ユーザーの利用資格の結果を すばやく効率的にテストできるように オファーごとに利用資格を変更できる トグルがXcodeに追加されました そのため サブスクリプションステータスや その他の利用資格について 心配する必要はありません
この利用資格のトグルを使用して ユーザーによるサブスクリプション解約時に アプリでウィンバックオファーを 受け取るべきかどうか決定します また デバッグ時にこれを変更して ユーザーのオファー利用資格について 様々なシナリオをテストし アプリがどのように反応するか確認します
をクリックしてサブスクリプションの 新しいウィンバックオファー設定は完了です さらに別のオファーを設定する場合は テストのニーズに合わせて様々な設定で これらの手順を繰り返します
ウィンバックオファーを アプリでテストする準備が整いました XcodeのStoreKitテストは サブスクリプションオファーに最適です ウィンバックオファーの 様々な設定やユーザーステータスを すばやくテストできます ありがとう Ricky 最後は ウィンバックオファーに追加された ストリームライン購入機能について 説明します App Storeでのウィンバックオファーの プロモーション方法はすでに紹介しました ウィンバックオファーを プロモーションすると ユーザーはストリームライン購入によって オファーの利用とサービスへの登録を App Storeで 一度に行うことができます ストリームライン購入は アプリでデフォルトで有効になっています App Store Connectから その設定を行うことができます
アプリでウィンバックオファーに ストリームライン購入を使用する場合 ユーザーがオファーを利用するために ボタンをタップすると App Storeにより ペイメントシートが表示されます ここでユーザーはサブスクリプションや オファーの詳細を確認できます ユーザーが内容を確認して 購入を完了し アプリを開くと サブスクリプションサービスに すぐにアクセスできます 購入を続行し ウィンバックオファーを利用するために アプリで特定のユーザーアクションが 必要になることもあります その場合は App Store Connectの設定で そのウィンバックオファーに対して ストリームライン購入を無効にできます ページに移動すると の下に ストリームライン購入を設定するための 新しいセクションがあります ボタンをクリックして 機能をオフにするよう選択できます
ストリームライン購入をオフにすると App Storeにより 購入が直接アプリに送信されるため アプリでカスタム体験を作成できます これをサポートするには アプリでいくつかの変更が必要です
ストリームライン購入を オフにすることにして それでもウィンバックオファーを App Storeでプロモーションする場合は いくつかのコードをアプリに設定して ユーザーがApp Storeで開始した購入を 受け取る必要があります これを行うには WWDC23で紹介した PurchaseIntent APIを使用します アプリ内課金のプロモーションや ウィンバックオファーなど アプリ外でユーザーが購入を開始した場合 App Storeにより 購入インテントが送信されます 新しい購入インテントを受け取ったら 購入をすぐに続行して ペイメントシートを表示するか 後で使うためにインテントを保存できます
PurchaseIntentを使用して ユーザーがApp Storeで利用を開始した ウィンバックオファーを 受け取ることもできます iOS 18.0とmacOS 15.0には そのための 新しいメンバーofferがあります これはオプションの SubscriptionOfferタイプで 購入インテントにウィンバックオファーが 含まれる場合にのみ入力されます
ウィンバックオファーが含まれた 購入インテントを受け取ったら 提供されたオファー情報を使用して オファーの完全な詳細を表示し ユーザーに販売します その後 通常通りに購入を開始し 選択されたオファーを 購入オプションに追加します
Xcode 16では XcodeのStoreKitテストを使用して 購入インテントリスナーと 遅延ロジックをテストします 詳しくは StoreKitセッションの 「What’s new in StoreKit and In-App Purchase」をご覧ください Rudyが詳しく説明しています
ウィンバックオファーの ストリームライン購入機能と この機能をオフにした場合の アプリでの購入の処理方法については 以上になります 本セッションはこれで終わりです StoreKitの新しくなった SubscriptionOffer APIについて説明し ウィンバックオファーの概要を 紹介しました この新しいオファータイプを構成し アプリでサポートする様々な方法も 紹介しました また App Storeでウィンバックオファーを プロモーションする方法と ユーザーがストリームライン購入で オファーを利用する方法を紹介しました
ウィンバックオファーを今すぐアプリで サポートしてテストできます みなさんがどのような新しい体験を 作られるのか楽しみにしています フィードバックアシスタントを使って フィードバックをお寄せください 詳しく知りたい方は デベロッパWebサイトの ドキュメントをご覧ください 他にも見逃せない 素晴らしいセッションがあります 「What’s new in StoreKit and In-App Purchase」と 「What’s new in App Store Connect」もぜひご覧ください このセッションが アプリにオファーを 追加するきっかけとなれば幸いです ご視聴ありがとうございました
-
-
4:25 - Present offer code redemption sheet on macOS - SwiftUI API
// Present offer code redemption sheet on macOS - SwiftUI API import SwiftUI import StoreKit struct MyView: View { @State var showOfferCodeRedemption: Bool = false var body: some View { Button("Redeem Code") { showOfferCodeRedemption = true } .offerCodeRedemption(isPresented: $showOfferCodeRedemption) { result in // Handle result } } }
-
20:15 - Choose preferred offer in a SubscriptionStoreView
// Choose preferred offer in a SubscriptionStoreView import SwiftUI import StoreKit struct MyView: View { let groupID: String var body: some View { SubscriptionStoreView(groupID: groupID) .preferredSubscriptionOffer { product, subscription, eligibleOffers in let freeTrialOffer = eligibleOffers .filter { $0.paymentMode == .freeTrial } .max { lhs, rhs in lhs.period.value < rhs.period.value } return freeTrialOffer ?? eligibleOffers.first } } }
-
23:05 - Check subscription entitlement and offer eligibility
// Check subscription entitlement and offer eligibility import StoreKit func shouldShowMerchandising( for groupID: String, productIDs: [Product.ID] ) async throws -> MerchandisingVisibility { // Get subscription status let statuses = try await Product.SubscriptionInfo.status(for: groupID) // Check if the customer is already entitled to the subscription let entitlement = SubscriptionEntitlement(for: statuses) if entitlement.autoRenewalEnabled { return .hidden } // Check for offers to show in merchandising UI let products = try await Product.products(for: productIDs) let isEligibleForIntroOffer = await Product.SubscriptionInfo.isEligibleForIntroOffer(for: groupID) if isEligibleForIntroOffer { let subscriptions = products.map { ($0, $0.subscription?.introductoryOffer) } return .visible(subscriptions) } // Check for eligible win-back offers let purchasedStatus = statuses.first { $0.transaction.unsafePayloadValue.ownershipType == .purchased } let renewalInfo = try purchasedStatus?.renewalInfo.payloadValue let bestWinBackOfferID = renewalInfo?.eligibleWinBackOfferIDs.first // Return the product with the offer if there is one if let bestWinBackOfferID { let subscriptions: [(Product, Product.SubscriptionOffer?)] = products.map { let winBackOffer = $0.subscription?.winBackOffers.first { $0.id == bestWinBackOfferID } return ($0, winBackOffer) } return .visible(subscriptions) } // Only return the product if there is no offer return .visible(products.map { ($0, nil) }) } struct SubscriptionEntitlement { let isEntitled: Bool let autoRenewalEnabled: Bool init(for statuses: [Product.SubscriptionInfo.Status]) { let entitledStatuses = statuses.filter { $0.state == .subscribed || $0.state == .inBillingRetryPeriod || $0.state == .inGracePeriod } isEntitled = !entitledStatuses.isEmpty autoRenewalEnabled = entitledStatuses.contains { $0.renewalInfo.unsafePayloadValue.willAutoRenew } } } enum MerchandisingVisibility { case hidden case visible([(Product, Product.SubscriptionOffer?)]) }
-
25:26 - Add a win-back offer to a purchase
// Add a win-back offer to a purchase import StoreKit func purchase( _ product: Product, with offer: Product.SubscriptionOffer? ) async throws { // Prepare the purchase options var purchaseOptions: Set<Product.PurchaseOption> = [] // Add win-back offer to the purchase if let offer, offer.type == .winBack { purchaseOptions.insert(.winBackOffer(offer)) } // Make the purchase try await product.purchase(options: purchaseOptions) }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。