Android アプリ内課金 (IAP) ストアにおける、ストア間を横断してプロダクトをインストールする場合の問題
Windows Store

iOS & Mac App Store

拡張機能

アプリ レシートを読む

アプリ レシートはデバイスのローカルに保管され、以下のようにして読むことができます。

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
string receipt = builder.Configure<IAppleConfiguration>().appReceipt;

支払い制限の確認

アプリ内課金はデバイスの設定で制限されている場合があります。以下のようにして、確認できます。

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
bool canMakePayments = builder.Configure<IAppleConfiguration>().canMakePayments;

トランザクションの復元

Apple プラットフォームにおいて、以前のトランザクションを取得するには、ユーザーがパスワードを入力する必要があります。アプリケーションは、ユーザーにそうさせるためにボタンを表示します。このプロセスの間 IStoreListenerProcessPurchase メソッドは、ユーザーがすでに所有しているすべてのものから呼び出されます。

/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    extensions.GetExtension<IAppleExtensions> ().RestoreTransactions (result => {
        if (result) {
            // This does not mean anything was restored,
            // merely that the restoration process succeeded.
        } else {
            // Restoration failed.
        }
    });
}

アプリ レシートのリフレッシュ

Apple は、サーバーから新しいアプリ レシートをフェッチする方法を提供しています。この方法は通常、レシートが現在ローカルにキャッシュされていない場合に使用できます。SKReceiptRefreshRequest

この方法にはパスワードが必要だということに気を付けてください。

このメソッドは、Unity IAP によって以下のように利用できます。

/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    extensions.GetExtension<IAppleExtensions> ().RefreshAppReceipt (receipt => {
        // This handler is invoked if the request is successful.
        // Receipt will be the latest app receipt.
        Console.WriteLine(receipt);
    },
    () => {
        // This handler will be invoked if the request fails,
        // such as if the network is unavailable or the user
        // enters the wrong password.
    });
}

Ask to Buy

iOS 8 からペアレンタルコントロールに新しい機能が追加されました。Ask to Buy

Ask to Buy は子供が課金を行う前に親の許可を求める機能です。この機能を使うと Unity IAP は以下のようにリスナーを登録することでアプリが通知を受け取ることができるようになります。

/// <summary>
/// This will be called when Unity IAP has finished initialising.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    extensions.GetExtension<IAppleExtensions>().RegisterPurchaseDeferredListener(product => {
        Console.WriteLine(product.definition.id);
    });
}

親が購入を許可したら通常イベントの ProcessPurchase、却下したら通常イベントの OnPurchaseFailed が呼び出されます。

テスト

Apple ストアでテストをするには ITunes Connect でテストアカウントを作成し、そのテストアカウントで iTunes に接続しなければいけません。

iOS デバイスや Mac でストアからサインアウトして、アプリを起動し、課金やリストアを行うときにどのアカウントでログインするかを求められます。

NoProductsAvailable が原因で初期化に失敗したときは以下の内容を確認してください。

  • iTunes Connect で作成したプロダクト ID が Unity IAP のプロダクト ID と一致しているかどうか。
  • アプリ内課金の設定が iTunes Connect で有効になっているかどうか。
  • プロダクトが iTunes Connect で販売可能な状態になっているかどうか。
  • iTunes Connect で作成したプロダクトが購入可能になるまで数時間かかることがあります。
  • iTunes Connect の最新のデベロッパー契約に同意して、有効な振込先の情報を記入しているかどうか。

Mac App Store

Unity のビルド設定で Mac のスタンドアロン用に Mac App Store validation にチェックを入れておく必要があります。

アプリをビルドしたら、info.plist のバンドル ID とバージョン設定を更新する必要があります。.app ファイル上で右クリックして パッケージの内容を表示 を選択し、info.plist ファイルの CFBundleIdentifier の値をアプリのバンドル ID へと変更します。

そして署名をした後に、パッケージとアプリをインストールします。そのための操作は Mac OSX 上のターミナルで行います。

codesign -f --deep -s "3rd Party Mac Developer Application: " your.app/Contents/Plugins/unitypurchasing.bundle
codesign -f --deep -s "3rd Party Mac Developer Application: " your.app
productbuild --component your.app /Applications --sign "3rd Party Mac Developer Installer: " your.pkg

正しくパッケージをインストールするには、パッケージ化していない .app ファイルを削除しておく必要があります。

そして、アプリケーション フォルダーからアプリを起動します。初回は iTunes アカウントの詳細を入力するよう求められるので、iTunes Connect で作成したテストアカウントでログインします。これでテストアカウントがサンドボックス環境で課金を行うことができます。

Android アプリ内課金 (IAP) ストアにおける、ストア間を横断してプロダクトをインストールする場合の問題
Windows Store