in_app_purchase: started supported null as a parameter for the sandbox arguement (#3110)

diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md
index a071e11..f1b728b 100644
--- a/packages/in_app_purchase/CHANGELOG.md
+++ b/packages/in_app_purchase/CHANGELOG.md
@@ -1,4 +1,8 @@
 
+## 0.3.4+11
+
+* [iOS] Fixed: crash when sending null for simulatesAskToBuyInSandbox parameter.
+
 ## 0.3.4+10
 
 * Fixed typo 'verity' for 'verify'.
diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m
index 156ce0c..6bcd58e 100644
--- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m
+++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m
@@ -179,8 +179,10 @@
   NSNumber *quantity = [paymentMap objectForKey:@"quantity"];
   payment.quantity = (quantity != nil) ? quantity.integerValue : 1;
   if (@available(iOS 8.3, *)) {
-    payment.simulatesAskToBuyInSandbox =
-        [[paymentMap objectForKey:@"simulatesAskToBuyInSandbox"] boolValue];
+    NSNumber *simulatesAskToBuyInSandbox = [paymentMap objectForKey:@"simulatesAskToBuyInSandbox"];
+    payment.simulatesAskToBuyInSandbox = (id)simulatesAskToBuyInSandbox == (id)[NSNull null]
+                                             ? NO
+                                             : [simulatesAskToBuyInSandbox boolValue];
   }
 
   if (![self.paymentQueueHandler addPayment:payment]) {
diff --git a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m
index 369e0ea..4025e92 100644
--- a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m
+++ b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m
@@ -146,6 +146,51 @@
   XCTAssertEqual(transactionForUpdateBlock.transactionState, SKPaymentTransactionStatePurchased);
 }
 
+- (void)testAddPaymentWithNullSandboxArgument {
+  XCTestExpectation* expectation =
+      [self expectationWithDescription:@"result should return success state"];
+  XCTestExpectation* simulatesAskToBuyInSandboxExpectation =
+      [self expectationWithDescription:@"payment isn't simulatesAskToBuyInSandbox"];
+  FlutterMethodCall* call =
+      [FlutterMethodCall methodCallWithMethodName:@"-[InAppPurchasePlugin addPayment:result:]"
+                                        arguments:@{
+                                          @"productIdentifier" : @"123",
+                                          @"quantity" : @(1),
+                                          @"simulatesAskToBuyInSandbox" : [NSNull null],
+                                        }];
+  SKPaymentQueueStub* queue = [SKPaymentQueueStub new];
+  queue.testState = SKPaymentTransactionStatePurchased;
+  __block SKPaymentTransaction* transactionForUpdateBlock;
+  self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue
+      transactionsUpdated:^(NSArray<SKPaymentTransaction*>* _Nonnull transactions) {
+        SKPaymentTransaction* transaction = transactions[0];
+        if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
+          transactionForUpdateBlock = transaction;
+          [expectation fulfill];
+        }
+        if (@available(iOS 8.3, *)) {
+          if (!transaction.payment.simulatesAskToBuyInSandbox) {
+            [simulatesAskToBuyInSandboxExpectation fulfill];
+          }
+        } else {
+          [simulatesAskToBuyInSandboxExpectation fulfill];
+        }
+      }
+      transactionRemoved:nil
+      restoreTransactionFailed:nil
+      restoreCompletedTransactionsFinished:nil
+      shouldAddStorePayment:^BOOL(SKPayment* _Nonnull payment, SKProduct* _Nonnull product) {
+        return YES;
+      }
+      updatedDownloads:nil];
+  [queue addTransactionObserver:self.plugin.paymentQueueHandler];
+  [self.plugin handleMethodCall:call
+                         result:^(id r){
+                         }];
+  [self waitForExpectations:@[ expectation, simulatesAskToBuyInSandboxExpectation ] timeout:5];
+  XCTAssertEqual(transactionForUpdateBlock.transactionState, SKPaymentTransactionStatePurchased);
+}
+
 - (void)testRestoreTransactions {
   XCTestExpectation* expectation =
       [self expectationWithDescription:@"result successfully restore transactions"];
diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml
index 6b1ddf9..a9bed88 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+10
+version: 0.3.4+11
 
 dependencies:
   async: ^2.0.8