WWDC Quick Look 💓 By SwiftGGTeam
What’s new with in-app purchase

What’s new with in-app purchase

元の動画を見る

ハイライト

Apple は、WWDC 2020 でアプリ内購入用の返金通知、DID_RENEW 更新通知、ファミリー共有トランザクション、watchOS StoreKit、SKOverlay、SKAdNetwork 2.0 を追加し、開発者がサーバー通知と StoreKit API を使用して購入、サブスクリプション、プロモーション リンクを管理できるようにしました。


主要内容

アプリ内購入で対処するのが最も難しい状況は、多くの場合、購入完了後に発生します。ユーザーは 100 ジェムを購入し、Apple に返金を申請しました。ユーザーのサブスクリプションがアップグレード、ダウングレードされ、更新に失敗し、その後復元されました。家族はアプリを開いて、すぐに共有権利を取得したいと考えました。開発者がクライアント側で購入結果を一度だけ確認した場合、すぐに実際のステータスを失うことになります。

このセッションでは、まずサーバー側の穴を埋めます。 Apple は、消耗品 (消耗品)、非消耗品 (非消耗品)、および非更新サブスクリプション (非更新サブスクリプション) の払い戻しを App Store サーバー通知に入力できるようにする返金通知を追加しました。 DID_RENEW はサブスクリプション側にも追加されるため、自動更新が成功するたびにサーバー イベントが発生します。

その後、StoreKit はこの状態をデバイスに戻します。ファミリー共有では、購入者と各家族メンバーのトランザクションが生成されます。 watchOS 6.2 ではアプリ内購入を直接開始できます。サブスクリプション価格値上げ同意ポップアップ ウィンドウは、表示時にアプリで制御できます。 SKOverlay により、App Clip または完全なアプリがシステム フローティング レイヤーを使用して別のアプリを宣伝できるようになります。

最後に、広告の帰属です。 SKAdNetwork 2.0 では、ソース アプリ ID、ダウンロード、コンバージョン値が追加されます。広告アプリは、最初の起動後にコンバージョン値を 0 から 63 まで更新できます。また、広告ネットワークが受信したポストバックは、引き続き Apple の公開キーによって検証され、プライバシーの制約が許す場合にはより多くのコンテキストが付加されます。


詳細

返金通知により、コンテンツの取り消しがサーバー側のイベントに変わります

(01:04) 冒頭の例は、ゲーム内の 100 ジェムです。ユーザーは購入後、Appleに返金を申請します。開発者がトランザクションが返金されたことを知らない場合、コンテンツを保持するか、残高を差し引くか、またはユーザーに説明メッセージを表示するかを決定できません。

(03:24) Apple のアプローチは、払い戻し通知を追加することです。これは、払い戻しが行われたときに JSON POST 経由で開発者に通知する、App Store サーバー通知の新しいイベントです。エンドポイントが HTTP OK を返さない場合、Apple は最大 3 回まで再試行します。

refund notification:
  bid
  password
  unified_receipt.latest_receipt_info[].original_transaction_id
  unified_receipt.latest_receipt_info[].cancellation_date
  unified_receipt.latest_receipt_info[].cancellation_reason
  unified_receipt.latest_receipt_info[].product_id

キーポイント:

  • original_transaction_id返金された元のトランザクションを見つけるために使用されます。
  • cancellation_dateApple がいつ返金を完了するかを示します。
  • cancellation_reason値は 0 または 1 です。値が 1 の場合、Apple はユーザーがアプリ内の問題により返金を要求したことを示します。
  • bidそしてproduct_id通知がどのアプリや製品に属するかを確認するために使用されます。
  • passwordこれはアプリの共有秘密であり、ペイロードが Apple からのものであることを確認するために使用されます。

(09:11) 返金イベントを受信した後、開発者は返金の監視、アプリ内メッセージングを実行し、返金されたコンテンツへのアクセスを制限できます。消耗品の場合は、アプリ内通貨の残高も差し引くことができます。 Session は明らかに開発者に選択を委ねています。行動はコミュニティの健康と経済システムの公平性と一致していなければなりません。

サブスクリプションのステータスがポーリングから通知主導に変更される

(11:52) サブスクリプションのライフサイクルには、最初のサブスクリプション、自動更新の成功または失敗、自動更新のオフまたはオン、アップグレード、ダウングレード、キャンセル、その他の状態が含まれます。 Apple は、受信確認を頻繁にポーリングする代わりに、App Store サーバー通知を使用してステータス更新を受信することをお勧めします。

subscription notification:
  auto_renew_product_id
  notification_type
  password
  bid
  unified_receipt.latest_receipt
  unified_receipt.latest_receipt_info[].original_transaction_id
  pending_renewal_info[]

