Android: Confirm pending purchases

There seems to be a race condition which results in some purchases not
being confirmed.
This commit is contained in:
Vishesh Handa
2020-10-22 22:50:24 +02:00
parent 66962bda65
commit 42de2be044

View File

@ -15,6 +15,7 @@ import 'package:gitjournal/utils/logger.dart';
class InAppPurchases { class InAppPurchases {
static Future<void> confirmProPurchaseBoot() async { static Future<void> confirmProPurchaseBoot() async {
clearTransactionsIos(); clearTransactionsIos();
confirmPendingPurchases();
if (Features.alwaysPro) { if (Features.alwaysPro) {
return; return;
@ -103,7 +104,10 @@ class InAppPurchases {
} }
static Future<void> clearTransactionsIos() async { static Future<void> clearTransactionsIos() async {
if (Platform.isIOS) { if (!Platform.isIOS) {
return;
}
final transactions = await SKPaymentQueueWrapper().transactions(); final transactions = await SKPaymentQueueWrapper().transactions();
for (final transaction in transactions) { for (final transaction in transactions) {
try { try {
@ -125,6 +129,28 @@ class InAppPurchases {
} }
} }
} }
static void confirmPendingPurchases() async {
// On iOS this results in a "Sign in with Apple ID" dialog
if (!Platform.isAndroid) {
return;
}
InAppPurchaseConnection.enablePendingPurchases();
final iapCon = InAppPurchaseConnection.instance;
var pastPurchases = await iapCon.queryPastPurchases();
for (var pd in pastPurchases.pastPurchases) {
if (pd.pendingCompletePurchase) {
Log.i("Pending Complete Purchase - ${pd.productID}");
try {
await iapCon.completePurchase(pd);
} catch (e, stackTrace) {
logException(e, stackTrace);
}
}
}
} }
} }