From ed7b3ba1e9a52b4ffa087f5b4ba024fdc76af677 Mon Sep 17 00:00:00 2001 From: Hyo Date: Tue, 16 Jun 2026 01:54:52 +0900 Subject: [PATCH] fix(apple): accept apple purchase props Resolve MAUI iOS purchase payloads that use the canonical apple key while preserving the legacy ios alias fallback. Add regression coverage for purchase and subscription request resolution, and sync docs version metadata after the MAUI 1.1.2 release bump. --- packages/apple/Sources/OpenIapModule.swift | 6 +-- packages/apple/Tests/OpenIapTests.swift | 41 +++++++++++++++++++ .../docs/src/generated/version-metadata.json | 2 +- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/apple/Sources/OpenIapModule.swift b/packages/apple/Sources/OpenIapModule.swift index 12888f10..2200b6f3 100644 --- a/packages/apple/Sources/OpenIapModule.swift +++ b/packages/apple/Sources/OpenIapModule.swift @@ -1615,14 +1615,14 @@ public final class OpenIapModule: NSObject, OpenIapModuleProtocol { /// Resolves iOS purchase props from request params. /// Returns either RequestPurchaseIosProps or RequestSubscriptionIosProps based on request type. - private func resolveIOSPurchaseProps(from params: RequestPurchaseProps) throws -> any IosPropsProtocol { + func resolveIOSPurchaseProps(from params: RequestPurchaseProps) throws -> any IosPropsProtocol { switch params.request { case let .purchase(platforms): - if let ios = platforms.ios { + if let ios = platforms.apple ?? platforms.ios { return ios } case let .subscription(platforms): - if let ios = platforms.ios { + if let ios = platforms.apple ?? platforms.ios { return ios } } diff --git a/packages/apple/Tests/OpenIapTests.swift b/packages/apple/Tests/OpenIapTests.swift index 8cdeb2de..91ad6b2a 100644 --- a/packages/apple/Tests/OpenIapTests.swift +++ b/packages/apple/Tests/OpenIapTests.swift @@ -453,6 +453,47 @@ final class OpenIapTests: XCTestCase { XCTAssertNil(decoded.advancedCommerceData) } + @available(iOS 15.0, macOS 14.0, tvOS 16.0, watchOS 8.0, *) + func testResolvePurchasePropsUsesAppleAlias() throws { + let props = RequestPurchaseProps( + request: .purchase(RequestPurchasePropsByPlatforms( + apple: RequestPurchaseIosProps(sku: "dev.hyo.apple"), + ios: RequestPurchaseIosProps(sku: "dev.hyo.legacy") + )) + ) + + let resolved = try OpenIapModule.shared.resolveIOSPurchaseProps(from: props) + + XCTAssertEqual(resolved.sku, "dev.hyo.apple") + } + + @available(iOS 15.0, macOS 14.0, tvOS 16.0, watchOS 8.0, *) + func testResolvePurchasePropsFallsBackToLegacyIosAlias() throws { + let props = RequestPurchaseProps( + request: .purchase(RequestPurchasePropsByPlatforms( + ios: RequestPurchaseIosProps(sku: "dev.hyo.legacy") + )) + ) + + let resolved = try OpenIapModule.shared.resolveIOSPurchaseProps(from: props) + + XCTAssertEqual(resolved.sku, "dev.hyo.legacy") + } + + @available(iOS 15.0, macOS 14.0, tvOS 16.0, watchOS 8.0, *) + func testResolveSubscriptionPropsUsesAppleAlias() throws { + let props = RequestPurchaseProps( + request: .subscription(RequestSubscriptionPropsByPlatforms( + apple: RequestSubscriptionIosProps(sku: "dev.hyo.sub.apple"), + ios: RequestSubscriptionIosProps(sku: "dev.hyo.sub.legacy") + )) + ) + + let resolved = try OpenIapModule.shared.resolveIOSPurchaseProps(from: props) + + XCTAssertEqual(resolved.sku, "dev.hyo.sub.apple") + } + func testAdvancedCommerceDataJSONSerialization() throws { let props = RequestPurchaseIosProps( advancedCommerceData: "promo_code_abc", diff --git a/packages/docs/src/generated/version-metadata.json b/packages/docs/src/generated/version-metadata.json index 145c8d35..491c12c4 100644 --- a/packages/docs/src/generated/version-metadata.json +++ b/packages/docs/src/generated/version-metadata.json @@ -6,7 +6,7 @@ "godotPackageVersion": "2.3.1", "kmpPackageVersion": "2.3.1", "mauiPackageId": "OpenIap.Maui", - "mauiPackageVersion": "1.1.1", + "mauiPackageVersion": "1.1.2", "googleCompileSdk": "35", "googleMinSdk": "23", "googlePlayBillingVersion": "8.3.0",