From adf2b4cd255da82806f62a65ac361f3bf3a5079a Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 6 Jul 2021 15:20:09 +0200 Subject: [PATCH 1/6] Send description instead of userInfo object --- .../in_app_purchase_ios/example/ios/RunnerTests/Stubs.m | 4 +++- .../in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m index f247a7e4b78a..40b5fb1f0e01 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m +++ b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m @@ -261,7 +261,9 @@ @implementation FIAPReceiptManagerStub : FIAPReceiptManager - (NSData *)getReceiptData:(NSURL *)url error:(NSError **)error { if (self.returnError) { - *error = [[NSError alloc] init]; + *error = [NSError errorWithDomain:@"test" + code:1 + userInfo:@{@"name" : @"test", @"houseNr" : @5}]; return nil; } NSString *originalString = [NSString stringWithFormat:@"test"]; diff --git a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m index 8038304d178f..8a8803c249bd 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m +++ b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m @@ -23,7 +23,7 @@ - (NSString *)retrieveReceiptWithError:(FlutterError **)flutterError { *flutterError = [FlutterError errorWithCode:[[NSString alloc] initWithFormat:@"%li", (long)receiptError.code] message:receiptError.domain - details:receiptError.userInfo]; + details:receiptError.userInfo.description]; } return nil; } From 166d18750820224f1066e7bac4f3b78dfe0caffb Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 6 Jul 2021 15:21:40 +0200 Subject: [PATCH 2/6] update changelog --- packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md | 4 ++++ packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md index d10edc97a82e..89d648af5d49 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md +++ b/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.2+2 + +* Fix crash when retrieveReceiptWithError gives an error. + ## 0.1.2+1 * Fix wrong data type when cancelling user credentials dialog. diff --git a/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml index 69afe52b6ac3..c277686fb7c7 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase_ios description: An implementation for the iOS platform of the Flutter `in_app_purchase` plugin. This uses the iOS StoreKit Framework. repository: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase/in_app_purchase_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 0.1.2+1 +version: 0.1.2+2 environment: sdk: ">=2.12.0 <3.0.0" From c73e985d443d22aa9ba3e8da22cbc91b54d599aa Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 6 Jul 2021 15:35:00 +0200 Subject: [PATCH 3/6] use existing translator to map error --- .../in_app_purchase_ios/example/ios/RunnerTests/Stubs.m | 2 +- .../in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m index 40b5fb1f0e01..65cfcbfc2c96 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m +++ b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m @@ -263,7 +263,7 @@ - (NSData *)getReceiptData:(NSURL *)url error:(NSError **)error { if (self.returnError) { *error = [NSError errorWithDomain:@"test" code:1 - userInfo:@{@"name" : @"test", @"houseNr" : @5}]; + userInfo:@{@"name" : @"test", @"houseNr" : @5, @"error": [[NSError alloc] init]}]; return nil; } NSString *originalString = [NSString stringWithFormat:@"test"]; diff --git a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m index 8a8803c249bd..f5887af37df6 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m +++ b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m @@ -3,6 +3,7 @@ // found in the LICENSE file. #import "FIAPReceiptManager.h" +#import "FIAObjectTranslator.h" #import @interface FIAPReceiptManager () @@ -20,10 +21,11 @@ - (NSString *)retrieveReceiptWithError:(FlutterError **)flutterError { NSData *receipt = [self getReceiptData:receiptURL error:&receiptError]; if (!receipt || receiptError) { if (flutterError) { + NSDictionary *errorMap = [FIAObjectTranslator getMapFromNSError:receiptError]; *flutterError = [FlutterError - errorWithCode:[[NSString alloc] initWithFormat:@"%li", (long)receiptError.code] - message:receiptError.domain - details:receiptError.userInfo.description]; + errorWithCode:[errorMap objectForKey: @"code"] + message:[errorMap objectForKey: @"domain"] + details:[errorMap objectForKey: @"userInfo"]]; } return nil; } From f36d71c856a660abe36a61c924448e21d1f45018 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 6 Jul 2021 15:54:14 +0200 Subject: [PATCH 4/6] formatting --- .../example/ios/RunnerTests/Stubs.m | 7 ++++--- .../ios/Classes/FIAPReceiptManager.m | 11 +++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m index 65cfcbfc2c96..dfe3c34f6d9d 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m +++ b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m @@ -261,9 +261,10 @@ @implementation FIAPReceiptManagerStub : FIAPReceiptManager - (NSData *)getReceiptData:(NSURL *)url error:(NSError **)error { if (self.returnError) { - *error = [NSError errorWithDomain:@"test" - code:1 - userInfo:@{@"name" : @"test", @"houseNr" : @5, @"error": [[NSError alloc] init]}]; + *error = [NSError + errorWithDomain:@"test" + code:1 + userInfo:@{@"name" : @"test", @"houseNr" : @5, @"error" : [[NSError alloc] init]}]; return nil; } NSString *originalString = [NSString stringWithFormat:@"test"]; diff --git a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m index f5887af37df6..5319061d2650 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m +++ b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m @@ -3,8 +3,8 @@ // found in the LICENSE file. #import "FIAPReceiptManager.h" -#import "FIAObjectTranslator.h" #import +#import "FIAObjectTranslator.h" @interface FIAPReceiptManager () // Gets the receipt file data from the location of the url. Can be nil if @@ -21,11 +21,10 @@ - (NSString *)retrieveReceiptWithError:(FlutterError **)flutterError { NSData *receipt = [self getReceiptData:receiptURL error:&receiptError]; if (!receipt || receiptError) { if (flutterError) { - NSDictionary *errorMap = [FIAObjectTranslator getMapFromNSError:receiptError]; - *flutterError = [FlutterError - errorWithCode:[errorMap objectForKey: @"code"] - message:[errorMap objectForKey: @"domain"] - details:[errorMap objectForKey: @"userInfo"]]; + NSDictionary *errorMap = [FIAObjectTranslator getMapFromNSError:receiptError]; + *flutterError = [FlutterError errorWithCode:[errorMap objectForKey:@"code"] + message:[errorMap objectForKey:@"domain"] + details:[errorMap objectForKey:@"userInfo"]]; } return nil; } From 59287800de3a5316faa087b6344614a55a20109d Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Thu, 8 Jul 2021 10:22:20 +0200 Subject: [PATCH 5/6] Also test that the result contains the error --- .../example/ios/RunnerTests/InAppPurchasePluginTests.m | 4 ++++ .../in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m index e259e69d962c..13628689c48b 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m @@ -251,6 +251,10 @@ - (void)testRetrieveReceiptDataError { [self waitForExpectations:@[ expectation ] timeout:5]; XCTAssertNotNil(result); XCTAssert([result isKindOfClass:[FlutterError class]]); + NSDictionary* details = ((FlutterError*)result).details; + XCTAssertNotNil(details[@"error"]); + NSNumber* errorCode = (NSNumber*)details[@"error"][@"code"]; + XCTAssertEqual(errorCode, [NSNumber numberWithInteger:0]); } - (void)testRefreshReceiptRequest { diff --git a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m index 5319061d2650..b359b415d873 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m +++ b/packages/in_app_purchase/in_app_purchase_ios/ios/Classes/FIAPReceiptManager.m @@ -22,9 +22,9 @@ - (NSString *)retrieveReceiptWithError:(FlutterError **)flutterError { if (!receipt || receiptError) { if (flutterError) { NSDictionary *errorMap = [FIAObjectTranslator getMapFromNSError:receiptError]; - *flutterError = [FlutterError errorWithCode:[errorMap objectForKey:@"code"] - message:[errorMap objectForKey:@"domain"] - details:[errorMap objectForKey:@"userInfo"]]; + *flutterError = [FlutterError errorWithCode:errorMap[@"code"] + message:errorMap[@"domain"] + details:errorMap[@"userInfo"]]; } return nil; } From caacaddb01a9ffe184e64317b9ea3cbf91a5f3f0 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Thu, 8 Jul 2021 10:25:12 +0200 Subject: [PATCH 6/6] add some specific test error data --- .../ios/RunnerTests/InAppPurchasePluginTests.m | 2 +- .../example/ios/RunnerTests/Stubs.m | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m index 13628689c48b..79812f609980 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/InAppPurchasePluginTests.m @@ -254,7 +254,7 @@ - (void)testRetrieveReceiptDataError { NSDictionary* details = ((FlutterError*)result).details; XCTAssertNotNil(details[@"error"]); NSNumber* errorCode = (NSNumber*)details[@"error"][@"code"]; - XCTAssertEqual(errorCode, [NSNumber numberWithInteger:0]); + XCTAssertEqual(errorCode, [NSNumber numberWithInteger:99]); } - (void)testRefreshReceiptRequest { diff --git a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m index dfe3c34f6d9d..364505d6754a 100644 --- a/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m +++ b/packages/in_app_purchase/in_app_purchase_ios/example/ios/RunnerTests/Stubs.m @@ -261,10 +261,15 @@ @implementation FIAPReceiptManagerStub : FIAPReceiptManager - (NSData *)getReceiptData:(NSURL *)url error:(NSError **)error { if (self.returnError) { - *error = [NSError - errorWithDomain:@"test" - code:1 - userInfo:@{@"name" : @"test", @"houseNr" : @5, @"error" : [[NSError alloc] init]}]; + *error = [NSError errorWithDomain:@"test" + code:1 + userInfo:@{ + @"name" : @"test", + @"houseNr" : @5, + @"error" : [[NSError alloc] initWithDomain:@"internalTestDomain" + code:99 + userInfo:nil] + }]; return nil; } NSString *originalString = [NSString stringWithFormat:@"test"];