[in_app_puchase_storekit] handle `appStoreReceiptURL` is nil (#7069)
* handle nil
* versio update
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md
index 5d93cc0..569e071 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md
+++ b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.5+2
+
+* Fix a crash when `appStoreReceiptURL` is nil.
+
## 0.3.5+1
* Uses the new `sharedDarwinSource` flag when available.
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPReceiptManager.m b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPReceiptManager.m
index fc125da..320e607 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPReceiptManager.m
+++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPReceiptManager.m
@@ -21,6 +21,9 @@
- (NSString *)retrieveReceiptWithError:(FlutterError **)flutterError {
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
+ if (!receiptURL) {
+ return nil;
+ }
NSError *receiptError;
NSData *receipt = [self getReceiptData:receiptURL error:&receiptError];
if (!receipt || receiptError) {
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m
index 9ace425..f7e6dcd 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m
+++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m
@@ -313,6 +313,23 @@
XCTAssert([result isKindOfClass:[NSString class]]);
}
+- (void)testRetrieveReceiptDataNil {
+ NSBundle *mockBundle = OCMPartialMock([NSBundle mainBundle]);
+ OCMStub(mockBundle.appStoreReceiptURL).andReturn(nil);
+ XCTestExpectation *expectation = [self expectationWithDescription:@"nil receipt data retrieved"];
+ FlutterMethodCall *call = [FlutterMethodCall
+ methodCallWithMethodName:@"-[InAppPurchasePlugin retrieveReceiptData:result:]"
+ arguments:nil];
+ __block NSDictionary *result;
+ [self.plugin handleMethodCall:call
+ result:^(id r) {
+ result = r;
+ [expectation fulfill];
+ }];
+ [self waitForExpectations:@[ expectation ] timeout:5];
+ XCTAssertNil(result);
+}
+
- (void)testRetrieveReceiptDataError {
XCTestExpectation *expectation = [self expectationWithDescription:@"receipt data retrieved"];
FlutterMethodCall *call = [FlutterMethodCall
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml
index 3a4b0fc..78ae8b1 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml
@@ -2,7 +2,7 @@
description: An implementation for the iOS and macOS platforms of the Flutter `in_app_purchase` plugin. This uses the StoreKit Framework.
repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase_storekit
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
-version: 0.3.5+1
+version: 0.3.5+2
environment:
sdk: ">=2.14.0 <3.0.0"