Unity IAP を使用してアプリ内で課金イベントを受け取るには IStoreListener
インターフェースを実装したクラスを作成する必要があります。
リスナーの実装と構成を行う初期化処理は UnityPurchasing.Initialize
を呼び出すことで開始されます。
ネットワークが利用不可である場合は初期化に失敗します。その際、Unity IAP はバックグラウンドで初期化処理をリトライし続けます。設定にミスがあったりデバイス設定で IAP が無効になっていたりして、Unity IAP が回復できない問題になった場合、初期化のみ失敗します。
よって、Unity IAP は初期化に時間がかかるかもしれません。とくにユーザーがデバイスを機内モードにしている場合は無期限に時間がかかります。初期化が正常に行われていない状態で課金しようとしているユーザーに対して、課金処理を行わせないようにするような設計を実装する必要があります。
using UnityEngine;
using UnityEngine.Purchasing;
public class MyIAPManager : IStoreListener {
private IStoreController controller;
private IExtensionProvider extensions;
public MyIAPManager () {
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
builder.AddProduct("100_gold_coins", ProductType.Consumable, new IDs
{
{"100_gold_coins_google", GooglePlay.Name},
{"100_gold_coins_mac", MacAppStore.Name}
});
UnityPurchasing.Initialize (this, builder);
}
/// <summary>
/// Unity IAP が購入処理を行える場合に呼び出されます
/// </summary>
public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
{
this.controller = controller;
this.extensions = extensions;
}
/// <summary>
/// Unity IAP 回復不可能な初期エラーに遭遇したときに呼び出されます。
///
/// これは、インターネットが使用できない場合は呼び出されず、
/// インターネットが使用可能になるまで初期化を試みます。
/// </summary>
public void OnInitializeFailed (InitializationFailureReason error)
{
}
/// <summary>
/// 購入が終了したときに呼び出されます。
///
/// OnInitialized() 後、いつでも呼び出される場合があります。
/// </summary>
public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
{
return PurchaseProcessingResult.Complete;
}
/// <summary>
/// 購入が失敗したときに呼び出されます。
/// </summary>
public void OnPurchaseFailed (Product i, PurchaseFailureReason p)
{
}
}