From 0e9db3c4037fa18e74216aae1e1a49d0c14f533a Mon Sep 17 00:00:00 2001 From: Lukasz Kozakiewicz Date: Tue, 24 Oct 2017 08:58:37 +0200 Subject: [PATCH] InAppPurchases: call purchasesListRestored() callback with failure when a user cancels login to AppStore. --- .../native/juce_ios_InAppPurchases.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp b/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp index 2b7c56480d..68a86027a2 100644 --- a/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp @@ -44,6 +44,7 @@ struct SKDelegateAndPaymentObserver virtual void didReceiveResponse (SKProductsRequest*, SKProductsResponse*) = 0; virtual void requestDidFinish (SKRequest*) = 0; + virtual void requestDidFailWithError (SKRequest*, NSError*) = 0; virtual void updatedTransactions (SKPaymentQueue*, NSArray*) = 0; virtual void restoreCompletedTransactionsFailedWithError (SKPaymentQueue*, NSError*) = 0; virtual void restoreCompletedTransactionsFinished (SKPaymentQueue*) = 0; @@ -62,6 +63,7 @@ private: addMethod (@selector (productsRequest:didReceiveResponse:), didReceiveResponse, "v@:@@"); addMethod (@selector (requestDidFinish:), requestDidFinish, "v@:@"); + addMethod (@selector (request:didFailWithError:), requestDidFailWithError, "v@:@@"); addMethod (@selector (paymentQueue:updatedTransactions:), updatedTransactions, "v@:@@"); addMethod (@selector (paymentQueue:restoreCompletedTransactionsFailedWithError:), restoreCompletedTransactionsFailedWithError, "v@:@@"); addMethod (@selector (paymentQueueRestoreCompletedTransactionsFinished:), restoreCompletedTransactionsFinished, "v@:@"); @@ -77,6 +79,7 @@ private: //============================================================================== static void didReceiveResponse (id self, SEL, SKProductsRequest* request, SKProductsResponse* response) { getThis (self).didReceiveResponse (request, response); } static void requestDidFinish (id self, SEL, SKRequest* request) { getThis (self).requestDidFinish (request); } + static void requestDidFailWithError (id self, SEL, SKRequest* request, NSError* err) { getThis (self).requestDidFailWithError (request, err); } static void updatedTransactions (id self, SEL, SKPaymentQueue* queue, NSArray* trans) { getThis (self).updatedTransactions (queue, trans); } static void restoreCompletedTransactionsFailedWithError (id self, SEL, SKPaymentQueue* q, NSError* err) { getThis (self).restoreCompletedTransactionsFailedWithError (q, err); } static void restoreCompletedTransactionsFinished (id self, SEL, SKPaymentQueue* queue) { getThis (self).restoreCompletedTransactionsFinished (queue); } @@ -286,6 +289,25 @@ struct InAppPurchases::Pimpl : public SKDelegateAndPaymentObserver } } + void requestDidFailWithError (SKRequest* request, NSError* error) override + { + if (auto receiptRefreshRequest = getAs (request)) + { + for (auto i = 0; i < pendingReceiptRefreshRequests.size(); ++i) + { + auto& pendingRequest = *pendingReceiptRefreshRequests[i]; + + if (pendingRequest.request == receiptRefreshRequest) + { + auto errorDetails = error != nil ? (", " + nsStringToJuce ([error localizedDescription])) : String (""); + owner.listeners.call (&Listener::purchasesListRestored, {}, false, NEEDS_TRANS ("Receipt fetch failed") + errorDetails); + pendingReceiptRefreshRequests.remove (i); + return; + } + } + } + } + void updatedTransactions (SKPaymentQueue*, NSArray* transactions) override { for (SKPaymentTransaction* transaction in transactions)