diff --git a/lib/iap.dart b/lib/iap.dart index 4e3b1433..cd218f84 100644 --- a/lib/iap.dart +++ b/lib/iap.dart @@ -3,15 +3,19 @@ import 'dart:io' show Platform; import 'package:http/http.dart' as http; import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:in_app_purchase/store_kit_wrappers.dart'; import 'package:meta/meta.dart'; import 'package:gitjournal/app.dart'; +import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/features.dart'; import 'package:gitjournal/settings.dart'; import 'package:gitjournal/utils/logger.dart'; class InAppPurchases { static Future confirmProPurchaseBoot() async { + clearTransactionsIos(); + if (Features.alwaysPro) { return; } @@ -97,6 +101,31 @@ class InAppPurchases { } return SubscriptionStatus(false, dtNow); } + + static Future clearTransactionsIos() async { + if (Platform.isIOS) { + final transactions = await SKPaymentQueueWrapper().transactions(); + for (final transaction in transactions) { + try { + if (transaction.transactionState == + SKPaymentTransactionStateWrapper.purchased) { + continue; + } + if (transaction.transactionState == + SKPaymentTransactionStateWrapper.restored) { + continue; + } + + if (transaction.transactionState != + SKPaymentTransactionStateWrapper.purchasing) { + await SKPaymentQueueWrapper().finishTransaction(transaction); + } + } catch (e, stackTrace) { + logException(e, stackTrace); + } + } + } + } } const base_url = 'https://us-central1-gitjournal-io.cloudfunctions.net';