SwiftUiを使ってiPhoneアプリ(iOS)を開発しているんですが、どうやって課金アプリを作るのかわからないんです。うまくアプリに課金機能を持たせてアプリから収益を得られるようにしたいんです。
それならば、StoreKit2をアプリに導入することです。
StoreKit2によって、アプリに課金機能やサブスクリプションの機能を持たせることができるから、アプリから収益を得られるようになります。
サンプルコードを見ると、アイテムの課金でも1度だけやずっと使えるようにする設定、サブスクリプションなど全ての機能が含まれているから、是非このページで紹介する内容は調べて、自身のアプリにも入れてください。
なるほど。StoreKit2を使えばいいんですね。ではどうやって使うのか教えてください。
StoreKit2 iOS14からiOS15を使うことになるので特に注意事項もあれば知りたいですね。
まずは、どういったものかを知りたいので良い方法はないでしょうか?
まずは、WWDC 2021の動画をみてStoreKitの概要を理解し、サンプルコードを見ながら導入すると良いでしょう。このページに、サンプルコードの立ち上げまでの内容をまとめてみたから参考にしてみてください。
StoreKit2の動きが全てわかるから、実際に使ってみて足りないところなどに補足情報を入れるなど工夫してほしいわ。
Meet StoreKit2 (StoreKit2に会う)でApple Payを導入する。
Apple Payが使えるようになるStoreKit2は、iOS14以上(iOS15、iOS16、iOS17)でSwiftUIにて標準的に使えるようになったアプリ内購入(アプリ内課金)と自動更新可能なサブスクリプションのための強力なSwiftネイティブAPIを提供します。
Apple Payを使ったアプリ内購入とサブスクリプションを実装する方法としてStoreKit2を学び、製品情報の取得、トランザクションの処理、製品の資格と顧客のステータスの決定、およびXcode/SwiftUIでの包括的なテストサポートのためのAPIを見つけることができます。
WWDC 2021 Meet StoreKit2の動画を見てみましょう
WWDC2021年に、Apple Pay、サブスクリプションを利用可能とするStoreKit2について詳しく説明されたMeet StoreKit2が紹介されました。新しくStoreKitがVerアップした内容をることができます。
iPhoneアプリのStoreKit2のSwiftUIサンプルコードを読み解いてApple Payを自分のアプリに導入する
Xcodeを使ってSwiftUIでのApple Payを使えるようにするお勧めの方法はWWDC Meet StoreKit2を説明されていたサンプルコードを入手することだと考えています。
WWDC 2021の Meet StoreKit2の動画を見ることで、StoreKit2とは何か、StoreKit2をどのように使えば良いのかを知ることができます。
StoreKit2のconfiguration fileの操作方法、StoreKit2のtesting方法などを知ることにより、商品の追加やサブスクリプションの設定を変更をすることができます。
私は当初、StoreKit2をSwiftUIでiOS14環境で設定しましたが、iOS15、iOS16の環境でも修正することなく構築することができました。現在ではStoreKit2が動作する環境は、iOS15以降最新のOS Verに置き換わっていきますが、基本的にSwiftUIで定義しておけば、OSのバージョンの違いには対応できると思います。
StoreKit2でconfigrationをしっかりと抑え、restore、adnetwork、testing、external purchase entitlementについて知識をつけて、稼げるアプリを作っていきましょう。
さて、WWDC2021よりサンプルコードを入手し、StoreKit2を導入するために何をするべきか、動画を見ながら勉強してきたいと思います。
基本的には、このページでは、objective-cを使った定義について記載していません。理由は、全てSwiftUIだけで実装してます。objective-cはSwiftUIが登場する前のプログラミング言語になると考えているため、使えなくなるリスクや今後のメンテナンスを向上するためです。
もちろんobjective-cについて色々と調べると変換をすることができるのですが、SwiftUIに置き換えに手間がかかる、独特な変換ルールが必要という印象のため、実装面では、なるべく古い構造のソースコードは流用せずSwiftUIのみで実装する思想をとっています。
Readmeがあり、早速何か設定が必要の様です。
StoreKit2のサンプルコードプロジェクト開いてApple Payを動かしてみよう。
StoreKit2のサンプルコードプロジェクトでは、XcodeのSwiftUIのStoreKit Testingを使用しているため、App StoreConnectでセットアップを完了しなくてもサンプルアプリをビルドして実行できます。
プロジェクトは、Products.storekitファイルでStoreKitテストサーバーのアプリ内製品を定義します。プロジェクトには、絵文字にマップされた製品IDを含むリソースファイルとしてProducts.plistが含まれています。
デフォルトでは、XcodeでのStoreKitテストは無効になっています。
次の手順に従って、Products.storekit構成ファイルを選択し、XcodeでStoreKitテストを有効にします。
概要:上記を補足します。これからサンプルコードの説明をしていきます。
サンプルアプリは、車とガソリンを購入するアプリをあらかじめ実装してあります。
この事例を見ながら、自分のやりたいアプリケーションの課金に変更していくことになります。その際、テストモードにすることにより、アプリを買った時の動きをテストすることができます。
このテストモードにする方法もあらかじめ組み込まれていますので、アプリをリリースする際には、サンプルコードの部分を自分のアプリ用の設定に変更することで、課金機能の実現になります。
このサンプルから本物にする技術が求められていますので、是非とも皆さん課金機能をアプリに導入してみてください。
1:スキームをクリックして、スキームメニューを開きます。 [スキームの編集]を選択します。
2:スキームエディタで、実行アクションを選択します。
3:アクション設定で[オプション]をクリックします。
4:StoreKit構成オプションについては、Products.storekit構成ファイルを選択します。
【本番環境の設定の場合を追加】:App Store Connectを使ってサブスクリプションやアプリ内課金を実施できる場合は、App Store Connectで設定した、Products.storekit構成ファイルを選択しましょう。
アプリがストアを初期化すると、システムはProducts.plistを読み取り、製品IDを使用してStoreKitテストサーバーに製品を要求します。
Implementing a Store In Your App Using the StoreKit API
Offer in-app purchases and manage entitlements using signed transactions and status information.
Overview
This sample code project is associated with WWDC21 session 10114: Meet StoreKit 2.
Configure the Sample Code Project
This sample code project uses StoreKit Testing in Xcode so you can build and run the sample app without completing any setup in App Store Connect. The project defines in-app products for the StoreKit Testing server in the Products.storekit file. The project includes the Products.plist as a resource file, which contains product identifiers mapped to emoji characters.
By default, StoreKit testing in Xcode is disabled. Follow these steps to select the Products.storekit configuration file and enable StoreKit testing in Xcode:
1:Click the scheme to open the scheme menu; choose Edit Scheme.
2:In the scheme editor, choose the Run action.
3:Click Options in the action settings.
4:For the StoreKit Configuration option, select the Products.storekit configuration file.
When the app initializes a store, the system reads Products.plist and uses the product identifiers to request products from the StoreKit testing server.
Apple Payを実機で動かそうとしたら出たエラー:Select a development team~
サンプルコードを動かすためには、少々設定が必要になるようです。Select a development teamとエラーが出る場合は設定が足りていない状況になります。
当方が実施したときには、前述の設定と以下のdevelopment teamの設定を行う必要がありました。
設定を行い、以下の画面が立ち上がればWWDC2021Meet StoreKit2で使われていたサンプルコードの立ち上げが成功となります。
Shop画面の説明です。
上側のリストが一度買ったらずっと使えるアイテムを購入する画面です。
バイクや車を一度購入すると、ずっと使えるようになるイメージのサンプルコードが用意されています。バイクや車を設定する方法、値段を決める方法を学ぶことができます。
下側のリストがサブスクリプションで購入する画面です。
3つのグレードが用意されて、購入するとアプリ内でのサブスクリプションが有効になります。
サンプルコードを入手して、このページが表示できたとするとサンプルコードが動いた状態になります。
これで、課金・サブスクリプションに必要となる技術は一通り用意できているということになります。あとは、StoreKit2のソースコードを少しずつ変更していきましょう。
このソースコードはSwiftUIにて実装されているので、かなり課金アプリを立ち上げるのに参考になるかと思います。コード1行1行を読み込み、自身に必要となる機能への置き換えを検討していくことになります。
自分のiPhoneアプリに、課金・サブスクのApple Pay機能を移植する。
Xcodeの初心者は、このソースコードを参考に自分流にアレンジ・カスタマイズをしながら勉強することが、最速で技術を学ぶ第一歩になると思います。自分のアプリ上に移植した後、同じ振る舞いになるように何度も何度も試してみることが良いでしょう。
Apple Payをサンプルコードから移植時にハマったこと。
Xcodeプログラミング初心者だったので、サンプルコードを自身のアプリに移植するまで、気づいていなかったのですが、Xcodeには安定版と、ベータ版があると言うことがわかりました。
WWDCの技術は最先端の技術のため、最新のiOSバージョン環境下で、ベータ版のXcodeで実施する必要があります。
コンパイルエラーは、英語で出てきますので、まずは開発環境が最新版の環境になっているか確認してみてください。なお、このStoreKit2のサポートは、XcodeはVersion 13.0 beta 3 、iOS15での環境を設定して実施してください。
それより前Verの環境ではStoreKit機能のサンプルコードは動作しない様です。
自分のAppにApple Payを移植が完了しました。
デモが動くサンプルコードを見ながら、自身のアプリに一旦移植する事にしました。
もちろん、今後修正は必要なのですが、アプリを本格的に作り込んでいく前に、課金の考え方をアプリに入れて開発することはとても重要な事だと考えています。
売り切りのアプリケーションであれば良いのですが、今後も継続的に進化していきたいのに、一度の購入で今後、収入が得られないのは、開発者としてとても悲しい事です。
アプリのインストールの数が総収入なんて寂しすぎます。
開発者も認められるようになるべきだと考えています。Youtubeのように広告収入でも良いですし、なんらか作ったものが認められ、開発者に費用がフィードバックされるという仕組みを入れておくのは必要だとと思います。技術者の努力があるので儲けらる人がいるんです。課金を入れたら買ってくれなくなるのでは?というのは一昔前の考え方です。Appleでも広告を出すことでアプリケーションの質が下がってしまうことを懸念し、課金機能を入れるべきという動きになっています。
Apple PayのStoreKit2サンプルコードの説明
移植した結果の紹介をしていきます。ストア画面が表示できたのですが、まだ棚に商品がない状況。自身のPCで表示された環境と、デモの環境に違いがある状況でした。
次はこの違いについて考えていきたいと思います。(デモは、ショップに車の商品が並び、購入できる様になっていました。)
異なる部分は、この用意した商品を表示させることができない状況でした。この部分が、ソースコードの修正が足りないのか、設定が足りないのかを調べていきます。
結果は、設定も不要なソースコードもありませんでした。今回のサンプルコードは、MacPC上で全て動作するようになっていますので、テストを実施しても問題ありません。
始めは怖いかもしれませんが、購入画面でアプリを買ってみてください。
そうすると、画面に何もない状況からMy Itemにアイテムが表示され、アイテムごとの状況が確認できるようになります。
一通り動きが理解できたら、ソースコードを自分流に変更してみてくださいね。
さて、以下にWWDCでのプレゼンの内容を翻訳してみました。
一体どういうことができるのか、是非ともプレゼンを確認してみてください。
もう少しアプリの変更について知りたい方は以下にサンプルコードをアプリに導入した事例をまとめています。こちらのページも参考にしてみてください。
新しいApple PayのStoreKit2 APIは、製品、購入、トランザクション情報、トランザクション履歴、およびサブスクリプションステータス。
WWDC2021 Meet StoreKit2のApple Payの内容を確認する。
ロスルボー:こんにちは、WWDC21へようこそ。
私の名前はRossLeBeauで、StoreKitチームのエンジニアです。
今日はStoreKitについてお話します。
これは、実際には、クライアント側のコードの実装、アプリ内購入用のサーバーの構築、顧客のサポート、払い戻しの処理を支援するために設計された3つのセッションの1つです。
このセッションはMeetStoreKit 2であり、他の2つのセッションはここWWDC21にあります。
このセッションでは、クライアント側の機能と実装に焦点を当てます。
それでは始めましょう!
StoreKitがiOS3で導入されて以来、 それはあなたとあなたのビジネスに素晴らしい機会を生み出しました。
現在、4つのAppleプラットフォームに存在し、ゲームからニュースアプリ、インディーズタイトル、国際的なヒット曲まで、あらゆるものをサポートしています。
長年にわたり、Xcodeでのオファーコード、ファミリー共有、StoreKitテストなどの優れた機能を導入してきました。しかし、今年は最初に戻ることにしました。
本日は、StoreKit2をご紹介します。StoreKit 2は、iOS、macOS、tvOS、watchOSでアプリ内購入を操作するための最新の柔軟なSwiftAPIの新しいセットです。
Swiftファーストの考え方でStoreKitを見直しました。
最新の言語機能のいくつかを採用しました。async / awaitパターンを使用したSwiftの同時実行のように、シンプルでありながら強力なAPIを作成します。
また、アプリ内購入トランザクションにいくつかの大幅な更新を行い、より多くの情報と高いセキュリティを提供しながら、操作をはるかに簡単にしました。
また、ビジネスの成長に使用できるより深い洞察を提供するために、サブスクリプション専用のより強力なAPIを追加しました。
StoreKit2 APIは、現在存在する同じStoreKitフレームワーク内に存在し、すべてのAPIを置き換えるのではなく、コアのアプリ内購入エクスペリエンスに重点を置いています。
新しいStoreKit2 APIは、製品、購入、トランザクション情報、トランザクション履歴、およびサブスクリプションステータス。
今日は、これらの各領域の概要を説明します。同僚のJakobが、対応するStoreKit 2APIを実際のコードで使用する方法を紹介します。
それでは、まず、StoreKitの構成要素である製品と購入から始めましょう。
StoreKit 2製品構造体は、使い慣れたStoreKit製品オブジェクトのスーパーチャージャーバージョンです。まず、製品タイプや拡張サブスクリプション情報などの追加データを追加しました。
StoreKit 2を使用すると、顧客が紹介オファーの対象かどうかを確認するなどの作業が簡単になります。また、StoreKit2製品に新機能との上位互換性を持たせています。
これは、製品に直接添え字を付けることで製品に含まれるデータを取得できるBackingValueと呼ばれるラッピングタイプを追加することで実現しました。つまり、将来的に製品にデータを追加した場合、古いバージョンのStoreKit 2を搭載したオペレーティングシステムを実行しているSDKやデバイスでも、StoreKit2でいつでもデータにアクセスできるようになります。
つまり、最新のバージョンを使用できます。特長新機能を提供するために、あなたの顧客ベースのより大きな部分に。
StoreKit 2では、商品タイプ自体の静的関数を呼び出して商品をリクエストします。これは、既存のSKProductsRequestと同じように、AppStoreから製品メタデータを要求します。しかし、新しいSwift同時実行非同期/待機パターンのおかげで、StoreKit2製品リクエストには1行のコードしか必要ありません。
同様に、StoreKit 2で製品を購入することは、もう1つの単純な1行のタスクです。購入は、商品タイプのインスタンスメソッドになりました。
つまり、取得したばかりの商品を取得して、直接購入を呼び出すことができます。
購入方法もasync / awaitを使用するため、コードでインライン購入の結果を取得します。
これで、すべての購入が同じであるとは限らないことがわかりました。購入行動を変更したい場合デフォルト設定以外に、StoreKit2には購入オプションがあります。
購入オプションは、購入の単一のプロパティを説明するアイテムです。
購入オプションを、購入方法に渡すセットに構成できます。
StoreKit 2には、数量やプロモーションのオファーなどの購入オプションが含まれています。
また、StoreKit 2では、アプリアカウントトークンと呼ばれる新しいオプションを追加しています。アプリアカウントトークンは、アプリのどのユーザーアカウントがトランザクションを開始および完了したかを追跡するための方法です。
これは、アプリが所有するアカウントにリンクできる、生成する不透明なトークンです。アプリアカウントトークンを生成するのは簡単です、唯一の要件は、UUID形式に準拠していることです。
購入オプションとして購入時にアプリアカウントトークンを送信すると、このトークンはその購入のトランザクション情報で返されます。
アプリアカウントトークンは、デバイス間でも、トランザクション情報に永久に残ります。
アプリが独自のアカウントシステムをサポートしている場合、これは、Apple IDや購入に使用されたデバイスに関係なく、各アプリ内アカウントがどの購入を行ったかを追跡するのに役立ちます。
そこで、AppStoreから製品を入手して購入を開始することについて話しました。
その購入が完了するとどうなりますか?ご想像のとおり、StoreKitは、暗号で署名された情報とともに、成功したトランザクションを返します。
おなじみですね。さて、StoreKit 2は、これまでで最大のアプリ内購入トランザクションのアップデートをもたらします。
まず、StoreKit 2は、トランザクションごとに個別に署名されたオブジェクトを提供します。それだけでなく、StoreKit 2以降、アプリ内購入トランザクション情報は、非常に一般的で使いやすい形式であるJSONで提供されるようになります。
また、安全な暗号化署名がStoreKitの購入の重要な部分であることがわかっているため、現在、JSONWeb署名と呼ばれるWeb全体で使用される共通の標準を使用しています。
さらに、署名されたオブジェクトに含まれるすべての情報がネイティブのStoreKit APIを介して利用できるようになり、アプリのコードでこのデータを簡単に操作できるようになります。
実際、それがいかに簡単かをお見せします。これらのAPIを実際のコードでデモンストレーションしたJakobを次に示します。
ヤコブ・スワンク:こんにちは、ヤコブです。私はStoreKitチームのエンジニアです。
今日は、アプリでStoreKit2を簡単に起動して実行できることをお見せできることにとても興奮しています。
右側には、私が作成しているPocketCarsというアプリがあります。
このセッションのリソースセクションでこのアプリのサンプルコードをダウンロードして、フォローすることができます。
アプリには2つの主要なビューがあります。集めた車の眺めと店の眺めがあります。
お店に行きましょう。現在、販売可能な商品がないため、私の店は空です。
私は先に進んでそれらを今実装するつもりです。
すばやく起動して実行するために、XcodeでStoreKitテストを使用しています。
これにより、App Store Connectで製品を定義する前に、ストアを構築してテストすることができます。
私のXcodeプロジェクトでは、販売したい製品を定義するStoreKit構成ファイルをすでに作成しています。
これは、StoreKitに使用していたものと同じ構成ファイルです。
何も変更したり移行したりする必要はありません。
ここには、すべての製品IDを含むplistもあります。
アプリに組み込まれているリソースファイルとして含まれているため、実行時に使用できます。これらの商品をストアに表示するには、まず、表示する商品IDのセットを使用して商品リクエストを行う必要があります。
StoreKit 2では、Product構造体の静的メソッドを呼び出すだけでこれを実行できます。
App Storeから商品を受け取ったら、種類ごとに分けたいと思います。
Productタイプは、App Storeサーバーで定義されているタイプのプロパティを提供するようになったため、StoreKit2を使用してこれを簡単に行うことができます。
私のアプリでは、燃料、車、ナビゲーションパッケージの3種類の商品を販売しています。
燃料は消耗品です。一度使用するとなくなりますので、すべての消耗品を燃料アレイに入れます。
車は消耗品ではありません。車を購入すると、永久に所有します。
それで、私はすべての非消耗品を車の配列に入れます。
ナビゲーションパッケージは、3つのレベルのサービスを備えたサブスクリプション製品です。私の顧客は一度に1つのレベルのサービスに加入でき、定期的に請求されます。
また、サービスレベルを変更したい場合は、いつでもアップグレードまたはダウングレードできます。App Storeはサービスのレベルごとに製品を返すので、すべての自動更新可能なサブスクリプションをサブスクリプション配列に入れます。
また、各タイプの商品を最低価格から最高価格の順に並べ替えたいと思います。アプリを実行して、これまでに行ったことを確認してみましょう。
次に、ストアに移動します。
うわー!以前は私の店は空でしたが、今ではすべての商品が表示されてかなり見栄えがします。たった1行のコードで、App Storeからアプリの商品をリクエストし、受け取ったメタデータのみに基づいてそれらの商品をグループ化して並べ替えることができたため、ストアのUIを簡単に構築できました。
今では私の製品は見栄えが良いのですが、購入ボタンをタップしても何も起こりません。
それは私の店の購入方法が何もしないからです。
StoreKitで購入を開始する必要があります。
これは、商品の購入メソッドを呼び出すだけで実行できます。 ロスが述べたように、StoreKit 2は、Swiftの新しい同時実行機能を使用するためにゼロから構築されました。
これにより、アプリは購入のコードを保持し、その購入の結果をすべて同じコンテキスト内で処理して、コードを読みやすくすることができます。
購入が完了すると、PurchaseResultが返されます。このPurchaseResultは、購入が成功したかどうか、またはユーザーが購入をキャンセルしたか、購入に追加の銀行検証または親からの承認が必要かなど、他のエラー以外の状態で完了したかどうかを知らせます。
それぞれのケースを処理するために、私はそれらを切り替えるだけです。
PurchaseResultが成功状態の場合、検証結果も取得します。
検証結果には、検証済みと未検証の2つのケースが含まれます。
StoreKit 2では、トランザクションタイプには、署名されたトランザクションを表すJWSペイロードが含まれています。
アプリがStoreKit2からトランザクションを受信するたびに、トランザクションは検証プロセスを通過して、このデバイスのアプリのペイロードがAppStoreによって署名されているかどうかを確認します。
あなたはその権利を聞いた。StoreKit2がトランザクションの検証を行います。もちろん、検証結果をどのように処理するかは、完全に私と私のビジネスのニーズ次第です。
私のアプリでは、StoreKitから受け取ったこのトランザクションが検証されていることを確認します。
ここ私のストアでは、VerificationResultに使用できるcheckVerifiedメソッドを作成します。結果が未確認の場合は、自分のfailedVerificationエラーをスローして、アプリの他の部分に警告します。結果が確認されたら、トランザクションをアンラップして呼び出し元に返します。
これで、購入結果に対してこのcheckVerifiedメソッドを使用できます。最後に、トランザクションを確認したら、コンテンツをユーザーに配信します。ユーザーがコンテンツを入手したら、StoreKitにトランザクションを終了するように指示する必要があります。
次に、UIを更新できるように、それを返す必要があります。
私のアプリには、私が管理しているアカウントデータベースがあります。アプリの現在ログインしているユーザーをStoreKitの購入に含めたいので、App Storeで署名されたトランザクションを取得したときに、この情報をアプリで常に利用できます。
これを行うには、ログインしたアカウントのトークン化されたバージョンを使用してappAccountToken購入オプションを作成し、そのオプションを購入方法に渡します。OK。
購入方法の実装はすべて完了しました。アプリをもう一度実行してみましょう。
今、私たちは私の店に戻ってきました、そして私はかなり冒険的な気分です。
ずっと欲しかったのでバイクを購入します。StoreKitからの支払いシートがあり、購入が適切に開始されたことが示されています。
タップして購入を確認します。次に、StoreKitは、購入が成功したことを示すアラートを表示します。そのアラートを閉じると、購入ボタンが緑色のチェックマークに変わり、アプリがトランザクションを信頼し、バイクが配達されたことを示します。
ここで注意したいことがもう1つあります。前に述べたように、顧客は自分のアカウントで追加の検証を行う必要がある場合がありますまたは、購入が完了する前に保護者の承認が必要になります。
このような場合、product.purchase()から受け取った購入結果は保留状態になります。
つまり、顧客がアカウントの確認を完了するか、親が承認した後、アプリは完了した購入を反映するようにUIを更新する必要があります。これらのトランザクションの更新をリッスンするには、トランザクションタイプの静的プロパティを反復処理する必要があります。
このプロパティは、無限の非同期シーケンスです。つまり、forループをキャンセルするか中断することを選択するまで、StoreKitからのトランザクション更新を繰り返し処理します。
ここでは、ストアの割り当てが解除されたときに更新リスナーを明示的にキャンセルするために使用できるタスクハンドルを返すデタッチタスクを作成しています。
StoreKit 2から受け取るすべてのトランザクションと同様に、コンテンツをユーザーに配信する前に、検証結果が検証されているかどうかを確認したいと思います。
以前に定義したcheckVerifiedメソッドを使用できます。また、購入応答の場合と同様に、確認済みのトランザクションを取得したら、コンテンツをユーザーに配信する必要があります。 そしてもちろん、私は常に取引を完了する必要があります。
アプリが起動したらすぐにトランザクション更新リスナーを開始して、1つも見逃さないようにすることが非常に重要です。これは、ストアが作成されたらすぐに実行します。
これは、アプリの起動直後に発生します。更新リスナーをテストするために、Xcodeテスト環境でAsk To Buyを有効にして、保留状態での購入応答をシミュレートします。
これを行うには、StoreKit構成ファイルを選択し、[エディター]メニューで[購入を依頼を有効にする]を選択します。アプリをもう一度実行して購入しましょう。
今回は、支払いシートで確認した後、StoreKitから購入を完了するために許可を求める必要があるという新しいアラートが表示されます。先に進み、[質問]をタップします。購入応答は、保留状態でアプリに返されます。購入を承認するには、XcodeトランザクションマネージャーでStoreKitテストを開き、右上隅にある[承認]ボタンをクリックします。
すごい!トランザクションを承認した直後に、更新リスナーが確認結果を受け取り、UIがすぐに変更され、承認された購入が表示されました。
これで、新しい標準の5人乗りで巡航できます。商品のリクエスト、購入の開始、さまざまな購入結果への対応、トランザクションの整合性の確認、からの更新の受信がいかに簡単かをお見せしました。保留中のトランザクション用のAppStore。すべてStoreKit2を使用します。
次に、Rossに戻って、ユーザーのトランザクション履歴とサブスクリプションステータスの操作の概要を説明します。
ロス:うわー!これらの新しいAPIが実際に動作しているのを見るのは非常に驚くべきことです。そして自動検証、これ以上何が欲しいですか?
あれは何でしょう?あなたは暗号化が大好きで、それでも自分でデータを検証したいですか?
心配無用。StoreKit 2の自動検証はセキュリティの水準を引き上げますが、それはあなた自身の検証を完全に置き換えることを意図したものではありません。
いつものように、セキュリティは、強度、時間、および複雑さのスペクトルにあります。
検証については、少し後で説明します。まず、私と同じようにStoreKit 2トランザクションに興奮している場合は、それらを操作するための新しい方法がたくさん提供されていることを聞いていただければ幸いです。
完了したトランザクションをクエリするための新しいAPIセットを追加しますユーザーのトランザクション履歴。
StoreKit 2では、1回のAPI呼び出しでユーザーの過去のすべてのトランザクションにアクセスできます。製品の最新のトランザクションにアクセスすることもできます。
したがって、サブスクリプションの最新の更新だけを確認したい場合は、それが可能です。そして、あなたが知る必要がある一番のことは、ユーザーが現在アクセスするために支払った製品です。
そのため、その情報をCurrentEntitlementsと呼ばれる単一の関数にまとめました。
現在の資格には、ユーザーのトランザクション履歴にあるすべての非消耗品と、現在アクティブなすべてのサブスクリプショントランザクションが含まれます。
これにより、ユーザーがアプリで支払ったすべてのロックを解除するために必要なすべての情報が得られます。
また、これはユーザーが現在アクセスできる必要があるもののみを表しているため、取り消されたトランザクションは応答に含まれません。
消耗品もトランザクション履歴の永続的な部分ではないため、含まれていません。
さて、あなたは「待ちきれません!いつアプリでこれらを呼び出し始めることができますか?」と考えているに違いありません。
そうですね、StoreKit 2を使用すると、ユーザーがこれまでに完了したすべてのトランザクションを、要求するとすぐにアプリで利用できるようになります。
つまり、ユーザーがアプリを新しいデバイスにインストールすると、次のことがわかります。アプリを初めて開いたときにアクセスできる製品。
さらに、トランザクション履歴はユーザーのデバイス間で自動的に更新されます。顧客が1つのデバイスで購入すると、アプリはインストールされている他のすべてのデバイスで購入を確認できるようになります。
実際、別のデバイスで購入したときにアプリが実行されている場合は、新しいトランザクションについて通知されます。
Jakobは、アプリが起動したらすぐにトランザクションをリッスンすることが重要であると述べました。
これは、もう1つの理由です。
つまり、これはすべて、ユーザーが完了したトランザクションを復元する必要がないことを意味しますアプリが新しいデバイスに再インストールまたはダウンロードされたとき。すべてがStoreKitによって自動的にフェッチされ、最新の状態に保たれます。
しかし、人々は何百万もの場所で何百万もの方法でAppleデバイスを使用しています。
まれに、ユーザーがトランザクションを実行する必要があると考えているのにトランザクションが表示されない場合は、AppStore同期APIを使用できます。
これにより、すべてのStoreKit2トランザクションが即座に再同期されます。
これはrestoreCompletedTransactionsAPIの代わりであり、ユーザーが同期を開始できるようにするUIをアプリに提供する必要があります。
ただし、StoreKit 2の自動同期のおかげで、非常にまれなはずです。
ユーザーが手動で同期を開始する必要があること。
自動同期は、ほとんどの場合をカバーする必要があります。
ユーザーが手動同期を開始する必要がある場合は、アカウントを認証する必要があります。
このため、このAPIはユーザー入力に応じてのみ使用する必要があります。
最後に、StoreKit 2 APIを使用して行われたすべてのトランザクションは、元のStoreKit APIで利用でき、その逆も同様です。
そのため、アプリに既存のトランザクションがある場合は、使用を開始するとすぐにStoreKit 2APIでそれらを確認できます。
元のStoreKitAPIで行われた新規購入は、StoreKit 2 APIを介してすぐに利用可能になり、StoreKit2で行われた購入はすぐに利用可能になります。
更新されると、統合レシート内でも利用できるようになります。
StoreKit 2は、トランザクション履歴に加えて、ユーザーのサブスクリプションステータスに関する詳細情報を取得する方法も追加しています。
サブスクリプションステータスには3つの部分があります。
1つ目は最新のトランザクションです。これにより、このサブスクリプションで発生した最後のトランザクションに簡単にアクセスできます。これは、前に説明した最新のトランザクションを呼び出した場合と同じです。
二つ目は更新状態です。これは、サブスクリプションの現在の状態を示す列挙です。何が起こっているのか知りたいだけなら今のサブスクリプションで、この値を見てください。現在サブスクライブされているか、期限切れであるか、猶予期間内であるかなどがわかります。この値に基づいてアプリロジックを簡単に作成できるように、1か所で確認できるように設計されています。そして、サブスクリプションステータスの最後の部分は更新情報です。ここで、ユーザーのサブスクリプションに関するすべての詳細を確認できます。このデータは実際にはトランザクションなしで変更される可能性があるため、トランザクション情報には含まれていないすべての種類の情報が含まれています。
たとえば、更新情報では、自動更新ステータスを確認できます。これにより、ユーザーが自動更新をオンまたはオフにしたかどうかがわかります。
このサブスクリプションの場合。自動更新が設定されている製品IDも表示されます。したがって、ユーザーが最近サブスクリプションをダウングレードした場合は、ここでそれを確認でき、上位Tierにとどまるためのウィンバックオファーを提示する機会として使用できます。
サブスクリプションの有効期限がすでに切れている場合は、更新情報を使用して有効期限の理由を確認できます。そして、完全な更新情報には、これらすべてのデータとその他のデータに加えて、もう1つの重要な機能が含まれています。そうです、すべての暗号化マニア、更新情報はJWSを使用して署名されています!
取引情報と同様に、更新情報はサービスのロック解除の重要な部分ですマーケティングの意思決定を行います。
だから私たちはあなたにそれが有効であり、Appleから直接であることを知っているという自信を与えています。
そして、今あなたの頭の中を駆け巡っていると確信している質問に答えるために、はい、StoreKit2は自動的に更新情報を検証します。
サブスクリプションステータスAPIについて知っておくべき最後のことの1つは、ステータスの配列を返すことです。
これは、場合によっては、ユーザーが同じ製品に対して複数のサブスクリプションを持つことができるためです。
たとえば、ユーザーが製品を購読していて、ファミリー共有を通じて購読を受け取っている場合があります。
配列を確認する必要があります彼らが受ける資格のある最高レベルのサービスが何であるかを見るために。
次に、Jakobに返送して、アプリコードでこれらのトランザクション履歴とサブスクリプションステータスAPIを操作する様子を示します。
ヤコブ:ありがとう、ロス。私が取り組んでいるアプリに戻り、Rossが今話した新しいトランザクション履歴とサブスクリプションステータスAPIを使用するように更新しましょう。
以前に購入したモーターサイクルには緑色のチェックがなく、ストアビューから移動して戻った後、標準の5人乗りにも緑色のチェックがありません。
ユーザーとして、私はすでに何を購入したのかわかりません。
私のアプリはいつでも、購入した製品をStoreKitに照会できるため、アプリのUIを常に最新の状態に保つことができます。
私のStore.swiftファイルでは、isPurchasedメソッドは現在falseのみを返します。Transaction.latest(for :)を呼び出すだけで修正できます。
次に、製品IDを渡して、最新のトランザクションを取得します。
このStoreKitメソッドは、トランザクションがStoreKit2の検証チェックを通過したことを示す別の検証結果を返します。
トランザクションが検証されたことを確認し、前に作成したcheckVerifiedメソッドを使用してラップを解除します。
次に、アプリがコンテンツを配信しないことを確認します revocationDateがnilに等しいことを確認して返金されたトランザクションの場合。
また、期間の途中で顧客がより高いレベルのサービスにアップグレードしたサブスクリプションでは、isUpgradedフラグがtrueに設定されます。
アプリが顧客がサブスクライブした最高レベルのサービスを提供していることを確認したいので、isPurchasedメソッドはアップグレードされたトランザクションを無視する必要があります。
サブスクリプション製品の場合、トランザクションタイプはストーリーの一部のみを伝えます。
取引日とサブスクリプションの有効期限に加えて、次の更新日がいつか知りたいのですが、 また、顧客がサブスクリプションの自動更新をオフにしたかどうか、または次の更新期間によってサブスクリプションされているサービスのレベルが変更されるかどうか。
このすべての情報を取得するために、StoreKit2はサブスクリプションステータスAPIを提供しています。私のSubscriptionsView.swiftファイルでは、updateSubscriptionStatusメソッドがStoreKitからサブスクリプションステータスを取得し、それをユーザーに表示する役割を果たします。すべてのサブスクリプション製品は同じグループに属しているため、それらのいずれかを使用して、グループの現在のステータスを取得できます。
ストアから最初のサブスクリプション製品を選択します。製品を手に入れたら、 サブスクリプションからstatusプロパティを取得できます。とても簡単です。
ロスが述べたように、ユーザーが家族によって共有されているサブスクリプションを持っている間に、ユーザーが自分の個人的なサブスクリプションの料金を支払うことは可能です。
したがって、statusプロパティは、各サブスクリプションのすべてのステータスを含む配列を返します。
今では、プロ層に個人的にサブスクライブしている間、標準層を共有することができます。
ユーザーがアクセスできる最高レベルのサービスを利用できるようにしたいので、各ステータスを繰り返します。
次に、ステータスの状態が期限切れか取り消されているかを確認します。
これらのケースを無視し、ユーザーに何も表示したくない。それ以外の場合はすべて、renewalInfoを取得し、ストアのcheckVerifiedメソッドを使用して検証されていることを確認します。
renewalInfoが検証されたことを確認したら、サービスのレベルを以前の製品と比較します。
このチェックでは、サブスクリプションステータスに対応する製品を取得し、以前の製品と比較します。
それが上位Tierの場合は、highestStatusとhighestProductを新しいサブスクリプションに設定します。
すべてのステータスを確認し、最高レベルのサービスを決定したら、ビューのステータスと現在のサブスクリプションを設定します。 ビルドして実行しましょう。
ストアビューで、以前に購入した製品に緑色のチェックマークが表示され、すでに所有しているため、再度購入する必要がないことを示します。サブスクリプション製品の1つを購入するとどうなるか見てみましょう。
購入を確認すると、ストアにステータスが表示されます。StoreKit 2に組み込まれているAPIを使用して、ユーザーが何をサブスクライブしているのか、いつサブスクリプションが更新されるのかをユーザーに知らせることができます。
では、このMyCarsビューはどうでしょうか。購入したすべての製品が表示されるはずですが、現在は空です。これを記入するために、すべての製品を繰り返し処理してから、それぞれの最新のトランザクションを取得し、トランザクションの有効期限と返金されているかどうかを確認できますが、それは大変なことのように思えます。
ありがたいことに、StoreKit 2の機能と新しいシンプルで便利なAPIを使用して、ユーザーの有効なトランザクションをすべて取得できます。currentEntitlementsと呼ばれます。
My Carsビューで、ビューがロードされたときに購入した製品を更新するこのメソッドがあります。トランザクションの更新と同様に、現在の資格を繰り返し処理します。
ただし、トランザクションの更新とは異なり、現在のエンタイトルメントの非同期シーケンスは有限であるため、forループで永久に待機することはなく、ユーザーがさらに購入すると新しいエンタイトルメントが配信されます。
資格ごとに、他のすべてのトランザクションと同じように検証結果を確認したいと思います。
検証済みであることがわかったら、productTypeプロパティを切り替えて、資格をさまざまな配列にフィルタリングします。
元の商品リクエストで行ったのと同じです。現在の資格では、非消耗品および自動更新可能な製品のトランザクションのみが返されます。
他の製品タイプを無視して、switchステートメントを完成させ、Swiftコンパイラーを満足させることができます。
トランザクションを取得したら、関連する製品をUIに表示する必要があります。非消耗品のトランザクションについては、cars製品配列で、このトランザクションに一致する製品IDを検索します。同様に、サブスクリプションの製品配列を検索して、自動更新可能なトランザクションと一致させます。もう一度実行して、UIを確認してみましょう。
これで、[マイカー]ビューに移動すると、購入したものがすべて表示されます。
私の車はすべて上部にグループ化されており、サブスクリプションは下にあります。
今、私のアプリは完全に機能するストアを持っており、それは素晴らしく見えます!
これが、トランザクション履歴とサブスクリプションステータスAPIを使用して、ユーザーに表示されるUIについてアプリ内で情報に基づいた決定を行う方法です。
それでは、JSONWeb署名オブジェクトについてさらに詳しく説明するRossに戻りましょう。
ロス:素晴らしいデモをありがとう、ヤコブ。新しいトランザクションAPIとサブスクリプションAPIがどのように役立つかを実際に確認できます。
StoreKit 2がセキュリティのためにJWSを使用する2つの方法を見てきましたが、それを詳しく見て、独自の検証を行う方法を検討することを約束しました。
JSONWeb署名は3つの部分で構成されています。
1つ目はヘッダーで、オブジェクトに関するメタデータが含まれています。これには、署名に使用されるアルゴリズムや、署名の検証に使用される証明書の場所などの重要な情報が含まれています。
StoreKit 2は現在、CryptoKitを使用してSwiftでネイティブにサポートされているECDSAアルゴリズムを使用しています。
証明書の場合、StoreKit 2はx5cヘッダーを使用します。
これは、証明書チェーン全体がJWSデータに含まれていることを示します。
これは、インターネット接続が必要ないことを意味しますこれらのJWS署名を検証するため。
JWSデータの次の部分はペイロードです。
これは、トランザクションID、製品ID、購入日などの主要な情報です。
署名を検証したら、ここでトランザクションまたはサブスクリプションについて知りたいすべてのデータを読み取ります。
そして、JWSデータの最後の部分は署名そのものです。
これは、ヘッダーとペイロードの両方を使用して生成されます。JWS署名の検証は、標準の十分に文書化された部分であるため、独自の実装を作成することに興味がある場合は、元のソースに直接アクセスすることをお勧めします。
このドキュメントへのリンクをリソースに含めましたこのセッションに関連付けられています。
JWSデータから署名を検証したら、署名された情報がアプリと現在のデバイスで有効であることを確認するために、さらにいくつかのことを行う必要があります。
まず、署名された情報ペイロードに存在するバンドルIDがアプリのバンドルIDと一致することを確認する必要があります。
セキュリティを強化するために、API呼び出しに依存するのではなく、アプリのバンドルIDをアプリのどこかに埋め込み、その値を使用してペイロードのバンドルIDと比較することをお勧めします。
そして、最後にすべきことは、デバイス検証チェックを実行することです。これにより、署名された情報が実際に生成されたことが保証されます現在オンになっているデバイスの場合。
StoreKit 2 API AppStore.deviceVerificationIDを使用して、現在のデバイス検証識別子を取得します。
次に、署名された情報からデバイス検証ナンスを取得し、StoreKitから取得したデバイス検証識別子を追加します。
この値に対してSHA384ハッシュを実行し、その結果を署名された情報のデバイス検証フィールドと比較します。それらが一致する場合、署名された情報がこのデバイス用に生成され、署名された情報の検証が完了します。
最後に注意すべき点は、これらの新しいJWSオブジェクトはアプリ内購入専用であるということです。したがって、アプリの領収書を検証する必要がある場合は、そのために既存のAPIとプロセスを使用する必要があります。
そしてもちろん、これらの新しいJWSオブジェクト用の新しいApp StoreサーバーAPIを提供しているため、サーバー上で直接それらを取得して検証できます。
さて、今日紹介したのと同じように、StoreKit2に会えて興奮していたことを願っています。
StoreKit 2は、より多くの情報を提供し、かつてないほど使いやすい新しいAPIを使用して、アプリ内購入をさらに改善しています。
これには、各トランザクションの新しいJSONベースの情報オブジェクトと、ネイティブコードでトランザクションの詳細と履歴トランザクションデータを提供するAPIが含まれます。
それを新しいサブスクリプションステータスAPIと組み合わせて、StoreKit 2は、アプリ内購入のさまざまな可能性を解き放ちます。
アプリ内購入の詳細については、サーバー側のコーディングと顧客のサポートに関するこれらの他のセッションをご覧になることをお勧めします。
Jakobと私はStoreKit2を紹介できることに興奮しています。WWDC21にご参加いただきありがとうございます。♪
コメント