[Closed] IAP not working on iOS but works on Android

Hello,

I’m struggling to get IAP to work on iOS, it works in the editor and on the Android version but on iOS it’s not showing the dialogue or any sign of life.

public class IAPManager : MonoBehaviour, IStoreListener
{
    private static IStoreController m_StoreController;         
    private static IExtensionProvider m_StoreExtensionProvider;
   
    public static string kProductIDNonConsumable = "ad_removal";

    void Start()
    {
        if (m_StoreController == null)
        {
            InitializePurchasing();
        }
    }

    public void InitializePurchasing()
    {
        if (IsInitialized())
        {
            return;
        }
       
        var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
        builder.AddProduct(kProductIDNonConsumable, ProductType.NonConsumable);
        UnityPurchasing.Initialize(this, builder);
    }


    private bool IsInitialized()
    {
        return m_StoreController != null && m_StoreExtensionProvider != null;
    }

    public void BuyNonConsumable()
    {
        BuyProductID(kProductIDNonConsumable);
    }

    void BuyProductID(string productId)
    {
        if (IsInitialized())
        {
            Product product = m_StoreController.products.WithID(productId); if (product != null && product.availableToPurchase)
            {
                Debug.Log(string.Format("Purchasing product asychronously: '{0}'", product.definition.id));
                m_StoreController.InitiatePurchase(product);
            }
            else
            {
                Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase");
            }
        }
        else
        {
            Debug.Log("BuyProductID FAIL. Not initialized.");
        }
    }

    public void RestorePurchases()
    {
        if (!IsInitialized())
        {
            Debug.Log("RestorePurchases FAIL. Not initialized.");
            return;
        }
       
        if (Application.platform == RuntimePlatform.IPhonePlayer ||
            Application.platform == RuntimePlatform.OSXPlayer)
        {
            Debug.Log("RestorePurchases started ...");
            var apple = m_StoreExtensionProvider.GetExtension<IAppleExtensions>();
            apple.RestoreTransactions((result) => {
                Debug.Log("RestorePurchases continuing: " + result + ". If no further messages, no purchases available to restore.");
            });
        }
        else
        {
            Debug.Log("RestorePurchases FAIL. Not supported on this platform. Current = " + Application.platform);
        }
    }


    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    {
        Debug.Log("OnInitialized: PASS");
        m_StoreController = controller;
        m_StoreExtensionProvider = extensions;
    }


    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.Log("OnInitializeFailed InitializationFailureReason:" + error);
    }


    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
    {
        if (String.Equals(args.purchasedProduct.definition.id, kProductIDNonConsumable, StringComparison.Ordinal))
        {
            Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));
            PlayerPrefs.SetInt("ads", 0);
        }  else
        {
            Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
        }
        return PurchaseProcessingResult.Complete;
    }


    public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
    {
        Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason));
    }
}

This is called when you press a button:

IAPManager iap = GetComponent<IAPManager>();
                        if (iap != null)
                            iap.BuyNonConsumable();

I’ve added the IAP to itunes connect as shown:

My unity version is 5.5.1f1 and the purchasing script is version 1.9.3.

@Blobfish ,

Are you using Sandbox testing as described in this guide?

Would you be able to provide the device log? This may help determine what the error might be.

Lot of people meet this problem,me too.
everything is set correctly,but xcode always say:Unavailable product
I’ve sign out apple store account to test.
But I can’t login with tester account,always say tester apple id can’t use in itunes store!
So I leave the account empty.

When run in xcode,click “buy” button,xcode say unavailable product,IAP initialize faied!
There’s no dialogue coming out in ios, but android has.
Is it unity’s bug?
I’m confused by this problem for 4 days!There’s no solution on web

I solved this problem for iOS by setting up a paid contract on Itunesconnect, located in the Agreements, Tax and Banking section. All my IAPS worked within 30mins after finalising contact info, bank info and tax info in the same section.

8 Likes