アプリ レシートはデバイスのローカルに保管され、以下のようにして読むことができます。
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 プラットフォームにおいて、以前のトランザクションを取得するには、ユーザーがパスワードを入力する必要があります。アプリケーションは、ユーザーにそうさせるためにボタンを表示します。このプロセスの間 IStoreListener
の ProcessPurchase
メソッドは、ユーザーがすでに所有しているすべてのものから呼び出されます。
/// <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.
});
}
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
が原因で初期化に失敗したときは以下の内容を確認してください。
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 で作成したテストアカウントでログインします。これでテストアカウントがサンドボックス環境で課金を行うことができます。