diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 156ce0c33e8f..c388bf3bcadc 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -197,19 +197,29 @@ - (void)addPayment:(FlutterMethodCall *)call result:(FlutterResult)result { } - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result { - if (![call.arguments isKindOfClass:[NSString class]]) { + if (![call.arguments isKindOfClass:[NSDictionary class]]) { result([FlutterError errorWithCode:@"storekit_invalid_argument" - message:@"Argument type of finishTransaction is not a string." + message:@"Argument type of finishTransaction is not a Dictionary" details:call.arguments]); return; } - NSString *transactionIdentifier = call.arguments; + NSDictionary *paymentMap = (NSDictionary *)call.arguments; + NSString *transactionIdentifier = [paymentMap objectForKey:@"transactionIdentifier"]; + NSString *productIdentifier = [paymentMap objectForKey:@"productIdentifier"]; NSArray *pendingTransactions = [self.paymentQueueHandler getUnfinishedTransactions]; for (SKPaymentTransaction *transaction in pendingTransactions) { - if ([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) { + // If the user cancels the purchase dialog we won't have transactionIdentifier. So if it is null we compare the product identifier. + if ([transaction.transactionIdentifier isEqualToString:transactionIdentifier] || + ( + [transactionIdentifier isEqual:[NSNull null]] && + transaction.transactionIdentifier == nil && + [transaction.payment.productIdentifier isEqualToString:productIdentifier] + ) + ) + { @try { [self.paymentQueueHandler finishTransaction:transaction]; } @catch (NSException *e) { diff --git a/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index 7f20736afbf8..d73b7d9a9e29 100644 --- a/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -103,9 +103,14 @@ class SKPaymentQueueWrapper { /// finishTransaction:]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506003-finishtransaction?language=objc). Future finishTransaction( SKPaymentTransactionWrapper transaction) async { + Map requestMap = { + "transactionIdentifier": transaction.transactionIdentifier, + "productIdentifier": transaction.payment.productIdentifier, + }; await channel.invokeMethod( - '-[InAppPurchasePlugin finishTransaction:result:]', - transaction.transactionIdentifier); + '-[InAppPurchasePlugin finishTransaction:result:]', + requestMap, + ); } /// Restore previously purchased transactions.