From 9be8dc2b09afd9482b9b39d840ba5ee27030f0b9 Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Fri, 7 Aug 2020 12:22:50 +0300 Subject: [PATCH 01/10] - Removed maintaining own cache of transactions, it is better to use SKPaymentQueue.transactions where needed - Removed unnecessary and broken payment validation from addPayment - Refactored finishTransaction for finishing transactions properly - Fixed: restoreTransactions did not call result(nil) causing the call never complete --- .../ios/Classes/FIAPaymentQueueHandler.h | 6 +- .../ios/Classes/FIAPaymentQueueHandler.m | 31 +--------- .../ios/Classes/InAppPurchasePlugin.m | 57 ++++++++----------- packages/in_app_purchase/pubspec.yaml | 2 +- 4 files changed, 28 insertions(+), 68 deletions(-) diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h index ed1788186909..b92eb4c2a6c4 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h @@ -18,9 +18,6 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); @interface FIAPaymentQueueHandler : NSObject -// Unfinished transactions. -@property(nonatomic, readonly) NSDictionary *transactions; - - (instancetype)initWithQueue:(nonnull SKPaymentQueue *)queue transactionsUpdated:(nullable TransactionsUpdated)transactionsUpdated transactionRemoved:(nullable TransactionsRemoved)transactionsRemoved @@ -40,8 +37,7 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); // Appends a payment to the SKPaymentQueue. // // @param payment Payment object to be added to the payment queue. -// @return whether "addPayment" was successful. -- (BOOL)addPayment:(SKPayment *)payment; +- (void)addPayment:(SKPayment *)payment; @end diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m index 57370e16fcbb..a188a07e605f 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m @@ -15,9 +15,6 @@ @interface FIAPaymentQueueHandler () @property(nullable, copy, nonatomic) ShouldAddStorePayment shouldAddStorePayment; @property(nullable, copy, nonatomic) UpdatedDownloads updatedDownloads; -@property(strong, nonatomic) - NSMutableDictionary *transactionsSetter; - @end @implementation FIAPaymentQueueHandler @@ -39,7 +36,6 @@ - (instancetype)initWithQueue:(nonnull SKPaymentQueue *)queue _paymentQueueRestoreCompletedTransactionsFinished = restoreCompletedTransactionsFinished; _shouldAddStorePayment = shouldAddStorePayment; _updatedDownloads = updatedDownloads; - _transactionsSetter = [NSMutableDictionary dictionary]; } return self; } @@ -48,12 +44,8 @@ - (void)startObservingPaymentQueue { [_queue addTransactionObserver:self]; } -- (BOOL)addPayment:(SKPayment *)payment { - if (self.transactionsSetter[payment.productIdentifier]) { - return NO; - } +- (void)addPayment:(SKPayment *)payment { [self.queue addPayment:payment]; - return YES; } - (void)finishTransaction:(SKPaymentTransaction *)transaction { @@ -74,16 +66,6 @@ - (void)restoreTransactions:(nullable NSString *)applicationName { // state of transactions and finish as appropriate. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { - for (SKPaymentTransaction *transaction in transactions) { - if (transaction.transactionState != SKPaymentTransactionStatePurchasing) { - // Use product identifier instead of transaction identifier for few reasons: - // 1. Only transactions with purchased state and failed state will have a transaction id, it - // will become impossible for clients to finish deferred transactions when needed. - // 2. Using product identifiers can help prevent clients from purchasing the same - // subscription more than once by accident. - self.transactionsSetter[transaction.payment.productIdentifier] = transaction; - } - } // notify dart through callbacks. self.transactionsUpdated(transactions); } @@ -91,16 +73,13 @@ - (void)paymentQueue:(SKPaymentQueue *)queue // Sent when transactions are removed from the queue (via finishTransaction:). - (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions { - for (SKPaymentTransaction *transaction in transactions) { - [self.transactionsSetter removeObjectForKey:transaction.payment.productIdentifier]; - } self.transactionsRemoved(transactions); } // Sent when an error is encountered while adding transactions from the user's purchase history back // to the queue. - (void)paymentQueue:(SKPaymentQueue *)queue - restoreCompletedTransactionsFailedWithError:(NSError *)error { + restoreCompletedTransactionsFailedWithError :(NSError *)error { self.restoreTransactionFailed(error); } @@ -126,10 +105,4 @@ - (BOOL)paymentQueue:(SKPaymentQueue *)queue return self.queue.transactions; } -#pragma mark - getter - -- (NSDictionary *)transactions { - return [self.transactionsSetter copy]; -} - @end diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 06fe74a613ae..15b6a458e506 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -182,15 +182,13 @@ - (void)addPayment:(FlutterMethodCall *)call result:(FlutterResult)result { payment.simulatesAskToBuyInSandbox = [[paymentMap objectForKey:@"simulatesAskToBuyInSandBox"] boolValue]; } - - if (![self.paymentQueueHandler addPayment:payment]) { - result([FlutterError - errorWithCode:@"storekit_duplicate_product_object" - message:@"There is a pending transaction for the same product identifier. Please " - @"either wait for it to be finished or finish it manually using " - @"`completePurchase` to avoid edge cases." - - details:call.arguments]); + + @try { + [self.paymentQueueHandler addPayment:payment]; + } @catch (NSException *e) { + result([FlutterError errorWithCode:@"storekit_add_payment_exception" + message:e.name + details:e.description]); return; } result(nil); @@ -203,31 +201,23 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result details:call.arguments]); return; } - NSString *identifier = call.arguments; - SKPaymentTransaction *transaction = - [self.paymentQueueHandler.transactions objectForKey:identifier]; - if (!transaction) { - result([FlutterError - errorWithCode:@"storekit_platform_invalid_transaction" - message:[NSString - stringWithFormat:@"The transaction with transactionIdentifer:%@ does not " - @"exist. Note that if the transactionState is " - @"purchasing, the transactionIdentifier will be " - @"nil(null).", - transaction.transactionIdentifier] - details:call.arguments]); - return; - } - @try { - // finish transaction will throw exception if the transaction type is purchasing. Notify dart - // about this exception. - [self.paymentQueueHandler finishTransaction:transaction]; - } @catch (NSException *e) { - result([FlutterError errorWithCode:@"storekit_finish_transaction_exception" - message:e.name - details:e.description]); - return; + NSString *transactionIdentifier = call.arguments; + + NSArray* pendingTransactions = [self.paymentQueueHandler getUnfinishedTransactions]; + + for(SKPaymentTransaction *transaction in pendingTransactions) { + if([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) { + @try { + [self.paymentQueueHandler finishTransaction:transaction]; + } @catch (NSException *e) { + result([FlutterError errorWithCode:@"storekit_finish_transaction_exception" + message:e.name + details:e.description]); + return; + } + } } + result(nil); } @@ -240,6 +230,7 @@ - (void)restoreTransactions:(FlutterMethodCall *)call result:(FlutterResult)resu return; } [self.paymentQueueHandler restoreTransactions:call.arguments]; + result(nil); } - (void)retrieveReceiptData:(FlutterMethodCall *)call result:(FlutterResult)result { diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index 4b50721bf22b..0d2f5785f8a6 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -1,7 +1,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.3.4+3 +version: 0.3.4+4 dependencies: async: ^2.0.8 From 80f19256473b21909c88fa1083724f610d2bb4e5 Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Fri, 7 Aug 2020 14:05:09 +0300 Subject: [PATCH 02/10] - Updated changelog --- packages/in_app_purchase/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 7e2eb3079396..efa2c23509a7 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.3.4+4 + +* [iOS] Fixed: purchase dialog not showing always. +* [iOS] Fixed: completing purchases could fail. +* [iOS] Fixed: restorePurchases caused hang (call never returned). + ## 0.3.4+3 * Fixed typo 'manuelly' for 'manually'. From 10bee63ad5d990ee62f4d4e3e03cead6c2fcfb4b Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Sun, 9 Aug 2020 23:06:29 +0300 Subject: [PATCH 03/10] - Fixed call to finishTransaction: parameter must be transactionIdentifier, not productIdentifier --- .../lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 33d9281d3ce0..7f20736afbf8 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 @@ -105,7 +105,7 @@ class SKPaymentQueueWrapper { SKPaymentTransactionWrapper transaction) async { await channel.invokeMethod( '-[InAppPurchasePlugin finishTransaction:result:]', - transaction.payment.productIdentifier); + transaction.transactionIdentifier); } /// Restore previously purchased transactions. From c6cdb685430fea241b3a34429028a0a6dfa6abfc Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Thu, 3 Sep 2020 16:21:18 +0300 Subject: [PATCH 04/10] - review fixes: verify in addPayment there are no pending transactions for the same product --- .../ios/Classes/FIAPaymentQueueHandler.h | 3 ++- .../ios/Classes/FIAPaymentQueueHandler.m | 8 +++++++- .../ios/Classes/InAppPurchasePlugin.m | 14 ++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h index b92eb4c2a6c4..54898d170304 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h @@ -37,7 +37,8 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); // Appends a payment to the SKPaymentQueue. // // @param payment Payment object to be added to the payment queue. -- (void)addPayment:(SKPayment *)payment; +// @return whether "addPayment" was successful. +- (BOOL)addPayment:(SKPayment *)payment; @end diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m index a188a07e605f..2f496b16076c 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m @@ -44,8 +44,14 @@ - (void)startObservingPaymentQueue { [_queue addTransactionObserver:self]; } -- (void)addPayment:(SKPayment *)payment { +- (BOOL)addPayment:(SKPayment *)payment { + for (SKPaymentTransaction *transaction in self.queue.transactions) { + if ([transaction.payment.productIdentifier isEqualToString:payment.productIdentifier]) { + return NO; + } + } [self.queue addPayment:payment]; + return YES; } - (void)finishTransaction:(SKPaymentTransaction *)transaction { diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 15b6a458e506..2a90b54f0d56 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -183,12 +183,14 @@ - (void)addPayment:(FlutterMethodCall *)call result:(FlutterResult)result { [[paymentMap objectForKey:@"simulatesAskToBuyInSandBox"] boolValue]; } - @try { - [self.paymentQueueHandler addPayment:payment]; - } @catch (NSException *e) { - result([FlutterError errorWithCode:@"storekit_add_payment_exception" - message:e.name - details:e.description]); + if (![self.paymentQueueHandler addPayment:payment]) { + result([FlutterError + errorWithCode:@"storekit_duplicate_product_object" + message:@"There is a pending transaction for the same product identifier. Please " + @"either wait for it to be finished or finish it manually using " + @"`completePurchase` to avoid edge cases." + + details:call.arguments]); return; } result(nil); From 43fe7ead0d4f9cb73ae86cb0526840c0b0a73cdd Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Thu, 3 Sep 2020 16:43:31 +0300 Subject: [PATCH 05/10] - reverted accidental change --- packages/in_app_purchase/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index 94144447bffc..55ac120b30c6 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -22,8 +22,8 @@ dev_dependencies: path: example/ test: ^1.5.2 shared_preferences: ^0.5.2 - e2e: - path: ../e2e + integration_test: + path: ../integration_test pedantic: ^1.8.0 flutter: From 959e96b908c1d84431a22f636563fefa5db37b7e Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Thu, 3 Sep 2020 17:08:22 +0300 Subject: [PATCH 06/10] - fixed formatting issues --- .../ios/Classes/FIAPaymentQueueHandler.m | 2 +- .../ios/Classes/InAppPurchasePlugin.m | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m index 2f496b16076c..ecbd237c90ce 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m @@ -85,7 +85,7 @@ - (void)paymentQueue:(SKPaymentQueue *)queue // Sent when an error is encountered while adding transactions from the user's purchase history back // to the queue. - (void)paymentQueue:(SKPaymentQueue *)queue - restoreCompletedTransactionsFailedWithError :(NSError *)error { + restoreCompletedTransactionsFailedWithError:(NSError *)error { self.restoreTransactionFailed(error); } diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 2a90b54f0d56..fba0f740d187 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -182,7 +182,7 @@ - (void)addPayment:(FlutterMethodCall *)call result:(FlutterResult)result { payment.simulatesAskToBuyInSandbox = [[paymentMap objectForKey:@"simulatesAskToBuyInSandBox"] boolValue]; } - + if (![self.paymentQueueHandler addPayment:payment]) { result([FlutterError errorWithCode:@"storekit_duplicate_product_object" @@ -204,10 +204,11 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result return; } NSString *transactionIdentifier = call.arguments; - - NSArray* pendingTransactions = [self.paymentQueueHandler getUnfinishedTransactions]; - - for(SKPaymentTransaction *transaction in pendingTransactions) { + + NSArray* pendingTransactions = + [self.paymentQueueHandler getUnfinishedTransactions]; + + for (SKPaymentTransaction *transaction in pendingTransactions) { if([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) { @try { [self.paymentQueueHandler finishTransaction:transaction]; @@ -219,7 +220,7 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result } } } - + result(nil); } From c62cb797953ea31475d7bd4a965efe51271b4477 Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Thu, 3 Sep 2020 17:19:20 +0300 Subject: [PATCH 07/10] - fixed formatting issues --- packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index fba0f740d187..67f38239edd2 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -205,11 +205,11 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result } NSString *transactionIdentifier = call.arguments; - NSArray* pendingTransactions = + NSArray *pendingTransactions = [self.paymentQueueHandler getUnfinishedTransactions]; for (SKPaymentTransaction *transaction in pendingTransactions) { - if([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) { + if ([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) { @try { [self.paymentQueueHandler finishTransaction:transaction]; } @catch (NSException *e) { From 852fa7df4351e5c0fdb025fe46759506659fe375 Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Thu, 10 Sep 2020 10:41:52 +0300 Subject: [PATCH 08/10] - fixed test (removed obsolete references to old transactions cache) --- packages/in_app_purchase/ios/Tests/PaymentQueueTest.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m index 8f5b66496f69..e671b32c3b14 100644 --- a/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m +++ b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m @@ -208,13 +208,11 @@ - (void)testFinishTransaction { queue.testState = SKPaymentTransactionStateDeferred; __block FIAPaymentQueueHandler *handler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue transactionsUpdated:^(NSArray *_Nonnull transactions) { - XCTAssertEqual(handler.transactions.count, 1); XCTAssertEqual(transactions.count, 1); SKPaymentTransaction *transaction = transactions[0]; [handler finishTransaction:transaction]; } transactionRemoved:^(NSArray *_Nonnull transactions) { - XCTAssertEqual(handler.transactions.count, 0); XCTAssertEqual(transactions.count, 1); [expectation fulfill]; } From 842d26d36deec1c88fea176068ed43e7354ff239 Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Fri, 11 Sep 2020 09:36:43 +0300 Subject: [PATCH 09/10] - removed obsolete test testAddPaymentWithSameProductIDWillFail - fixed sk_methodchannel_apis_test --- .../ios/Tests/InAppPurchasePluginTest.m | 45 ------------------- .../sk_methodchannel_apis_test.dart | 2 +- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m index f1290b074ad9..1da3699b9f7e 100644 --- a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m +++ b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m @@ -110,51 +110,6 @@ - (void)testAddPaymentFailure { XCTAssertEqual(transactionForUpdateBlock.transactionState, SKPaymentTransactionStateFailed); } -- (void)testAddPaymentWithSameProductIDWillFail { - XCTestExpectation* expectation = - [self expectationWithDescription:@"result should return expected error"]; - FlutterMethodCall* call = - [FlutterMethodCall methodCallWithMethodName:@"-[InAppPurchasePlugin addPayment:result:]" - arguments:@{ - @"productIdentifier" : @"123", - @"quantity" : @(1), - @"simulatesAskToBuyInSandBox" : @YES, - }]; - SKPaymentQueueStub* queue = [SKPaymentQueueStub new]; - queue.testState = SKPaymentTransactionStatePurchased; - self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue - transactionsUpdated:^(NSArray* _Nonnull transactions) { - } - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil - shouldAddStorePayment:^BOOL(SKPayment* _Nonnull payment, SKProduct* _Nonnull product) { - return YES; - } - updatedDownloads:nil]; - [queue addTransactionObserver:self.plugin.paymentQueueHandler]; - - FlutterResult addDuplicatePaymentBlock = ^(id r) { - XCTAssertNil(r); - [self.plugin - handleMethodCall:call - result:^(id result) { - XCTAssertNotNil(result); - XCTAssertTrue([result isKindOfClass:[FlutterError class]]); - FlutterError* error = (FlutterError*)result; - XCTAssertEqualObjects(error.code, @"storekit_duplicate_product_object"); - XCTAssertEqualObjects( - error.message, - @"There is a pending transaction for the same product identifier. Please " - @"either wait for it to be finished or finish it manually using " - @"`completePurchase` to avoid edge cases."); - [expectation fulfill]; - }]; - }; - [self.plugin handleMethodCall:call result:addDuplicatePaymentBlock]; - [self waitForExpectations:@[ expectation ] timeout:5]; -} - - (void)testAddPaymentSuccessWithMockQueue { XCTestExpectation* expectation = [self expectationWithDescription:@"result should return success state"]; diff --git a/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart b/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart index c8da68ab823a..3a08d9e8e45d 100644 --- a/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart +++ b/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart @@ -110,7 +110,7 @@ void main() { queue.setTransactionObserver(observer); await queue.finishTransaction(dummyTransaction); expect(fakeIOSPlatform.transactionsFinished.first, - equals(dummyTransaction.payment.productIdentifier)); + equals(dummyTransaction.transactionIdentifier)); }); test('should restore transaction', () async { From abeed2b59ebb40533331b9dab4c42ffc680446ab Mon Sep 17 00:00:00 2001 From: Markku Kinnunen Date: Fri, 11 Sep 2020 10:14:11 +0300 Subject: [PATCH 10/10] - removed testDuplicateTransactionsWillTriggerAnError --- .../ios/Tests/PaymentQueueTest.m | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m index e671b32c3b14..07b6bbb42a65 100644 --- a/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m +++ b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m @@ -69,26 +69,6 @@ - (void)testTransactionPurchased { XCTAssertEqual(tran.transactionIdentifier, @"fakeID"); } -- (void)testDuplicateTransactionsWillTriggerAnError { - SKPaymentQueueStub *queue = [[SKPaymentQueueStub alloc] init]; - queue.testState = SKPaymentTransactionStatePurchased; - FIAPaymentQueueHandler *handler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue - transactionsUpdated:^(NSArray *_Nonnull transactions) { - } - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil - shouldAddStorePayment:^BOOL(SKPayment *_Nonnull payment, SKProduct *_Nonnull product) { - return YES; - } - updatedDownloads:nil]; - [queue addTransactionObserver:handler]; - SKPayment *payment = - [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; - XCTAssertTrue([handler addPayment:payment]); - XCTAssertFalse([handler addPayment:payment]); -} - - (void)testTransactionFailed { XCTestExpectation *expectation = [self expectationWithDescription:@"expect to get failed transcation."];