iOS のアプリ内購入サービスの使用
IOS アプリケーションの作成 への移動
アプリ内決済サービスを利用すると、アプリケーション内でデジタル コンテンツを直接販売することができます。iOS のアプリ内購入は、iOS のアプリ内決済サービスです。このトピックでは、FireMonkey を使ってアプリケーションで iOS のアプリ内購入にアクセスする方法を説明します。
- メモ: 続行する前に、「iOS モバイル アプリケーション開発」 を参照してください。以下の情報は、iOS 開発についての主なドキュメント トピックを補完するものです。
目次
サポートされているデバイス
FireMonkey では、サポート対象のすべての iOS デバイスで iOS のアプリ内購入をサポートしています。
- メモ: iOS シミュレータはサポートされていません。
前提条件
iOS のアプリ内購入サービスを使用するには、開発環境の準備以外に、以下を行っておく必要があります。
- iOS アプリケーションにコード署名をする準備ができている必要があります。「iOS モバイル アプリケーション開発」の「アプリケーションのコード署名準備」セクションを参照してください。
- アプリケーションの App ID を作成するときには、
com.mycompany.myapp
のように、そのアプリケーションに特有の明示的な App ID を使用する必要があります。com.mycompany.*
などのワイルドカード App ID を使用することはできません。
- アプリケーションの App ID を作成するときには、
- Apple と有料アプリケーション契約を締結していなければなりません。締結は、「契約、税金、銀行の管理」に記載された手順で行ってください。
iTunes Connect のアプリ内購入を使用するためのアプリケーションの構成
アプリケーションで iOS のアプリ内購入サービスを使用し、テストできるようにするには、まず iTunes Connect にアプリケーションのエントリを作成する必要があります。
アプリケーションのエントリを作成したら、iTunes Connect の Manage Your Apps モジュールでアプリケーションの[App Summary]ページを開き、ページ右側にある[Manage In-App Purchases]をクリックします。
表示されたページで、アプリケーションのアプリ内購入を管理することができます。たとえば、アプリケーション内で販売するアプリ内購入製品を作成するなどです。
TInAppPurchase では、消費型と非消費型のアプリ内購入製品をサポートしています。このような製品の種類の詳細は、「About In-App Purchase Products」(アプリ内購入製品について)を参照してください。
- メモ: 定期購買のような種類は現在サポートされていません。
モバイル アプリケーションへの iOS のアプリ内購入機能の追加
アプリケーションでは、このコンポーネントのインスタンスをアプリケーションに追加し、アプリケーションの起動時またはその他の任意の時点で対象のアプリ内決済サービスへの接続を確立する必要があります。そうすれば、サービスを使用することができます。アプリ内決済サービスへの接続を確立したら、次のようなことを行うことができます。
- アプリケーションの製品についての情報を要求する。アプリ内決済サービスに接続した後で、少なくとも 1 度はアプリケーションでこれを行う必要があります。
- 製品を購入する。
- 製品を消費する。アプリケーションで消費型製品を処理し、消費したことをアプリ内決済サービスに知らせます。
- ユーザーが別のデバイスで購入した製品を現在のデバイスにリストアする。ユーザーが要求したときに行う必要があります。たとえば、アプリケーションにそのための[リストア]ボタンを用意するなどが考えられます。
アプリ内決済サービスへの接続を確立する
アプリ内決済サービスを使用する前に、アプリ内決済サービスに接続できるよう TInAppPurchase を構成し、接続を確立する必要があります。
アプリ内決済サービスの接続データを構成する
iOS で iOS のアプリ内購入サービスに接続する場合、TInAppPurchase は特別な構成の必要がなく、そのまま動作するはずです。ただし、アプリケーションは次の状態になっていなければなりません。
アプリ内決済サービスに接続する
対象のアプリ内決済サービスに接続するには SetupInAppPurchase を呼び出します。この手続きは非同期で、終了すると OnSetupComplete イベントが発生します。OnSetupComplete にイベント ハンドラを関連付けたい場合には、SetupInAppPurchase を呼び出す前に行います。
InAppPurchase1.OnSetupComplete := InAppPurchase1SetupComplete;
InAppPurchase1.SetupInAppPurchase;
通常は、OnSetupComplete にイベント ハンドラを関連付けて、対象のサービスに接続した直後に製品リストを要求します。あるいは、IsSetupComplete を呼び出して、特定の時点でサービスを使用できるか(True
)できないか(False
)を確認することもできます。
アプリ内決済サービスを使用する
アプリ内決済サービスへの接続を確立したら、以下の処理を行うことができます。
製品リストの情報を取得する
アプリケーションでは、そのアプリケーションで購入可能な製品の ID のリストを保持する必要があります。このリストはTInAppPurchase.ProductIDs プロパティに保持します。任意の時点で QueryProducts を呼び出して、その ID の製品に関する情報(その製品が購入済みかどうかなど)を要求することができます。
エラーが起きると、TInAppPurchase.OnError が発生します。そのときの FailureKind
は ProductsRequest です。
要求が成功すると、TInAppPurchase.OnProductsRequestResponse が発生します。このイベントには 2 つの製品リストが含まれます。
Products
: TProduct のインスタンスを含む TList。有効な製品と購入済みの製品のリストです。InvalidProductIDs
: TStrings。無効な製品の ID のリストです。
ユーザーが既に購入した製品と単に購入可能である製品とを区別するには、引数に製品の ID を渡して IsProductPurchased を呼び出します。
if InAppPurchase1.IsProductPurchased(ProductID) then { Do something. }
- メモ: 製品のリストに購入済みの消費型製品が含まれている場合には、このタイミングでその製品を消費します。
TProduct には数多くのプロパティが用意されており、それを読み取って各製品の情報を取得することができます。
製品を購入する
ユーザーに製品を購入させる前に、CanMakeInAppPurchases を呼び出して、ユーザーが購入を許可されているか(True
)いないか(False
)を確認してください。
if not InAppPurchase1.CanMakeInAppPurchases then { Disable or hide the in-app payments GUI elements of your application. }
アプリ内決済サービスから返された購入可能な製品のリストに含まれる製品の購入を要求するには、製品 ID を引数に渡して PurchaseProduct を呼び出します。
InAppPurchase1.PurchaseProduct(ProductID);
エラーが起きると、TInAppPurchase.OnError が発生します。そのときの FailureKind
は Purchase です。
購入が成功すると、TInAppPurchase.OnPurchaseCompleted が発生します。このイベントには購入した製品の ID が含まれていて、イベントの NewTransaction
パラメータは、製品を購入したときには True
に、リストアしたときには False
になっています。このイベント ハンドラを使用して購入済みの製品を管理することができます。たとえば、購入した製品が消費型の製品である場合には、消費を行います。
製品を消費する
- メモ: TInAppPurchase では、製品が消費型か非消費型かを判断するメソッドを提供していません。アプリケーション内で独自に区別する必要があります。たとえば、消費型または非消費型の製品 ID のリストをアプリケーション内にハードコードするなどの方法があります。
消費型の製品とは、複数回購入できる製品です。ユーザーが消費型の製品を購入したときには、アプリケーションで ConsumeProduct を呼び出して、その製品が消費されたことをアプリ内決済サービスに知らせる必要があります。
InAppPurchase1.ConsumeProduct(ProductID);
-
- メモ:
- 製品 ID のリストを渡して ConsumeProducts を呼び出しても構いません。
- iOS のアプリ内購入では、製品の消費について知らせる必要はありません。
- メモ:
上記いずれかのメソッドを呼び出して製品を消費すると、結果として以下のいずれかのイベントが発生します。
- TInAppPurchase.OnConsumeCompleted: 製品の消費が成功した場合。このイベント処理として、アプリケーション内で購入の処理を行います。たとえば、アプリケーション内でクッキーの数をカウントしていて、ユーザーが "クッキー 5 個" を購入した場合、アプリケーションでクッキー数を 5 だけ増やすことができます。
- TInAppPurchase.OnConsumeFailed: エラーが発生して製品を消費できない場合。このイベントの
ErrorMessage
引数にエラーの詳細説明が含まれています。
別のデバイスで購入した製品を現在のデバイスにリストアする
Google Play のアプリ内課金では、ユーザーの非消費型製品は、そのユーザーのどのデバイスにおいても、常に購入済みとして表示されます。何もしなくても、それらの購入した製品はリストアされます。
iOS のアプリ内購入では、ユーザーの非消費型製品は、ユーザーが別のデバイスを使用した場合にデフォルトで購入済みとして表示されません。別のデバイスで購入した製品を現在のデバイスにリストアするには、RestorePurchasedProducts を呼び出す必要があります。製品をリストアすると(これは無料でその製品を購入するのと似ています)、TInAppPurchase.OnPurchaseCompleted が発生します。そのときの NewTransaction
パラメータの値は False
です。このイベントを処理して、リストアされた購入済み製品を管理してください。
- メモ:
- 以前に購入した製品をユーザーが再び購入しようとした場合には、無料で購入できます。
- 購入済み製品をリストアすると、ユーザーの App Store 資格情報を入力するよう求められます。購入済み製品のリストアを自動的に行うべきではありません。そうではなく、たとえば[リストア]ボタンを使用して、ユーザーにリストア操作を手動で開始させるなどします。
iTunes 上の製品コンテンツをダウンロードする
iOS のアプリ内購入サービス向けに iTunes 上の製品を定義するときには、コンテンツを iTunes にアップロードしてそのコンテンツを製品と関連付け、アプリケーションでそのコンテンツを iTunes からダウンロードできるようにします。
ユーザーが製品を購入したり購入済みの製品をリストアすると、TInAppPurchase コンポーネントは、製品のダウンロード可能なコンテンツのダウンロードを自動的に開始します。コンテンツのダウンロードが始まると TInAppPurchase.OnDownloadProgress が発生するため、ダウンロードの進捗や推定残り時間を把握することができます。ダウンロードが終了すると、TInAppPurchase.OnDownloadCompleted が発生します。このイベントによってダウンロードしたファイルのローカル パスが示されるので、ファイルを開くことができます。
- メモ: 1 つの製品に複数のダウンロード可能ファイルが関連付けられている場合があります。ダウンロード可能ファイルにはそれぞれ独自の ID が付けられており、OnDownloadCompleted には製品の ID とダウンロードしたコンテンツの ID の両方が含まれています。
製品リストを問い合わせたときに iOS のアプリ内購入サービスから返された TProduct のインスタンスには、製品のダウンロード可能コンテンツについて以下の情報が含まれています。
- TProduct.Downloadable: その製品にダウンロード可能なコンテンツがあるかどうかを示します。
- TProduct.DownloadContentLengths: 製品に関連付けられたダウンロード可能ファイルそれぞれのサイズを含む配列です。
- TProduct.DownloadContentVersion: 製品のダウンロード可能コンテンツのどのバージョンがダウンロードできるかを示します。
アプリケーションでは、製品のダウンロード可能コンテンツのバージョンを管理する必要があります。TProduct.DownloadContentVersion が、初めて iTunes からコンテンツをダウンロードしたときと同じバージョンでなければ、コンテンツを再ダウンロードして、ユーザーの購入済みコンテンツを最新バージョンにすることができます。ダウンロード済みコンテンツをアップデートするには、TCustomInAppPurchase.RestorePurchasedProducts を呼び出します。最新コンテンツのダウンロード時には、ダウンロード関連のイベント OnDownloadProgress および OnDownloadCompleted が再び発生します。
アプリ内での製品購入のテスト
アプリ内での製品購入は、iTunes Connect テスト用ユーザー アカウントを使って、料金を発生させずにテストすることができます。「Testing In-App Purchase Products」(アプリ内での製品購入をテストする)を参照してください。