キーポイント:

  • notification_typeINITIAL_BUY、INTERACTIVE_RENEWAL、DID_FAIL_TO_RENEW、DID_RECOVER などのイベント タイプにフラグを立てます。
  • auto_renew_product_id自動更新予定のアイテムを指します。
  • latest_receipt_info過去 100 件のトランザクションが含まれており、使用できます。original_transaction_idアクティブなサブスクリプションが見つかりました。
  • pending_renewal_info次回更新情報を保存します。

(16:05) 2020 年の新機能 DID_RENEW。自動更新が成功するたびに送信されます。ペイロードには、統合レシート、元のトランザクション ID、新しいサブスクリプション期間のトランザクション ID、有効期限、自動更新の製品 ID が含まれます。

(17:14) Apple はまた、プロモーションオファー ID を保留中の更新情報に追加しました。ユーザーが次回の更新でサブスクリプション オファーを利用することにした場合、開発者はそれを事前に知ることができます。

(18:00) 受信が 3 つの位置を保持していることを確認します。サーバー障害後の回復モード、ユーザーがオンラインになったときの資格 (権利と利益) の即時判断、および自動更新後の二重確認です。推奨されるアプローチは、最初に DID_RENEW をサブスクライブし、サブスクリプションの有効期限が切れた後に受信確認の呼び出しをスケジュールすることです。 DID_RENEW が正常に到着した場合は、タスクをキャンセルします。

ファミリー共有では、家族メンバーのトランザクションが生成されます

(19:36) ファミリー共有は、自動更新可能なサブスクリプションと非消費型のアプリ内購入をサポートしており、最大 5 人の追加ファミリー メンバーが購入内容を共有できます。開発者は、App Store Connect の特定の製品に対してこれを有効にする必要があります。一度オンにするとオフにすることはできません。

(21:27) 共有とは、単に購入者のレシートを再利用することではありません。 Apple は購入者と各家族のトランザクションを作成します。家族がアプリを開くと、対応するトランザクションがトランザクション キューに表示され、レシートの最新の領収書情報にも共有トランザクションが含まれます。

Family Sharing APIs and signals:
  SKProduct.isFamilySharable
  transaction queue entries for family members
  unique receipt for each family member
  SKPaymentTransactionObserver.paymentQueue(didRevokeEntitlementsForProductIdentifiers:)

キーポイント:

  • SKProduct.isFamilySharable製品情報をリクエストした後、製品がファミリー共有をサポートしているかどうかをアプリに判断させます。
  • 新規購入では、家族メンバーの復元された購入と同様のトランザクションが行われ、再利用できる回復ロジックがすでに存在します。
  • 家族がコンテンツを取得できるようになる前に、古い非消耗品の購入を復元する必要があります。
  • paymentQueue(didRevokeEntitlementsForProductIdentifiers:)ホームシェアリングをオフにした後、ファミリーグループから脱退した後、または返金後に電話がかかります。
  • 失効コールバックを受信した後、受信を再確認する必要があります。製品識別子の配列を確認するだけでは、重複するすべての権利と利益を直接取り消すことはできません。

StoreKit は watchOS、値上げポップアップ、SKOverlay まで拡張

(27:40) watchOS 6.2 は StoreKit とアプリ内購入のサポートを開始します。 watchOS アプリは、支払いキューを監視し、商品をリクエストし、キューに支払いを追加できます。サーバー側の受信検証は引き続き利用できます。ローカル検証中に、UIDevice の代わりに WKInterfaceDevice を使用してデバイス ID を取得します。

(30:02) サブスクリプション価格値上げの同意プロセスも変更されました。ユーザーがアプリを開くと、App Store にシステム同意ポップアップ ウィンドウが表示されます。現在の時間が適切でない場合、アプリは SKPaymentQueue デリゲート メソッドで false を返し、後で呼び出すことができます。SKPaymentQueue.showPriceConsentIfNeeded展示する。

(31:33) SKOverlay は、アプリの表示と宣伝に使用される新しいシステムのフローティング レイヤーです。 SKStoreProductViewControllerよりも現在のインターフェイスに近く、App Clipがユーザーを完全なアプリに導くのにも役立ちます。

SKOverlay flow:
  create configuration
  initialize overlay
  set delegate
  present in UIWindowScene
  dismiss from UIWindowScene
  animate alongside SKOverlay.TransitionContext

キーポイント:

  • AppClipConfiguration は、App Clip から対応する完全な App を表示するために使用されます。
  • AppConfiguration は任意のアプリを表示し、アプリ識別子を提供できます。
  • キャンペーン トークンとプロバイダー トークンは App Analytics で使用できます。
  • 位置はbottomまたはbottomRaizedを選択できます。後者はタブバーのあるインターフェイスに適しています。
  • デリゲートの表示および消滅コールバックはメイン キュー内にあり、遷移コンテキストと同期して UI を移動できます。

SKAdNetwork 2.0 は広告アトリビューションにオプションのコンテキストを追加します

