Before the I updated my macos and xcode, Unity IAP worked fine. But since Apple doesn’t accept any update targeting under iOS 18, so I had to update my macOS and XCode to the latest version.
After then, now all Unity IAP functions not working anymore. All purchased transactions go nuts, can’t validate receipts, weird product name displayed in initialization process, purchasing the product just go fail.
These are the full logs from XCode:
UnityIAP UnityEarlyTransactionObserver: Created
UnityIAP UnityEarlyTransactionObserver: Registered for lifecycle events
CrashReporter: initialized
Built from '2020.3/staging' branch, Version '2020.3.38f1 (8f5fde82e2dc)', Build type 'Release', Scripting Backend 'il2cpp'
MemoryManager: Using 'Default' Allocator.
CLIENT OF UIKIT REQUIRES UPDATE: This process does not adopt UIScene lifecycle. This will become an assert in a future version.
-> applicationDidFinishLaunching()
Setting UIViewControllerBasedStatusBarAppearance to NO is no longer supported.
Apple actively discourages that, and all application-wide methods of changing status bar appearance are deprecated
UnityIAP UnityEarlyTransactionObserver: Added to the payment queue
-> applicationDidBecomeActive()
UnityIAP: Requesting 49 products
UnityIAP: Requesting product data...
UnityIAP: Received 36 products
Unavailable product ezi_unlock_skillslot_3-ezi_unlock_skillslot_3
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_unlock_skillslot_4-ezi_unlock_skillslot_4
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_military_boots-ezi_military_boots
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_military_medikit-ezi_military_medikit
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_nuke-ezi_skin_nuke
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_army-ezi_skin_army
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_navy-ezi_skin_navy
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_oni-ezi_skin_oni
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_neon-ezi_skin_neon
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_emergency-ezi_skin_emergency
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_heg-ezi_skin_heg
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_desert-ezi_skin_desert
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unavailable product ezi_skin_jungle-ezi_skin_jungle
UnityEngine.Purchasing.PurchasingManager:HasAvailableProductsToPurchase(Boolean)
UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
IAP Initialized.
ExtinctionGame.IAPManager:OnInitialized(IStoreController, IExtensionProvider)
UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
UnityIAP: Transaction 1000000863588501 not pending, nothing to finish here
UnityIAP: Transaction 1000000863931468 not pending, nothing to finish here
UnityIAP: Transaction 1000000895398964 not pending, nothing to finish here
UnityIAP: Transaction 1000000907037036 not pending, nothing to finish here
UnityIAP: Transaction 1000000924770007 not pending, nothing to finish here
UnityIAP: Transaction 2000000135051706 not pending, nothing to finish here
UnityIAP: Transaction 2000000200771014 not pending, nothing to finish here
UnityIAP: Transaction 2000000289297582 not pending, nothing to finish here
UnityIAP: Transaction 2000000322219484 not pending, nothing to finish here
UnityIAP: Transaction 2000000456826744 not pending, nothing to finish here
UnityIAP: Transaction 2000000538004649 not pending, nothing to finish here
UnityIAP: Transaction 2000000791657176 not pending, nothing to finish here
UnityIAP: Transaction 2000000900187551 not pending, nothing to finish here
UnityIAP: Transaction 1000000841347384 not pending, nothing to finish here
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
UnityIAP: Transaction 1000000901499453 not pending, nothing to finish here
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
UnityIAP: Transaction 2000000222372629 not pending, nothing to finish here
UnityIAP: Transaction 2000000300196513 not pending, nothing to finish here
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
Unity IAP: Unable to confirm purchase; Product has missing or empty transactionID
UnityIAP: Refresh app receipt
UnityIAP: Transaction 1000000863588501 not pending, nothing to finish here
UnityIAP: Transaction 1000000863931468 not pending, nothing to finish here
UnityIAP: Transaction 1000000895398964 not pending, nothing to finish here
UnityIAP: Transaction 1000000907037036 not pending, nothing to finish here
UnityIAP: Transaction 1000000924770007 not pending, nothing to finish here
UnityIAP: Transaction 2000000135051706 not pending, nothing to finish here
UnityIAP: Transaction 2000000200771014 not pending, nothing to finish here
UnityIAP: Transaction 2000000289297582 not pending, nothing to finish here
UnityIAP: Transaction 2000000322219484 not pending, nothing to finish here
UnityIAP: Transaction 2000000456826744 not pending, nothing to finish here
UnityIAP: Transaction 2000000538004649 not pending, nothing to finish here
UnityIAP: Transaction 2000000791657176 not pending, nothing to finish here
UnityIAP: Transaction 2000000900187551 not pending, nothing to finish here
UnityIAP: Transaction 1000000841347384 not pending, nothing to finish here
UnityIAP: Transaction 1000000901499453 not pending, nothing to finish here
UnityIAP: Transaction 2000000222372629 not pending, nothing to finish here
UnityIAP: Transaction 2000000300196513 not pending, nothing to finish here
UnityIAP: Add transaction observer
UnityIAP: UpdatedTransactions
UnityIAP UnityEarlyTransactionObserver: Request to initiate queued payments
<SKReceiptRefreshRequest: 0x15148d780>: Finished refreshing receipt with error: Error Domain=ASDErrorDomain Code=603 "Request throttled" UserInfo={NSLocalizedDescription=Request throttled, NSLocalizedFailureReason=Unified receipt is valid and current}
UnityIAP: RefreshReceipt status 1
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
ExtinctionGame.IAPManager:<OnInitialized>b__9_0(String)
System.Action`1:Invoke(T)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()
Failed to buy product.
UnityEngine.Events.UnityAction:Invoke()
UnityEngine.Events.UnityEvent:Invoke()
UnityEngine.EventSystems.EventFunction`1:Invoke(T1, BaseEventData)
UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
UnityEngine.EventSystems.StandaloneInputModule:Process()
This is my code:
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Security;
using IAPSetting = GameSettings.InAppPurchase;
using ExtinctionGame.Event;
namespace ExtinctionGame {
public class IAPManager : GlobalSingleton<IAPManager>, IStoreListener {
// The Unity Purchasing system
private static IStoreController m_StoreController;
// The store-specific Purchasing subsystems
private static IExtensionProvider m_StoreExtensionProvider;
private static bool m_PreviousPurchaseInProgress = false;
public static bool Initialized => m_StoreController != null && m_StoreExtensionProvider != null;
protected override void OnInitialize() {
base.OnInitialize();
if (m_StoreController == null) {
InitializePurchasing();
}
ApplicationEventManager.OnIAPPurchaseSuccess.AddListener(HandleIAPPurchaseSuccess);
ApplicationEventManager.OnIAPPurchaseFailure.AddListener(HandleIAPPurchaseFailure);
}
private static string GetProductId(IAPProduct product) {
switch (product) {
case IAPProduct.BasicCashPack:
return "ezi_basic_cash_pack";
case IAPProduct.MediumCashPack:
return "ezi_medium_cash_pack";
case IAPProduct.LargeCashPack:
return "ezi_large_cash_pack";
case IAPProduct.HugeCashPack:
return "ezi_huge_cash_pack";
case IAPProduct.MegaCashPack:
return "ezi_mega_cash_pack";
// DLC Weapons
case IAPProduct.BallisticKnife:
return "ezi_dlc_ballistic_knife";
case IAPProduct.Warhammer:
return "ezi_dlc_warhammer";
case IAPProduct.USP:
return "ezi_dlc_usp45";
case IAPProduct.MK18MOD1:
return "ezi_dlc_mk18_mod1";
case IAPProduct.KSG:
return "ezi_dlc_ksg";
case IAPProduct.GSG16:
return "ezi_dlc_gsg16";
case IAPProduct.Nailgun:
return "ezi_dlc_nailgun";
case IAPProduct.Beretta93R:
return "ezi_dlc_b93r";
case IAPProduct.MSG90:
return "ezi_dlc_msg90";
case IAPProduct.MG3:
return "ezi_dlc_mg3";
case IAPProduct.M99:
return "ezi_dlc_m99";
case IAPProduct.M95:
return "ezi_dlc_m95";
case IAPProduct.RagingJudge:
return "ezi_dlc_raging_judge";
case IAPProduct.M32:
return "ezi_dlc_m32";
case IAPProduct.M16M203:
return "ezi_dlc_m16_m203";
case IAPProduct.PSRL1:
return "ezi_dlc_psrl1";
case IAPProduct.M202:
return "ezi_dlc_m202";
case IAPProduct.M82:
return "ezi_dlc_m82";
case IAPProduct.VEPR12:
return "ezi_dlc_vepr12";
case IAPProduct.RPK16:
return "ezi_dlc_rpk16";
case IAPProduct.MP510:
return "ezi_dlc_mp510";
case IAPProduct.XM2HGL:
return "ezi_dlc_xm2hgl";
// DLC Items
case IAPProduct.DoubleExp:
return "ezi_item_double_exp";
case IAPProduct.SkillSlot3:
return "ezi_unlock_skillslot_3";
case IAPProduct.SkillSlot4:
return "ezi_unlock_skillslot_4";
// DLC Gadgets
case IAPProduct.MilitaryArmor:
return "ezi_military_armor";
case IAPProduct.MilitaryAmmoBelt:
return "ezi_military_ammobelt";
case IAPProduct.MilitaryBoots:
return "ezi_military_boots";
case IAPProduct.MilitaryMedkit:
return "ezi_military_medikit";
case IAPProduct.HeavyBlastArmor:
return "ezi_heavy_blast_armor";
// DLC Utilities
case IAPProduct.TranquilizerRifle:
return "ezi_dlc_tranquilizer_rifle";
case IAPProduct.MobileShotgunSentryGun:
return "ezi_dlc_mobile_shotgun_sentrygun";
case IAPProduct.Pipebomb:
return "ezi_dlc_pipebomb";
case IAPProduct.SmartProximityMine:
return "ezi_dlc_smart_proximity_mine";
case IAPProduct.Sevenbang:
return "ezi_dlc_sevenbang";
// Skins
case IAPProduct.SkinNuke:
return "ezi_skin_nuke";
case IAPProduct.SkinArmy:
return "ezi_skin_army";
case IAPProduct.SkinNavy:
return "ezi_skin_navy";
case IAPProduct.SkinOni:
return "ezi_skin_oni";
case IAPProduct.SkinNeon:
return "ezi_skin_neon";
case IAPProduct.SkinEmergency:
return "ezi_skin_emergency";
case IAPProduct.SkinHEG:
return "ezi_skin_heg";
case IAPProduct.SkinDesert:
return "ezi_skin_desert";
case IAPProduct.SkinJungle:
return "ezi_skin_jungle";
default:
throw new System.Exception("Invalid IAPProduct: " + product.ToString());
}
}
private static IAPProduct GetIAPProductByProductId(string productId) {
if (productId.Equals("ezi_basic_cash_pack")){
return IAPProduct.BasicCashPack;
}
else if (productId.Equals("ezi_medium_cash_pack")){
return IAPProduct.MediumCashPack;
}
else if (productId.Equals("ezi_large_cash_pack")){
return IAPProduct.LargeCashPack;
}
else if (productId.Equals("ezi_huge_cash_pack")){
return IAPProduct.HugeCashPack;
}
else if (productId.Equals("ezi_mega_cash_pack")){
return IAPProduct.MegaCashPack;
}
else if (productId.Equals("ezi_dlc_ballistic_knife")){
return IAPProduct.BallisticKnife;
}
else if (productId.Equals("ezi_dlc_warhammer")){
return IAPProduct.Warhammer;
}
else if (productId.Equals("ezi_dlc_usp45")){
return IAPProduct.USP;
}
else if (productId.Equals("ezi_dlc_mk18_mod1")){
return IAPProduct.MK18MOD1;
}
else if (productId.Equals("ezi_dlc_ksg")){
return IAPProduct.KSG;
}
else if (productId.Equals("ezi_dlc_gsg16")){
return IAPProduct.GSG16;
}
else if (productId.Equals("ezi_dlc_nailgun")){
return IAPProduct.Nailgun;
}
else if (productId.Equals("ezi_dlc_b93r")){
return IAPProduct.Beretta93R;
}
else if (productId.Equals("ezi_dlc_msg90")){
return IAPProduct.MSG90;
}
else if (productId.Equals("ezi_dlc_mg3")){
return IAPProduct.MG3;
}
else if (productId.Equals("ezi_dlc_m99")){
return IAPProduct.M99;
}
else if (productId.Equals("ezi_dlc_m95")){
return IAPProduct.M95;
}
else if (productId.Equals("ezi_dlc_raging_judge")){
return IAPProduct.RagingJudge;
}
else if (productId.Equals("ezi_dlc_m32")){
return IAPProduct.M32;
}
else if (productId.Equals("ezi_dlc_m16_m203")){
return IAPProduct.M16M203;
}
else if (productId.Equals("ezi_dlc_psrl1")){
return IAPProduct.PSRL1;
}
else if (productId.Equals("ezi_dlc_m202")){
return IAPProduct.M202;
}
else if (productId.Equals("ezi_dlc_m82")){
return IAPProduct.M82;
}
else if (productId.Equals("ezi_dlc_vepr12")){
return IAPProduct.VEPR12;
}
else if (productId.Equals("ezi_dlc_rpk16")){
return IAPProduct.RPK16;
}
else if (productId.Equals("ezi_dlc_mp510")){
return IAPProduct.MP510;
}
else if (productId.Equals("ezi_dlc_xm2hgl")){
return IAPProduct.XM2HGL;
}
else if (productId.Equals("ezi_item_double_exp")){
return IAPProduct.DoubleExp;
}
else if (productId.Equals("ezi_unlock_skillslot_3")){
return IAPProduct.SkillSlot3;
}
else if (productId.Equals("ezi_unlock_skillslot_4")){
return IAPProduct.SkillSlot4;
}
else if (productId.Equals("ezi_military_armor")){
return IAPProduct.MilitaryArmor;
}
else if (productId.Equals("ezi_military_ammobelt")){
return IAPProduct.MilitaryAmmoBelt;
}
else if (productId.Equals("ezi_military_boots")){
return IAPProduct.MilitaryBoots;
}
else if (productId.Equals("ezi_military_medikit")){
return IAPProduct.MilitaryMedkit;
}
else if (productId.Equals("ezi_heavy_blast_armor")){
return IAPProduct.HeavyBlastArmor;
}
else if (productId.Equals("ezi_dlc_tranquilizer_rifle")){
return IAPProduct.TranquilizerRifle;
}
else if (productId.Equals("ezi_dlc_mobile_shotgun_sentrygun")){
return IAPProduct.MobileShotgunSentryGun;
}
else if (productId.Equals("ezi_dlc_pipebomb")){
return IAPProduct.Pipebomb;
}
else if (productId.Equals("ezi_dlc_smart_proximity_mine")){
return IAPProduct.SmartProximityMine;
}
else if (productId.Equals("ezi_dlc_sevenbang")){
return IAPProduct.Sevenbang;
}
else if (productId.Equals("ezi_skin_nuke")) {
return IAPProduct.SkinNuke;
}
else if (productId.Equals("ezi_skin_army")) {
return IAPProduct.SkinArmy;
}
else if (productId.Equals("ezi_skin_navy")) {
return IAPProduct.SkinNavy;
}
else if (productId.Equals("ezi_skin_oni")) {
return IAPProduct.SkinOni;
}
else if (productId.Equals("ezi_skin_neon")) {
return IAPProduct.SkinNeon;
}
else if (productId.Equals("ezi_skin_emergency")) {
return IAPProduct.SkinEmergency;
}
else if (productId.Equals("ezi_skin_heg")) {
return IAPProduct.SkinHEG;
}
else if (productId.Equals("ezi_skin_desert")) {
return IAPProduct.SkinDesert;
}
else if (productId.Equals("ezi_skin_jungle")) {
return IAPProduct.SkinJungle;
}
return IAPProduct.None;
}
public static int GetDLCCost(string equipmentName) {
// Weapons
if (equipmentName.Equals(WeaponNames.BallisticKnife)) {
return 2;
}
else if (equipmentName.Equals(WeaponNames.Warhammer)) {
return 2;
}
else if (equipmentName.Equals(WeaponNames.USP)) {
return 2;
}
else if (equipmentName.Equals(WeaponNames.MK18MOD1)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.KSG)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.GSG16)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.Nailgun)) {
return 2;
}
else if (equipmentName.Equals(WeaponNames.Beretta93R)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.RagingJudge)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.MSG90)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.MG3)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.M99)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.M32)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.M95)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.M16M203)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.PSRL1)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.M202)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.M82)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.VEPR12)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.RPK16)) {
return 4;
}
else if (equipmentName.Equals(WeaponNames.MP510)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.XM2HGL)) {
return 4;
}
// Equipment
else if (equipmentName.Equals(EquipmentNames.MilitaryArmor)) {
return 2;
}
else if (equipmentName.Equals(EquipmentNames.MilitaryAmmoBelt)) {
return 2;
}
else if (equipmentName.Equals(EquipmentNames.MilitaryBoots)) {
return 2;
}
else if (equipmentName.Equals(EquipmentNames.MilitaryMedkit)) {
return 2;
}
else if (equipmentName.Equals(EquipmentNames.HeavyBlastArmor)) {
return 2;
}
else if (equipmentName.Equals(WeaponNames.TranquilizerRifle)) {
return 2;
}
else if (equipmentName.Equals(WeaponNames.MobileShotgunSentryGun)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.Pipebomb)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.SmartProximityMine)) {
return 3;
}
else if (equipmentName.Equals(WeaponNames.Sevenbang)) {
return 3;
}
throw new System.Exception("Invalid EquipmentName: " + equipmentName);
}
public void OnInitialized(IStoreController controller, IExtensionProvider extensions) {
Debug.Log("IAP Initialized.");
m_StoreController = controller;
m_StoreExtensionProvider = extensions;
foreach (var product in m_StoreController.products.all) {
m_StoreController.ConfirmPendingPurchase(product);
}
var appleExtensions = extensions.GetExtension<IAppleExtensions>();
appleExtensions.RefreshAppReceipt(
(success) => {
Debug.Log(success);
ReverifyPurchases();
},
(message) => {
Debug.Log(message);
ReverifyPurchases();
}
);
}
public void OnInitializeFailed(InitializationFailureReason error) {
Debug.LogError("Failed to initialize IAP: " + error);
}
public void OnInitializeFailed(InitializationFailureReason reason, string msg) {
Debug.LogError("Failed to initialize IAP: " + reason.ToString());
Debug.LogError(msg);
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason) {
m_PreviousPurchaseInProgress = false;
Debug.Log("Failed to purchase product: " + failureReason.ToString());
ApplicationEventManager.OnIAPPurchaseFailure.Invoke(
GetIAPProductByProductId(product.definition.id),
failureReason.ToString()
);
}
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) {
m_PreviousPurchaseInProgress = false;
string productId = args.purchasedProduct.definition.id;
// Receipt Validation
var validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.identifier);
try {
IPurchaseReceipt[] result = validator.Validate(args.purchasedProduct.receipt);
Debug.Log("Receipt is valid. Contents:");
foreach (IPurchaseReceipt productReceipt in result) {
Debug.Log(productReceipt.productID);
Debug.Log(productReceipt.purchaseDate);
Debug.Log(productReceipt.transactionID);
}
PlayerData savedData = PlayerDataManager.SavedData;
// Shop
if (productId == GetProductId(IAPProduct.BasicCashPack)) {
savedData.IAPSmallCashPackPurchased += 1;
savedData.AddCash(TransactionType.InAppPurchase, IAPSetting.BasicCashPackAmount + IAPSetting.BasicCashPackBonusAmount);
}
else if (productId == GetProductId(IAPProduct.MediumCashPack)) {
savedData.IAPMediumCashPackPurchased += 1;
savedData.AddCash(TransactionType.InAppPurchase, savedData.cash += IAPSetting.MediumCashPackAmount + IAPSetting.MediumCashPackBonusAmount);
}
else if (productId == GetProductId(IAPProduct.LargeCashPack)) {
savedData.IAPLargeCashPackPurchased += 1;
savedData.AddCash(TransactionType.InAppPurchase, savedData.cash += IAPSetting.LargeCashPackAmount + IAPSetting.LargeCashPackBonusAmount);
}
else if (productId == GetProductId(IAPProduct.HugeCashPack)) {
savedData.IAPHugeCashPackPurchased += 1;
savedData.AddCash(TransactionType.InAppPurchase, savedData.cash += IAPSetting.HugeCashPackAmount + IAPSetting.HugeCashPackBonusAmount);
}
else if (productId == GetProductId(IAPProduct.MegaCashPack)) {
savedData.IAPMegaCashPackPurchased += 1;
savedData.AddCash(TransactionType.InAppPurchase, savedData.cash += IAPSetting.MegaCashPackAmount + IAPSetting.MegaCashPackBonusAmount);
}
else if (productId == GetProductId(IAPProduct.DoubleExp)) {
savedData.OwnedIAPProduct.Add(IAPProduct.DoubleExp);
}
// Skills
else if (productId == GetProductId(IAPProduct.SkillSlot3)) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkillSlot3);
}
else if (productId == GetProductId(IAPProduct.SkillSlot4)) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkillSlot4);
}
// DLC
else if (productId == GetProductId(IAPProduct.BallisticKnife)) {
savedData.OwnedIAPProduct.Add(IAPProduct.BallisticKnife);
}
else if (productId == GetProductId(IAPProduct.Warhammer)) {
savedData.OwnedIAPProduct.Add(IAPProduct.Warhammer);
}
else if (productId == GetProductId(IAPProduct.USP)) {
savedData.OwnedIAPProduct.Add(IAPProduct.USP);
}
else if (productId == GetProductId(IAPProduct.MK18MOD1)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MK18MOD1);
}
else if (productId == GetProductId(IAPProduct.KSG)) {
savedData.OwnedIAPProduct.Add(IAPProduct.KSG);
}
else if (productId == GetProductId(IAPProduct.GSG16)) {
savedData.OwnedIAPProduct.Add(IAPProduct.GSG16);
}
else if (productId == GetProductId(IAPProduct.Nailgun)) {
savedData.OwnedIAPProduct.Add(IAPProduct.Nailgun);
}
else if (productId == GetProductId(IAPProduct.Beretta93R)) {
savedData.OwnedIAPProduct.Add(IAPProduct.Beretta93R);
}
else if (productId == GetProductId(IAPProduct.MSG90)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MSG90);
}
else if (productId == GetProductId(IAPProduct.MG3)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MG3);
}
else if (productId == GetProductId(IAPProduct.M99)) {
savedData.OwnedIAPProduct.Add(IAPProduct.M99);
}
else if (productId == GetProductId(IAPProduct.RagingJudge)) {
savedData.OwnedIAPProduct.Add(IAPProduct.RagingJudge);
}
else if (productId == GetProductId(IAPProduct.M32)) {
savedData.OwnedIAPProduct.Add(IAPProduct.M32);
}
else if (productId == GetProductId(IAPProduct.M95)) {
savedData.OwnedIAPProduct.Add(IAPProduct.M95);
}
else if (productId == GetProductId(IAPProduct.M16M203)) {
savedData.OwnedIAPProduct.Add(IAPProduct.M16M203);
}
else if (productId == GetProductId(IAPProduct.PSRL1)) {
savedData.OwnedIAPProduct.Add(IAPProduct.PSRL1);
}
else if (productId == GetProductId(IAPProduct.M202)) {
savedData.OwnedIAPProduct.Add(IAPProduct.M202);
}
else if (productId == GetProductId(IAPProduct.M82)) {
savedData.OwnedIAPProduct.Add(IAPProduct.M82);
}
else if (productId == GetProductId(IAPProduct.VEPR12)) {
savedData.OwnedIAPProduct.Add(IAPProduct.VEPR12);
}
else if (productId == GetProductId(IAPProduct.RPK16)) {
savedData.OwnedIAPProduct.Add(IAPProduct.RPK16);
}
else if (productId == GetProductId(IAPProduct.MP510)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MP510);
}
else if (productId == GetProductId(IAPProduct.XM2HGL)) {
savedData.OwnedIAPProduct.Add(IAPProduct.XM2HGL);
}
// Armor
else if (productId == GetProductId(IAPProduct.MilitaryArmor)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryArmor);
}
else if (productId == GetProductId(IAPProduct.HeavyBlastArmor)) {
savedData.OwnedIAPProduct.Add(IAPProduct.HeavyBlastArmor);
}
// Ammo Belt
else if (productId == GetProductId(IAPProduct.MilitaryAmmoBelt)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryAmmoBelt);
}
// Mobility Boots
else if (productId == GetProductId(IAPProduct.MilitaryBoots)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryBoots);
}
// Medikits
else if (productId == GetProductId(IAPProduct.MilitaryMedkit)) {
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryMedkit);
}
// Utilities
else if (productId.Equals(GetProductId(IAPProduct.TranquilizerRifle))) {
savedData.OwnedIAPProduct.Add(IAPProduct.TranquilizerRifle);
}
else if (productId.Equals(GetProductId(IAPProduct.MobileShotgunSentryGun))) {
savedData.OwnedIAPProduct.Add(IAPProduct.MobileShotgunSentryGun);
}
else if (productId.Equals(GetProductId(IAPProduct.Pipebomb))) {
savedData.OwnedIAPProduct.Add(IAPProduct.Pipebomb);
}
else if (productId.Equals(GetProductId(IAPProduct.SmartProximityMine))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SmartProximityMine);
}
else if (productId.Equals(GetProductId(IAPProduct.Sevenbang))) {
savedData.OwnedIAPProduct.Add(IAPProduct.Sevenbang);
}
// Skins
else if (productId.Equals(GetProductId(IAPProduct.SkinNuke))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinNuke);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinArmy))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinArmy);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinNavy))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinNavy);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinOni))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinOni);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinNeon))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinNeon);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinEmergency))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinEmergency);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinHEG))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinHEG);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinDesert))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinDesert);
}
else if (productId.Equals(GetProductId(IAPProduct.SkinJungle))) {
savedData.OwnedIAPProduct.Add(IAPProduct.SkinJungle);
}
PlayerDataManager.Instance.Save();
CloudDataManager.Save(savedData);
}
catch (IAPSecurityException) {
Debug.Log("Invalid receipt, not unlocking content.");
}
ApplicationEventManager.OnIAPPurchaseSuccess.Invoke(GetIAPProductByProductId(productId));
return PurchaseProcessingResult.Complete;
}
public void InitializePurchasing() {
if (Initialized) {
return;
}
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
builder.AddProduct(GetProductId(IAPProduct.BasicCashPack), ProductType.Consumable);
builder.AddProduct(GetProductId(IAPProduct.MediumCashPack), ProductType.Consumable);
builder.AddProduct(GetProductId(IAPProduct.LargeCashPack), ProductType.Consumable);
builder.AddProduct(GetProductId(IAPProduct.HugeCashPack), ProductType.Consumable);
builder.AddProduct(GetProductId(IAPProduct.MegaCashPack), ProductType.Consumable);
builder.AddProduct(GetProductId(IAPProduct.BallisticKnife), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.Warhammer), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.USP), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MK18MOD1), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.KSG), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.GSG16), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.Nailgun), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.Beretta93R), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MSG90), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MG3), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.M99), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.RagingJudge), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.M32), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.M95), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.M16M203), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.PSRL1), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.M202), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.M82), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.VEPR12), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.RPK16), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MP510), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.XM2HGL), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.DoubleExp), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkillSlot3), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkillSlot4), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MilitaryArmor), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MilitaryAmmoBelt), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MilitaryBoots), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MilitaryMedkit), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.HeavyBlastArmor), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.TranquilizerRifle), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.MobileShotgunSentryGun), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.Pipebomb), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SmartProximityMine), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.Sevenbang), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinNuke), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinArmy), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinNavy), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinOni), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinNeon), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinEmergency), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinHEG), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinDesert), ProductType.NonConsumable);
builder.AddProduct(GetProductId(IAPProduct.SkinJungle), ProductType.NonConsumable);
UnityPurchasing.Initialize(this, builder);
}
public static void Purchase(IAPProduct product) {
if (!Initialized) {
Debug.Log("Failed to buy product. Not initialized.");
ApplicationEventManager.OnIAPPurchaseFailure.Invoke(product, PurchaseFailureReason.PurchasingUnavailable.ToString());
}
else if (m_PreviousPurchaseInProgress) {
Debug.Log("Failed to buy product. Previous Purchase in progress.");
ApplicationEventManager.OnIAPPurchaseFailure.Invoke(product, PurchaseFailureReason.PurchasingUnavailable.ToString());
}
else {
m_PreviousPurchaseInProgress = true;
Product storeProduct = m_StoreController.products.WithID(GetProductId(product));
if (storeProduct != null && storeProduct.availableToPurchase) {
Debug.Log("Purchasing product async: " + storeProduct.definition.id);
m_StoreController.InitiatePurchase(storeProduct);
}
else {
Debug.Log("Failed to buy product.");
}
}
}
void HandleIAPPurchaseSuccess(IAPProduct product) {
Debug.Log("Purchase Successful: " + product.ToString());
AudioManager.PlayPurchasedSound();
Dialog.Alert(LanguageManager.Data.Payment.PurchaseSuccess);
}
void HandleIAPPurchaseFailure(IAPProduct product, string reason) {
Debug.Log("Failed to purchase: " + reason);
Dialog.Alert(string.Format(
"{0}\n({1})",
LanguageManager.Data.Payment.PurchaseFailure,
reason
));
AudioManager.PlayErrorSound();
}
void ReverifyPurchases() {
if (m_StoreController == null) {
Debug.LogError("Store Controller is null. Skip Reverify Products.");
return;
}
Debug.Log("Starting Reverify Products...");
PlayerData savedData = PlayerDataManager.SavedData;
int restored = 0;
int removed = 0;
#region DLC - Weapons
if (m_StoreController.products.WithID(GetProductId(IAPProduct.BallisticKnife)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.BallisticKnife) == false) {
Debug.Log("Purchase Detected: Weapon BallisticKnife. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.BallisticKnife);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.BallisticKnife)) {
Debug.Log("Refund Detected: Weapon BallisticKnife. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.BallisticKnife);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.Warhammer)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.Warhammer) == false) {
Debug.Log("Purchase Detected: Weapon Warhammer. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.Warhammer);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.Warhammer)) {
Debug.Log("Refund Detected: Weapon Warhammer. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.Warhammer);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.USP)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.USP) == false) {
Debug.Log("Purchase Detected: Weapon USP. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.USP);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.USP)) {
Debug.Log("Refund Detected: Weapon USP. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.USP);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MK18MOD1)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MK18MOD1) == false) {
Debug.Log("Purchase Detected: Weapon MK18MOD1. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MK18MOD1);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MK18MOD1)) {
Debug.Log("Refund Detected: Weapon MK18MOD1. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MK18MOD1);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.KSG)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.KSG) == false) {
Debug.Log("Purchase Detected: Weapon KSG. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.KSG);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.KSG)) {
Debug.Log("Refund Detected: Weapon KSG. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.KSG);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.GSG16)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.GSG16) == false) {
Debug.Log("Purchase Detected: Weapon GSG16. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.GSG16);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.GSG16)) {
Debug.Log("Refund Detected: Weapon GSG16. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.GSG16);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.Nailgun)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.Nailgun) == false) {
Debug.Log("Purchase Detected: Weapon Nailgun. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.Nailgun);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.Nailgun)) {
Debug.Log("Refund Detected: Weapon Nailgun. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.Nailgun);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.Beretta93R)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.Beretta93R) == false) {
Debug.Log("Purchase Detected: Weapon Beretta93R. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.Beretta93R);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.Beretta93R)) {
Debug.Log("Refund Detected: Weapon Beretta93R. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.Beretta93R);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MSG90)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MSG90) == false) {
Debug.Log("Purchase Detected: Weapon MSG90. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MSG90);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MSG90)) {
Debug.Log("Refund Detected: Weapon MSG90. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MSG90);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MG3)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MG3) == false) {
Debug.Log("Purchase Detected: Weapon MG3. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MG3);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MG3)) {
Debug.Log("Refund Detected: Weapon MG3. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MG3);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.M99)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.M99) == false) {
Debug.Log("Purchase Detected: Weapon M99. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.M99);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.M99)) {
Debug.Log("Refund Detected: Weapon M99. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.M99);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.RagingJudge)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.RagingJudge) == false) {
Debug.Log("Purchase Detected: Weapon RagingJudge. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.RagingJudge);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.RagingJudge)) {
Debug.Log("Refund Detected: Weapon RagingJudge. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.RagingJudge);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.M32)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.M32) == false) {
Debug.Log("Purchase Detected: Weapon M32. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.M32);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.M32)) {
Debug.Log("Refund Detected: Weapon M32. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.M32);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.M95)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.M95) == false) {
Debug.Log("Purchase Detected: Weapon M95. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.M95);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.M95)) {
Debug.Log("Refund Detected: Weapon M95. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.M95);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.M16M203)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.M16M203) == false) {
Debug.Log("Purchase Detected: Weapon M16M203. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.M16M203);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.M16M203)) {
Debug.Log("Refund Detected: Weapon M16M203. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.M16M203);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.PSRL1)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.PSRL1) == false) {
Debug.Log("Purchase Detected: Weapon PSRL1. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.PSRL1);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.PSRL1)) {
Debug.Log("Refund Detected: Weapon PSRL1. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.PSRL1);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.M202)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.M202) == false) {
Debug.Log("Purchase Detected: Weapon M202. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.M202);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.M202)) {
Debug.Log("Refund Detected: Weapon M202. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.M202);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.M82)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.M82) == false) {
Debug.Log("Purchase Detected: Weapon M82. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.M82);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.M82)) {
Debug.Log("Refund Detected: Weapon M82. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.M82);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.VEPR12)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.VEPR12) == false) {
Debug.Log("Purchase Detected: Weapon VEPR12. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.VEPR12);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.VEPR12)) {
Debug.Log("Refund Detected: Weapon VEPR12. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.VEPR12);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.RPK16)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.RPK16) == false) {
Debug.Log("Purchase Detected: Weapon RPK16. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.RPK16);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.RPK16)) {
Debug.Log("Refund Detected: Weapon RPK16. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.RPK16);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MP510)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MP510) == false) {
Debug.Log("Purchase Detected: Weapon MP510. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MP510);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MP510)) {
Debug.Log("Refund Detected: Weapon MP510. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MP510);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.XM2HGL)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.XM2HGL) == false) {
Debug.Log("Purchase Detected: Weapon XM2HGL. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.XM2HGL);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.XM2HGL)) {
Debug.Log("Refund Detected: Weapon XM2HGL. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.XM2HGL);
}
}
#endregion
#region DLC - Items
if (m_StoreController.products.WithID(GetProductId(IAPProduct.DoubleExp)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.DoubleExp) == false) {
Debug.Log("Purchase Detected: Item DoubleExp. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.DoubleExp);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.DoubleExp)) {
Debug.Log("Refund Detected: Item DoubleExp. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.DoubleExp);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkillSlot3)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkillSlot3) == false) {
Debug.Log("Purchase Detected: Item SkillSlot3. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkillSlot3);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkillSlot3)) {
Debug.Log("Refund Detected: Item SkillSlot3. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkillSlot3);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkillSlot4)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkillSlot4) == false) {
Debug.Log("Purchase Detected: Item SkillSlot4. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkillSlot4);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkillSlot4)) {
Debug.Log("Refund Detected: Item SkillSlot4. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkillSlot4);
}
}
#endregion
#region DLC - Gadgets
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MilitaryArmor)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MilitaryArmor) == false) {
Debug.Log("Purchase Detected: Gadget MilitaryArmor. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryArmor);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MilitaryArmor)) {
Debug.Log("Refund Detected: Gadget MilitaryArmor. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MilitaryArmor);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.HeavyBlastArmor)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.HeavyBlastArmor) == false) {
Debug.Log("Purchase Detected: Gadget HeavyBlastArmor. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.HeavyBlastArmor);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.HeavyBlastArmor)) {
Debug.Log("Refund Detected: Gadget HeavyBlastArmor. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.HeavyBlastArmor);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MilitaryAmmoBelt)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MilitaryAmmoBelt) == false) {
Debug.Log("Purchase Detected: Gadget MilitaryAmmoBelt. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryAmmoBelt);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MilitaryAmmoBelt)) {
Debug.Log("Refund Detected: Gadget MilitaryAmmoBelt. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MilitaryAmmoBelt);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MilitaryBoots)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MilitaryBoots) == false) {
Debug.Log("Purchase Detected: Gadget MilitaryBoots. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryBoots);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MilitaryBoots)) {
Debug.Log("Refund Detected: Gadget MilitaryBoots. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MilitaryBoots);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MilitaryMedkit)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MilitaryMedkit) == false) {
Debug.Log("Purchase Detected: Gadget MilitaryMedkit. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MilitaryMedkit);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MilitaryMedkit)) {
Debug.Log("Refund Detected: Gadget MilitaryMedkit. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MilitaryMedkit);
}
}
#endregion
#region DLC - Utilities
if (m_StoreController.products.WithID(GetProductId(IAPProduct.TranquilizerRifle)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.TranquilizerRifle) == false) {
Debug.Log("Purchase Detected: Utility TranquilizerRifle. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.TranquilizerRifle);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.TranquilizerRifle)) {
Debug.Log("Refund Detected: Utility TranquilizerRifle. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.TranquilizerRifle);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.MobileShotgunSentryGun)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.MobileShotgunSentryGun) == false) {
Debug.Log("Purchase Detected: Utility MobileShotgunSentryGun. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.MobileShotgunSentryGun);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.MobileShotgunSentryGun)) {
Debug.Log("Refund Detected: Utility MobileShotgunSentryGun. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.MobileShotgunSentryGun);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.Pipebomb)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.Pipebomb) == false) {
Debug.Log("Purchase Detected: Utility Pipebomb. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.Pipebomb);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.Pipebomb)) {
Debug.Log("Refund Detected: Utility Pipebomb. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.Pipebomb);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SmartProximityMine)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SmartProximityMine) == false) {
Debug.Log("Purchase Detected: Utility SmartProximityMine. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SmartProximityMine);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SmartProximityMine)) {
Debug.Log("Refund Detected: Utility SmartProximityMine. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SmartProximityMine);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.Sevenbang)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.Sevenbang) == false) {
Debug.Log("Purchase Detected: Utility Sevenbang. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.Sevenbang);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.Sevenbang)) {
Debug.Log("Refund Detected: Utility Sevenbang. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.Sevenbang);
}
}
#endregion
#region DLC - Skins
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinNuke)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinNuke) == false) {
Debug.Log("Purchase Detected: SkinNuke. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinNuke);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinNuke)) {
Debug.Log("Refund Detected: SkinNuke. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinNuke);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinArmy)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinArmy) == false) {
Debug.Log("Purchase Detected: SkinArmy. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinArmy);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinArmy)) {
Debug.Log("Refund Detected: SkinArmy. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinArmy);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinNavy)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinNavy) == false) {
Debug.Log("Purchase Detected: SkinNavy. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinNavy);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinNavy)) {
Debug.Log("Refund Detected: SkinNavy. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinNavy);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinOni)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinOni) == false) {
Debug.Log("Purchase Detected: SkinOni. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinOni);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinOni)) {
Debug.Log("Refund Detected: SkinOni. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinOni);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinNeon)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinNeon) == false) {
Debug.Log("Purchase Detected: SkinNeon. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinNeon);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinNeon)) {
Debug.Log("Refund Detected: SkinNeon. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinNeon);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinEmergency)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinEmergency) == false) {
Debug.Log("Purchase Detected: SkinEmergency. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinEmergency);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinEmergency)) {
Debug.Log("Refund Detected: SkinEmergency. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinEmergency);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinHEG)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinHEG) == false) {
Debug.Log("Purchase Detected: SkinHEG. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinHEG);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinHEG)) {
Debug.Log("Refund Detected: SkinHEG. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinHEG);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinDesert)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinDesert) == false) {
Debug.Log("Purchase Detected: SkinDesert. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinDesert);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinDesert)) {
Debug.Log("Refund Detected: SkinDesert. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinDesert);
}
}
if (m_StoreController.products.WithID(GetProductId(IAPProduct.SkinJungle)).hasReceipt) {
if (savedData.HasIAPProduct(IAPProduct.SkinJungle) == false) {
Debug.Log("Purchase Detected: SkinJungle. Adding...");
savedData.OwnedIAPProduct.Add(IAPProduct.SkinJungle);
restored += 1;
}
}
else {
if (savedData.HasIAPProduct(IAPProduct.SkinJungle)) {
Debug.Log("Refund Detected: SkinJungle. Removing....");
removed += savedData.OwnedIAPProduct.RemoveAll((p) => p == IAPProduct.SkinJungle);
}
}
#endregion
Debug.Log("Reverify Product Result:");
Debug.Log("Restored Products: " + restored.ToString());
Debug.Log("Removed Products: " + removed.ToString());
if (restored > 0 || removed > 0) {
PlayerDataManager.Instance.Save();
CloudDataManager.Save(savedData);
}
}
public void RestorePurchase(System.Action<bool> callback) {
IAppleExtensions apple = m_StoreExtensionProvider.GetExtension<IAppleExtensions>();
apple.RestoreTransactions(result => {
callback(result);
});
}
}
}
Unity version is 2020.3.38f1, Unity IAP 4.10.0. How to fix this?
