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 289f3c36b037..8952b5a0be3f 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.20+4 + +* Exposes `jsonRepresentation` field for transactions. + ## 0.3.20+3 * Fixes `finishTransaction` not completing. diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/InAppPurchasePlugin+StoreKit2.swift b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/InAppPurchasePlugin+StoreKit2.swift index af4a19345890..672860beec65 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/InAppPurchasePlugin+StoreKit2.swift +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/InAppPurchasePlugin+StoreKit2.swift @@ -179,10 +179,10 @@ extension InAppPurchasePlugin: InAppPurchase2API { } } - // MARK: - Convenience Functions + // MARK: - Internal Convenience Functions /// Helper function that fetches and unwraps all verified transactions - private func rawTransactions() async -> [Transaction] { + func rawTransactions() async -> [Transaction] { var transactions: [Transaction] = [] for await verificationResult in Transaction.all { switch verificationResult { @@ -196,7 +196,7 @@ extension InAppPurchasePlugin: InAppPurchase2API { } /// Helper function to fetch specific transaction - private func fetchTransaction(by id: UInt64) async throws -> Transaction? { + func fetchTransaction(by id: UInt64) async throws -> Transaction? { for await result in Transaction.all { switch result { case .verified(let transaction): diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/StoreKit2Translators.swift b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/StoreKit2Translators.swift index dc662b9cbdd6..80658bceafa7 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/StoreKit2Translators.swift +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/StoreKit2Translators.swift @@ -200,7 +200,8 @@ extension Transaction { purchasedQuantity: Int64(purchasedQuantity), appAccountToken: appAccountToken?.uuidString, restoring: receipt != nil, - receiptData: receipt + receiptData: receipt, + jsonRepresentation: String(decoding: jsonRepresentation, as: UTF8.self) ) } } diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/sk2_pigeon.g.swift b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/sk2_pigeon.g.swift index c6923001143f..5defe53680e1 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/sk2_pigeon.g.swift +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/StoreKit2/sk2_pigeon.g.swift @@ -318,6 +318,7 @@ struct SK2TransactionMessage { var restoring: Bool var receiptData: String? = nil var error: SK2ErrorMessage? = nil + var jsonRepresentation: String? = nil // swift-format-ignore: AlwaysUseLowerCamelCase static func fromList(_ pigeonVar_list: [Any?]) -> SK2TransactionMessage? { @@ -331,6 +332,7 @@ struct SK2TransactionMessage { let restoring = pigeonVar_list[7] as! Bool let receiptData: String? = nilOrValue(pigeonVar_list[8]) let error: SK2ErrorMessage? = nilOrValue(pigeonVar_list[9]) + let jsonRepresentation: String? = nilOrValue(pigeonVar_list[10]) return SK2TransactionMessage( id: id, @@ -342,7 +344,8 @@ struct SK2TransactionMessage { appAccountToken: appAccountToken, restoring: restoring, receiptData: receiptData, - error: error + error: error, + jsonRepresentation: jsonRepresentation ) } func toList() -> [Any?] { @@ -357,6 +360,7 @@ struct SK2TransactionMessage { restoring, receiptData, error, + jsonRepresentation, ] } } @@ -524,8 +528,8 @@ class InAppPurchase2APISetup { static var codec: FlutterStandardMessageCodec { sk2_pigeonPigeonCodec.shared } /// Sets up an instance of `InAppPurchase2API` to handle messages through the `binaryMessenger`. static func setUp( - binaryMessenger: FlutterBinaryMessenger, api: InAppPurchase2API?, - messageChannelSuffix: String = "" + binaryMessenger: FlutterBinaryMessenger, + api: InAppPurchase2API?, messageChannelSuffix: String = "" ) { let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" let canMakePaymentsChannel = FlutterBasicMessageChannel( diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchaseStoreKit2PluginTests.swift b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchaseStoreKit2PluginTests.swift index b16548adc329..1a861ef73053 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchaseStoreKit2PluginTests.swift +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchaseStoreKit2PluginTests.swift @@ -129,6 +129,34 @@ final class InAppPurchase2PluginTests: XCTestCase { XCTAssert(fetchedProductMsg?.count == 0) } + func testGetTransactionJsonRepresentation() async throws { + let expectation = self.expectation(description: "Purchase request should succeed") + + plugin.purchase(id: "consumable", options: nil) { result in + switch result { + case .success(_): + expectation.fulfill() + case .failure(let error): + XCTFail("Purchase should NOT fail. Failed with \(error)") + } + } + + await fulfillment(of: [expectation], timeout: 5) + + let transaction = try await plugin.fetchTransaction( + by: UInt64(session.allTransactions()[0].originalTransactionIdentifier)) + + guard let transaction = transaction else { + XCTFail("Transaction does not exist.") + return + } + + let jsonRepresentationString = String(decoding: transaction.jsonRepresentation, as: UTF8.self) + + XCTAssert(jsonRepresentationString.localizedStandardContains("Type\":\"Consumable")) + XCTAssert(jsonRepresentationString.localizedStandardContains("storefront\":\"USA")) + } + //TODO(louisehsu): Add testing for lower versions. @available(iOS 17.0, macOS 14.0, *) func testGetProductsWithStoreKitError() async throws { diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/sk2_pigeon.g.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/sk2_pigeon.g.dart index 1339471a088b..c4476badce33 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/sk2_pigeon.g.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/sk2_pigeon.g.dart @@ -306,6 +306,7 @@ class SK2TransactionMessage { this.restoring = false, this.receiptData, this.error, + this.jsonRepresentation, }); int id; @@ -328,6 +329,8 @@ class SK2TransactionMessage { SK2ErrorMessage? error; + String? jsonRepresentation; + Object encode() { return [ id, @@ -340,6 +343,7 @@ class SK2TransactionMessage { restoring, receiptData, error, + jsonRepresentation, ]; } @@ -356,6 +360,7 @@ class SK2TransactionMessage { restoring: result[7]! as bool, receiptData: result[8] as String?, error: result[9] as SK2ErrorMessage?, + jsonRepresentation: result[10] as String?, ); } } diff --git a/packages/in_app_purchase/in_app_purchase_storekit/pigeons/sk2_pigeon.dart b/packages/in_app_purchase/in_app_purchase_storekit/pigeons/sk2_pigeon.dart index 77239af47236..c6493ce17eed 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/pigeons/sk2_pigeon.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/pigeons/sk2_pigeon.dart @@ -146,6 +146,7 @@ class SK2TransactionMessage { this.appAccountToken, this.error, this.receiptData, + this.jsonRepresentation, this.restoring = false}); final int id; final int originalId; @@ -157,6 +158,7 @@ class SK2TransactionMessage { final bool restoring; final String? receiptData; final SK2ErrorMessage? error; + final String? jsonRepresentation; } class SK2ErrorMessage { 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 c8e929e0b6b2..07adfb8ab1b6 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.3.20+3 +version: 0.3.20+4 environment: sdk: ^3.4.0