[in_app_purchase] Initialize SKError with correct data type (#4113)
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 acbe995..d10edc9 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+1
+
+* Fix wrong data type when cancelling user credentials dialog.
+
## 0.1.2
* Added countryCode to the SKPriceLocaleWrapper.
@@ -12,7 +16,7 @@
## 0.1.0+2
-* Changed the iOS payment queue handler in such a way that it only adds a listener to the `SKPaymentQueue` when there
+* Changed the iOS payment queue handler in such a way that it only adds a listener to the `SKPaymentQueue` when there
is a listener to the Dart `purchaseStream`.
## 0.1.0+1
diff --git a/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
index c39ad9e..079e750 100644
--- a/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
@@ -66,7 +66,7 @@
/// addTransactionObserver:]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506042-addtransactionobserver?language=objc).
void setTransactionObserver(SKTransactionObserverWrapper observer) {
_observer = observer;
- channel.setMethodCallHandler(_handleObserverCallbacks);
+ channel.setMethodCallHandler(handleObserverCallbacks);
}
/// Instructs the iOS implementation to register a transaction observer and
@@ -208,8 +208,12 @@
.invokeMethod<void>('-[SKPaymentQueue showPriceConsentIfNeeded]');
}
- // Triage a method channel call from the platform and triggers the correct observer method.
- Future<dynamic> _handleObserverCallbacks(MethodCall call) async {
+ /// Triage a method channel call from the platform and triggers the correct observer method.
+ ///
+ /// This method is public for testing purposes only and should not be used
+ /// outside this class.
+ @visibleForTesting
+ Future<dynamic> handleObserverCallbacks(MethodCall call) async {
assert(_observer != null,
'[in_app_purchase]: (Fatal)The observer has not been set but we received a purchase transaction notification. Please ensure the observer has been set using `setTransactionObserver`. Make sure the observer is added right at the App Launch.');
final SKTransactionObserverWrapper observer = _observer!;
@@ -232,7 +236,8 @@
}
case 'restoreCompletedTransactionsFailed':
{
- SKError error = SKError.fromJson(call.arguments);
+ SKError error =
+ SKError.fromJson(Map<String, dynamic>.from(call.arguments));
return Future<void>(() {
observer.restoreCompletedTransactionsFailed(error: error);
});
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 b73ad84..69afe52 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 @@
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
+version: 0.1.2+1
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart b/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart
index b61411d..ca2b336 100644
--- a/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart
@@ -68,6 +68,65 @@
},
);
});
+
+ test(
+ 'handleObserverCallbacks should call SKTransactionObserverWrapper.restoreCompletedTransactionsFailed',
+ () async {
+ SKPaymentQueueWrapper queue = SKPaymentQueueWrapper();
+ TestTransactionObserverWrapper testObserver =
+ TestTransactionObserverWrapper();
+ queue.setTransactionObserver(testObserver);
+
+ final arguments = <dynamic, dynamic>{
+ 'code': 100,
+ 'domain': 'domain',
+ 'userInfo': <String, dynamic>{'error': 'underlying_error'},
+ };
+
+ await queue.handleObserverCallbacks(
+ MethodCall('restoreCompletedTransactionsFailed', arguments),
+ );
+
+ expect(
+ testObserver.log,
+ <Matcher>{
+ equals('restoreCompletedTransactionsFailed'),
+ },
+ );
+ });
+}
+
+class TestTransactionObserverWrapper extends SKTransactionObserverWrapper {
+ final List<String> log = <String>[];
+
+ @override
+ void updatedTransactions(
+ {required List<SKPaymentTransactionWrapper> transactions}) {
+ log.add('updatedTransactions');
+ }
+
+ @override
+ void removedTransactions(
+ {required List<SKPaymentTransactionWrapper> transactions}) {
+ log.add('removedTransactions');
+ }
+
+ @override
+ void restoreCompletedTransactionsFailed({required SKError error}) {
+ log.add('restoreCompletedTransactionsFailed');
+ }
+
+ @override
+ void paymentQueueRestoreCompletedTransactionsFinished() {
+ log.add('paymentQueueRestoreCompletedTransactionsFinished');
+ }
+
+ @override
+ bool shouldAddStorePayment(
+ {required SKPaymentWrapper payment, required SKProductWrapper product}) {
+ log.add('shouldAddStorePayment');
+ return false;
+ }
}
class TestPaymentQueueDelegate extends SKPaymentQueueDelegateWrapper {