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 606fd82a618..09fb7d5ed81 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.4.4 + +* Added support for specifying quantity in `SK2ProductPurchaseOptions` (consumable purchases on iOS). + ## 0.4.3 * Adds **Introductory Offer Eligibility** support for StoreKit2 diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/in_app_purchase_storekit/Sources/in_app_purchase_storekit/StoreKit2/InAppPurchasePlugin+StoreKit2.swift b/packages/in_app_purchase/in_app_purchase_storekit/darwin/in_app_purchase_storekit/Sources/in_app_purchase_storekit/StoreKit2/InAppPurchasePlugin+StoreKit2.swift index 899f7262bda..c559970e8e3 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/in_app_purchase_storekit/Sources/in_app_purchase_storekit/StoreKit2/InAppPurchasePlugin+StoreKit2.swift +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/in_app_purchase_storekit/Sources/in_app_purchase_storekit/StoreKit2/InAppPurchasePlugin+StoreKit2.swift @@ -60,6 +60,9 @@ extension InAppPurchasePlugin: InAppPurchase2API { { purchaseOptions.insert(.appAccountToken(accountTokenUUID)) } + if let quantity = options?.quantity { + purchaseOptions.insert(.quantity(Int(quantity))) + } if #available(iOS 17.4, macOS 14.4, *) { if let promotionalOffer = options?.promotionalOffer { 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 b04206ec231..53c27bdebf8 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 @@ name: in_app_purchase_storekit 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/packages/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.4.3 +version: 0.4.4 environment: sdk: ^3.6.0 diff --git a/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart b/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart index b9228ccd6c3..75ad5311e8d 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart @@ -260,6 +260,42 @@ void main() { expect(lastPurchaseOptions.winBackOfferId, isNull); expect(lastPurchaseOptions.promotionalOffer, isNull); }); + + test('should pass quantity for consumable product with Sk2PurchaseParam', + () async { + final Sk2PurchaseParam purchaseParam = Sk2PurchaseParam( + productDetails: + AppStoreProduct2Details.fromSK2Product(dummyProductWrapper), + quantity: 3, + applicationUserName: 'testUser', + ); + + await iapStoreKitPlatform.buyConsumable(purchaseParam: purchaseParam); + + final SK2ProductPurchaseOptionsMessage lastPurchaseOptions = + fakeStoreKit2Platform.lastPurchaseOptions!; + + expect(lastPurchaseOptions.appAccountToken, 'testUser'); + expect(lastPurchaseOptions.quantity, 3); + expect(lastPurchaseOptions.winBackOfferId, isNull); + expect(lastPurchaseOptions.promotionalOffer, isNull); + }); + + test('should default to quantity = 1 when not provided in Sk2PurchaseParam', + () async { + final Sk2PurchaseParam purchaseParam = Sk2PurchaseParam( + productDetails: + AppStoreProduct2Details.fromSK2Product(dummyProductWrapper), + applicationUserName: 'testUser', + ); + + await iapStoreKitPlatform.buyConsumable(purchaseParam: purchaseParam); + + final SK2ProductPurchaseOptionsMessage lastPurchaseOptions = + fakeStoreKit2Platform.lastPurchaseOptions!; + + expect(lastPurchaseOptions.quantity, 1); + }); }); group('restore purchases', () {