(37:43) SKAdNetwork には、広告ネットワーク、ソース アプリ、広告アプリの 3 者が関与します。広告ネットワークは、署名された広告データをソース アプリに配置します。ユーザーが広告アプリをインストールして開いた後、広告アプリはポストバックを初期化します。タイマーが期限切れになった後、デバイスはポストバックを広告ネットワークに送信します。

SKAdNetwork 2.0 additions:
  version: 2.0
  source app id
  redownload
  conversion value: 0...63
  updateConversionValue

キーポイント:

  • 広告表示データには、2.0 のバージョンとソース アプリ ID が含まれている必要があります。
  • ポストバックは、広告アプリが最初に起動されたときに初期化されます。後続の呼び出しでは起動プロセスは繰り返されません。
  • updateConversionValue購入、体験登録、レベルクリアなどのイベントを0~63の6ビットの値で表現できます。
  • コンバージョン値は増加のみ可能で、現在の値よりも低い更新は無視されます。
  • ポストバックのソース アプリ ID とコンバージョン値はオプションであり、プライバシーの計算が許可される場合、Apple はそれらを返します。

重要ポイント

  1. 返金イベント台帳
  • やるべきこと: それぞれoriginal_transaction_id返金処理レコードを作成して、返金時間、理由、処理アクション、およびユーザーに表示されるメッセージを記録します。
  • 実行する価値がある理由: Apple が返金を完了した後に返金通知がプッシュされるため、開発者はコンテンツとアプリ内経済システムをタイムリーに処理できます。
  • 開始方法: App Store サーバー通知にアクセスして保存しますcancellation_datecancellation_reasonproduct_idを実行し、処理結果をアプリに同期します。
  1. サブスクリプション更新調整タスク
  • 対処方法: DID_RENEW を使用してサブスクリプション期間を更新し、有効期限の経過後に受信確認タスクをスケジュールします。
  • 実行する価値がある理由: セッションでは、ポーリングを減らすために通知を使用することを推奨していますが、サーバー障害や通知の遅延が発生した場合に備えて回復パスを保持します。
  • 開始方法: DID_RENEW を受信した後、対応する調整タスクをキャンセルします。タスクがトリガーされたときに受信確認を呼び出して、 を押しますoriginal_transaction_id権利を更新します。
  1. 家族共有権ページ
  • 対処方法: 購入ページでどの製品がファミリー共有をサポートしているかをマークし、家族メンバーが共有特典を獲得または喪失したときに UI を更新します。
  • 実行する価値がある理由: StoreKit は、ファミリー メンバーのトランザクションを生成し、共有が閉じられたとき、ファミリー グループから脱退したとき、または返金されたときに元に戻すコールバックをトリガーします。
  • 開始方法: 読むSKProduct.isFamilySharable、復元された購入ロジックを再利用して家族メンバーのトランザクションを処理し、取り消しコールバックを受信した後に領収書を再確認します。
  1. App Clip から完全な App へのアップグレード入り口
  • 何をすべきか: App Clip キータスクが完了した後、SKOverlay を表示して、完全なアプリをインストールするようにユーザーをガイドします。
  • 実行する価値がある理由: SKOverlay は、App Clip から完全な App への移行を特にサポートしており、オーバーレイは現在のインターフェイスと一緒にアニメーション化できます。
  • 開始方法: AppClipConfiguration を作成し、オーバーレイ デリゲートを設定し、適切なウィンドウ シーンに表示し、遷移コンテキストを使用して下部 UI​​ を調整します。
  1. プライバシーに配慮した広告コンバージョン レイヤリング
  • 内容: 登録、トライアル、購入、最初のレベルの完了など、インストール後の主要なアクションを 0 ~ 63 のコンバージョン値にマッピングします。
  • 価値がある理由: SKAdNetwork 2.0 を使用すると、広告アプリがコンバージョン値を更新できるようになり、広告ネットワークはプライバシーを保護しながら品質を評価できます。
  • 開始方法: イベントの増分レベルを定義し、新しいレベルが古いレベルよりも高い場合にのみ呼び出します。updateConversionValueの場合、サーバーはポストバックの処理時に欠落しているソース アプリ ID またはコンバージョン値を受け入れます。

関連セッション

  • Xcode での StoreKit テストの紹介 — アプリ内購入、払い戻し、サブスクリプション シナリオのローカル テストは、このセッションでのサーバー側のステータス処理を検証するためのサポート ツールです。
  • サブスクリプションのアーキテクチャ — エンタイトルメントの設計について詳しく説明し、その後、DID_RENEW、受信確認とサブスクリプションのライフサイクル処理について説明します。
  • App Clip を合理化する — App Clip のトランザクション エクスペリエンスと SKOverlay の使用シナリオについて説明することで、この記事の SKOverlay 部分を補足できます。
  • App Clip を探索する — まず App Clip の設計と検出メカニズムの背景を確立し、次に SKOverlay が完全な App ガイダンスに適している理由を理解します。

コメント

GitHub Issues · utterances