Feature: In-app purchase support on develop

Awesome @lukasz.k we will pull your fix. Thanks for looking into this.

As of commit f6c74af on develop, In App Purchases are supported on OSX too.

On the latest develop, the InAppPurchases PIP fails to build (ios).


Showing Recent Errors Only

Prepare build
note: Using new build systemnote: Planning buildnote: Constructing build description


Build target InAppPurchasesDemo - App of project InAppPurchasesDemo with configuration Debug

CompileC /Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Build/Intermediates.noindex/InAppPurchasesDemo.build/Debug-iphoneos/InAppPurchasesDemo\ -\ App.build/Objects-normal/arm64/Main.o /Users/oli/Desktop/InAppPurchasesDemo/Source/Main.cpp normal arm64 c++ com.apple.compilers.llvm.clang.1_0.compiler (in target: InAppPurchasesDemo - App)
    cd /Users/oli/Desktop/InAppPurchasesDemo/Builds/iOS
    export LANG=en_US.US-ASCII
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch arm64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=c++14 -stdlib=libc++ -Wno-trigraphs -fpascal-strings -O0 -fno-common -Wno-missing-field-initializers -Wno-missing-prototypes -Wunreachable-code -Wnon-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-float-conversion -Wnon-literal-null-conversion -Wobjc-literal-conversion -Wshorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -D_DEBUG=1 -DDEBUG=1 -DPIP_JUCE_EXAMPLES_DIRECTORY=L1VzZXJzL29saS9EZXYvTXlKVUNFUHJvamVjdHMvSlVDRS9leGFtcGxlcw== -DJUCER_XCODE_IPHONE_5BC26AE3=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -miphoneos-version-min=9.3 -g -fvisibility-inlines-hidden -Wno-sign-conversion -Winfinite-recursion -Wmove -Wcomma -Wblock-capture-autoreleasing -Wstrict-prototypes -Wrange-loop-analysis -Wno-semicolon-before-method-body -fembed-bitcode-marker -index-store-path /Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Index/DataStore -I/Users/oli/Desktop/InAppPurchasesDemo/Builds/iOS/build/Debug/include -I../../JuceLibraryCode -I/Users/oli/Dev/MyJUCEProjects/JUCE/modules -I/Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Build/Intermediates.noindex/InAppPurchasesDemo.build/Debug-iphoneos/InAppPurchasesDemo\ -\ App.build/DerivedSources/arm64 -I/Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Build/Intermediates.noindex/InAppPurchasesDemo.build/Debug-iphoneos/InAppPurchasesDemo\ -\ App.build/DerivedSources -Wreorder -F/Users/oli/Desktop/InAppPurchasesDemo/Builds/iOS/build/Debug -MMD -MT dependencies -MF /Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Build/Intermediates.noindex/InAppPurchasesDemo.build/Debug-iphoneos/InAppPurchasesDemo\ -\ App.build/Objects-normal/arm64/Main.d --serialize-diagnostics /Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Build/Intermediates.noindex/InAppPurchasesDemo.build/Debug-iphoneos/InAppPurchasesDemo\ -\ App.build/Objects-normal/arm64/Main.dia -c /Users/oli/Desktop/InAppPurchasesDemo/Source/Main.cpp -o /Users/oli/Library/Developer/Xcode/DerivedData/InAppPurchasesDemo-gdpsdcimfotxejgwbgapmydgtzue/Build/Intermediates.noindex/InAppPurchasesDemo.build/Debug-iphoneos/InAppPurchasesDemo\ -\ App.build/Objects-normal/arm64/Main.o

In file included from /Users/oli/Desktop/InAppPurchasesDemo/Source/Main.cpp:10:
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:56:37: error: use of undeclared identifier 'InAppPurchases'
class VoicePurchases      : private InAppPurchases::Listener
                                    ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:56:53: error: expected class name
class VoicePurchases      : private InAppPurchases::Listener
                                                    ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:132:44: error: use of undeclared identifier 'InAppPurchases'
    void productsInfoReturned (const Array<InAppPurchases::Product>& products) override
                                           ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:177:41: error: unknown type name 'PurchaseInfo'
    void productPurchaseFinished (const PurchaseInfo& info, bool success, const String&) override
                                        ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:200:45: error: use of undeclared identifier 'PurchaseInfo'
    void purchasesListRestored (const Array<PurchaseInfo>& infos, bool success, const String&) override
                                            ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:83:9: error: use of undeclared identifier 'InAppPurchases'
        InAppPurchases::getInstance()->removeListener (this);
        ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:92:13: error: use of undeclared identifier 'InAppPurchases'
            InAppPurchases::getInstance()->addListener (this);
            ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:94:13: error: use of undeclared identifier 'InAppPurchases'
            InAppPurchases::getInstance()->restoreProductsBoughtList (true);
            ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:111:17: error: use of undeclared identifier 'InAppPurchases'
                InAppPurchases::getInstance()->purchaseProduct (product.identifier, false);
                ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:134:15: error: use of undeclared identifier 'InAppPurchases'
        if (! InAppPurchases::getInstance()->isInAppPurchasesSupported())
              ^
/Users/oli/Desktop/InAppPurchasesDemo/Source/InAppPurchasesDemo.h:227:13: error: use of undeclared identifier 'InAppPurchases'
            InAppPurchases::getInstance()->getProductsInformation (identifiers);
            ^
11 errors generated.



Build failed    16/12/2018, 12:50    12.4 seconds

ah, ok, just have to enable the capability in the exporter in projucer [edit as explained in the metatdata ]

Donate to charity.

What is the best way to retry a failed InAppPurchases::Download? To call startDownloads or resumeDownloads, I need a Download* pointer.

Initially, if I call restoreProductsBoughtList with includeDownloadInfo, I get Download* pointers and can call startDownloads. :+1:

But when a download fails, Listener::productDownloadFinished gets called, and the Download gets destroyed. From that point, how do I get a fresh Download* pointer, so I can call startDownloads or resumeDownloads again to retry the failed download?
It seems that the only two ways are:

  • purchaseProduct -> productPurchaseFinished. But I don’t want to prompt the user to purchase again.
  • restoreProductsBoughtList -> purchasesListRestored. This is what I’m doing right now, but I don’t really want to restore IAP purchases.

Is there a better way? And is it possible to resume the download from the progress at which it failed?

[EDIT]
A different issue, but: Often when I use a Download* pointer in the purchasesListRestored callback, I get an EXC_BAD_ACCESS when calling Download::getStatus(). I’m calling it synchronously, but the Download* pointer already seems to be dangling.