目次
Session概要
iPhone、iPad、Mac、およびApple Watchのアプリ向けの優れたアプリ内課金体験を作り上げましょう。返金を管理し、新しいApp Storeサーバの通知を組み込み、受領書とサーバ通知の使用方法を理解してサブスクライバーのステータスを管理する方法について。また、Apple Watch、家族間共有、SKOverlay、SKAdNetworkなどでのアプリ内課金を含む、StoreKitの最新のアップデート内容についても紹介します
https://developer.apple.com/videos/play/wwdc2020/10661/
アプリ内で家族間共有と製品購入がどのように機能するか
家族間共有のサポートをアプリにどのように表示させるか
- SKProductにisFamilyShareableプロパティが追加
- このプロパティにより家族間共有可能であるかどうか確認し、ユーザに示せる
家族間共有可能な製品を購入時、無効時
- 家族間共有可能なアプリ内課金をするとすべてが通常どおり始まる
- アプリはStoreKitで課金内容をApp Storeに送り、トランザクションが購入状態となり戻ってくる
- 次に家族がアプリを開くと、家族それぞれがトランザクションを取得し、復元されあ購入のように見える
- 既存のアプリロジックは追加コーディングなしで処理できる
- ユーザが家族間共有を無効にした場合
- SKPaymentTransactionReserverプロトコルの新しいAPIでpaymentQueue(_:didRevokeEntitlementsForProductIdentifiers:)StoreKitは自動的にレシートを更新しこのメソッドを呼び出す
- このメソッド内ではレシートを検証する準備をすべき
- ローカルで行うかサーバにアップロードしレシート検証のエンドポイントを使う
- 取り消された製品はレシートに表示されなくなる
- 製品IDだけを見てアクセスを取り消してはいけない
- SKPaymentTransactionReserverプロトコルの新しいAPIでpaymentQueue(_:didRevokeEntitlementsForProductIdentifiers:)StoreKitは自動的にレシートを更新しこのメソッドを呼び出す
- 返金時はStoreKitがメソッドを呼び出し、アクセスを取り消すことが可能
StoreKitに追加した新機能
- Apple Watchでのアプリ内課金(2019〜
- サブスクリプション価格の増加フローの改善(2019〜
- SKOverlayの改善(New
- SKAdNetworkの改善(New
Apple Watchでのアプリ内課金
- watchOS 6.2からStoreKitとアプリ内課金をwatchOSに追加
- watchOSでのStoreKitの利用方法は他のプラットフォームと同じ
- レシートの検証では、サーバ間検証を引き続き使用可能
- ローカル検証を行う場合、注意すべき点
- デバイス識別子を取得する時、UIDeviceの代わりにWKInterfaceDeviceAPIを使用する必要がある
- デバイス識別子を取得する時、UIDeviceの代わりにWKInterfaceDeviceAPIを使用する必要がある


サブスクリプション価格の増加フローの改善
- 既存のサブスクリプション製品の値段を上げたい場合に使用する
- 値上げの設定はApp Store Connectから価格変更を行うだけで可能です
- ただし、自動更新サブスクリプションの価格をユーザに無断で上げることはできません
- App Storeでは各ユーザが新価格に同意する必要があります
- 値下げはユーザの同意は必要なく自動的に新価格となる
- 残念ながらユーザに新価格への同意を依頼するとチャーンが発生する可能性があります
- チャーン(churn)とは、ユーザが製品の使用と支払いをやめること
- ユーザはApp Storeから送るメールを見逃したり、値上げの流れに従わないケースや後回しにして忘れることがあります
- また、値上げによる付加価値を伝えられていないケースなどがあります
- このような機会損失を防ぐために、アプリ内で自動的に表示される価格同意シートが実装された
- App Store Connectで値上げしたら、影響を受けるユーザにはアプリを開いた時、下記のようなApp Store UIが表示される
- アプリ使用時に情報が出て、サブスクリプション継続に同意できます
- あなたの製品の価値を体験することができる
- ユーザがシートに同意するか閉じるとアプリのUIは通常どおり続行される
- アプリを開いた直後にシートを表示したくない場合もあるので、フローを制御するツールが’追加された

価格同意シートの制御フロー
- 新しいSKPaymentQueueデリゲートメソッドを実装する
- paymentQueueShouldShowPriceConsentメソッド内でハンドリングを行う
- StoreKitは価格同意シートを提示する前に常にこのメソッドを呼び出します
- メソッド内でシートをすぐ表示するか聞かれるので、ハンドリング可能
- paymentQueueShouldShowPriceConsentの呼び出しはSKPaymentQueueのshowPriceConsentIfNeededメソッドを使用することで呼び出します
- StoreKitはユーザにシートを表示する前に必ず保留中の値上げがあるかを確認し、なければ表示しないため、常にtrueを返しても問題ない
SKOverlayの改善
- アプリの表示と宣伝のためのUI要素
- UIの下部にフローティングビューでアプリに関する情報を表示する
- SKStoreProductViewControllerに似ているが、SKOverlayはアプリのUIとシームレスに連携するように設計されており、SKOverlayはアプリの表示にのみ使われる
- SKOverlayはApp Clipとシームレスに連携し、App Clipからフルアプリへのユーザの移行も支援します
- 表示したいアプリのApp IDを入力するだけで、ユーザはオーバーレイから直接インストール可能
- 表示したいアプリのApp IDを入力するだけで、ユーザはオーバーレイから直接インストール可能

SKOverlay APIをアプリに統合する最適な方法
- SKOverlay構成オブジェクト(SKOverlay.Configuration)を使い初期化する
- presentメソッドでオーバーレイを表示するWindowSceneをパスインする
- dismissメソッドでオーバーレイを閉じる
- 一度に1シーンに表示できるオーバーレイは1つだけ
- SKOverlayDelegateでオーバーレイのステータスの変化に対応可能
SKOverlay configuration
- SKOverlayは2つのクラスで構成されており、1つはAppClipConfiguration
- App Clipからフルアプリへの移行に使用される構成でオーバーレイが表示されている現在のApp Clipに対し、フルアプリしか表示できない
- AppConfiguration
- どんなアプリでも表示可能
- appIdentifier:表示したいアプリのiTunes識別子を入力できる(AppClipConfigurationにはない)
- userDismissible:ユーザが閉じられるブール値(デフォルトはtrue)
- ユーザがオーバーレイを下へスワイプすれば画面から消せる
- falseにすれば、ユーザは下へスワイプできません
- 2つのクラスの共通点
- どちらにもキャンペーントークンとプロバイダートークンがありアプリ分析でSKOverlayを使用可能
- また任意のキー値を設定し、取得できるメソッドもある(additionalValue())
- position:表示位置を持つ
- bottom
- bottomRaised
- タブバーを使うアプリでは、オーバーレイがタブバーに重ならず上に出るようにこちらを使用する
SKOverlayDelegate
- オーバーレイのエラーハンドラー
- オーバーレイを表示しようとして予期しないエラーが発生したら呼ばれ、オーバーレイと特定のエラーを引数としてパスインする
- オーバーレイの表示の開始、終了
- オーバーレイの非表示の開始、終了
- デリゲートは常にメインキューで呼び出されるのでUIを直接操作可能
SKAdNetworkの改善
- ユーザのプライバシーを尊重しつつ、広告効果の測定を可能にする
SKAdNetworkの概要
- 3つのステークホルダー
- 広告ネットワーク
- 広告ネットワークはアプリ内に広告を配置し、広告がコンバージョンにつながった時にポストバックを受け取る
- Source(ソース)アプリ
- 広告ネットワークによって送信された広告が表示される
- 広告アプリ
- 広告に表示されるうものでポストバックが開かれたらSKAdNetworkに送信する
- 広告ネットワーク
SKAdNetworkのフロー
- 広告ネットワークは広告アプリ内の広告にSKAdNetworkデータを配置する(B)
- この広告をソースアプリに表示(A)
- ユーザが広告をタップし、アプリBをインストールし開くと、アプリBはポストバックを初期化するために別のSKAdNetwork APIを呼ぶ
- SKAdNetwork APIを呼び出すとタイマーが設定される
- ポストバックのデータを検証
