fix(maui): add net10 targets and trim android aars#184
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (14)
✅ Files skipped from review due to trivial changes (4)
🚧 Files skipped from review as they are similar to previous changes (8)
📝 WalkthroughWalkthroughRenames the primary C# MAUI IAP entry point from ChangesOpenIap.Maui v1.1.1 Release
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Code Review
This pull request introduces .NET 10 support for the MAUI SDK, transitions transitive Google/Android dependencies from fat-bundled AARs to standard NuGet package references to allow deduplication, and renames the static facade from Iap to OpenIapClient to prevent namespace collisions. A backward-compatible Iap shim is provided for legacy consumers, and documentation, examples, and audit scripts are updated accordingly. Feedback suggests adding the [Obsolete] attribute to the legacy Iap class to trigger compiler warnings and encourage migration to OpenIapClient.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| /// use <see cref="OpenIapClient"/> to avoid namespace/type name collisions in | ||
| /// projects whose namespaces start with <c>OpenIap.Maui.Iap</c>. | ||
| /// </summary> | ||
| [EditorBrowsable(EditorBrowsableState.Never)] |
There was a problem hiding this comment.
To explicitly discourage the use of the legacy Iap facade in new code, consider adding the [Obsolete] attribute in addition to [EditorBrowsable]. This will trigger compiler warnings for any active references, helping developers migrate to OpenIapClient.
[Obsolete("Use OpenIapClient instead.")]
[EditorBrowsable(EditorBrowsableState.Never)]There was a problem hiding this comment.
Not applying this one in the compatibility shim. Adding [Obsolete] would produce compiler warnings for existing consumers, and warning-as-error projects could treat that as a source break. EditorBrowsable(Never) keeps new-code guidance toward OpenIapClient without making the legacy Iap shim risky for existing apps.
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
packages/docs/src/pages/docs/apis/ios/validate-receipt-ios.tsx (1)
136-143:⚠️ Potential issue | 🟡 MinorCast this sample to
QueryResolver.
ValidateReceiptIOSAsyncis declared onQueryResolver, notMutationResolver, so this cast points at the wrong interface and the C# example won't compile. Switch the receiver cast toQueryResolver.🔧 Proposed fix
-await ((MutationResolver)OpenIapClient.Instance).ValidateReceiptIOSAsync( +await ((QueryResolver)OpenIapClient.Instance).ValidateReceiptIOSAsync(🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/apis/ios/validate-receipt-ios.tsx` around lines 136 - 143, The code example casts OpenIapClient.Instance to MutationResolver, but ValidateReceiptIOSAsync is actually declared on QueryResolver, causing a compilation error. Change the cast from MutationResolver to QueryResolver in the line where ValidateReceiptIOSAsync is being called to reference the correct interface.packages/docs/src/pages/docs/apis/ios/get-external-purchase-custom-link-token-ios.tsx (1)
138-145:⚠️ Potential issue | 🟡 MinorFix the C# call syntax in the example.
tokenType = ...is not valid C# named-argument syntax; usetokenType:instead. The statement is also missing a trailing semicolon.🛠 Proposed fix
-var token = await ((QueryResolver)OpenIapClient.Instance).GetExternalPurchaseCustomLinkTokenIOSAsync( - tokenType = ExternalPurchaseCustomLinkTokenTypeIOS.ACQUISITION -) +var token = await ((QueryResolver)OpenIapClient.Instance).GetExternalPurchaseCustomLinkTokenIOSAsync( + tokenType: ExternalPurchaseCustomLinkTokenTypeIOS.ACQUISITION +);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/apis/ios/get-external-purchase-custom-link-token-ios.tsx` around lines 138 - 145, The C# code example in the CodeBlock component contains invalid named-argument syntax and is missing a semicolon. In the GetExternalPurchaseCustomLinkTokenIOSAsync method call within the csharp CodeBlock, change the named argument from `tokenType = ExternalPurchaseCustomLinkTokenTypeIOS.ACQUISITION` to `tokenType: ExternalPurchaseCustomLinkTokenTypeIOS.ACQUISITION` (use a colon instead of an equals sign for C# named arguments) and add a semicolon at the end of the statement after the closing parenthesis.packages/docs/src/pages/docs/apis/ios/get-pending-transactions-ios.tsx (1)
52-54:⚠️ Potential issue | 🟡 MinorUpdate C# signature to match the library contract.
The C# documentation shows
Task<List<PurchaseIOS>>, butQueryResolver.GetPendingTransactionsIOSAsync()actually returnsTask<IReadOnlyList<PurchaseIOS>>as defined inTypes.csand implemented across all platform resolvers. Update the signature to reflect the actual immutable contract.🔧 Proposed fix
-Task<List<PurchaseIOS>> GetPendingTransactionsIOSAsync() +Task<IReadOnlyList<PurchaseIOS>> GetPendingTransactionsIOSAsync()🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/docs/src/pages/docs/apis/ios/get-pending-transactions-ios.tsx` around lines 52 - 54, The C# method signature in the CodeBlock for GetPendingTransactionsIOSAsync() is showing Task<List<PurchaseIOS>> but the actual implementation returns Task<IReadOnlyList<PurchaseIOS>>. Update the csharp CodeBlock content to use IReadOnlyList instead of List to match the actual library contract defined in Types.cs and implemented across all platform resolvers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/ci-maui-iap.yml:
- Around line 55-58: Replace all instances of the `actions/setup-dotnet@v5`
action with a pinned commit SHA instead of the mutable version tag. For each
occurrence of `actions/setup-dotnet@v5` in the workflow file, replace the `@v5`
reference with the full commit SHA (e.g., `@a9f0a2d3...`) to ensure immutable
supply-chain inputs and prevent the action from being retagged unexpectedly.
In @.github/workflows/release-maui.yml:
- Around line 43-46: The release workflow references the actions/setup-dotnet
action using a version tag (v5) instead of a pinned commit SHA. Replace all
instances of actions/setup-dotnet@v5 with the full commit SHA of that action
version to prevent supply-chain drift and ensure release automation uses
immutable action references. This applies to every occurrence of the
setup-dotnet action in the workflow file.
In
`@packages/docs/src/pages/docs/apis/ios/can-present-external-purchase-notice-ios.tsx`:
- Line 99: The C# code snippets in the documentation are missing trailing
semicolons, which makes them invalid C# syntax. Add a semicolon to the end of
each var assignment statement at the following locations: in
packages/docs/src/pages/docs/apis/ios/can-present-external-purchase-notice-ios.tsx
at line 99, append `;` to the `var can = await
((QueryResolver)OpenIapClient.Instance).CanPresentExternalPurchaseNoticeIOSAsync()`
statement; in packages/docs/src/pages/docs/apis/ios/current-entitlement-ios.tsx
at line 114, append `;` to the `var entitlement = ...` statement; and in
packages/docs/src/pages/docs/apis/ios/get-all-transactions-ios.tsx at line 108,
append `;` to the `var txs = ...` statement.
In `@packages/docs/src/pages/docs/apis/ios/get-app-transaction-ios.tsx`:
- Around line 99-100: Add missing statement-terminating semicolons to the C#
code examples in four iOS API documentation files. In
packages/docs/src/pages/docs/apis/ios/get-app-transaction-ios.tsx lines 99-100,
add a semicolon after GetAppTransactionIOSAsync() before the closing CodeBlock
tag. In packages/docs/src/pages/docs/apis/ios/get-pending-transactions-ios.tsx
lines 102-103, add a semicolon after GetPendingTransactionsIOSAsync(). In
packages/docs/src/pages/docs/apis/ios/get-promoted-product-ios.tsx lines
100-101, add a semicolon after GetPromotedProductIOSAsync(). In
packages/docs/src/pages/docs/apis/ios/get-receipt-data-ios.tsx lines 97-98, add
a semicolon after GetReceiptDataIOSAsync(). Each change follows the same
pattern: locate the respective method call and append a semicolon before the
closing CodeBlock tag to match proper C# syntax.
In
`@packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx`:
- Around line 63-66: The external transaction token should not be logged to
stdout in documentation examples as it is sensitive data meant to be forwarded
to your backend and reported to Google Play only. Remove all Console.WriteLine
calls that print the ExternalTransactionToken in the Subscribe callback across
all affected sites. In
packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx
at lines 63-66, remove the Console.WriteLine(details.ExternalTransactionToken)
call from the DeveloperProvidedBillingAndroid.Subscribe callback. Apply the same
fix at lines 175-182 in the same file. Also remove the Console.WriteLine call
that prints the external transaction token from the user choice billing listener
callback in
packages/docs/src/pages/docs/events/android/user-choice-billing-listener-android.tsx
at lines 177-185.
In `@scripts/audit-non-godot-parity.mjs`:
- Around line 2804-2811: The `startsWith` call on
`mauiBillingClientNuGetVersion` in the condition can throw and crash the script
if the variable is null or undefined, since earlier validation checks only call
`fail(...)` without returning. Add a guard condition to verify that
`mauiBillingClientNuGetVersion` is defined before calling `startsWith` on it,
ensuring missing or invalid values are handled as validation failures rather
than runtime errors.
---
Outside diff comments:
In
`@packages/docs/src/pages/docs/apis/ios/get-external-purchase-custom-link-token-ios.tsx`:
- Around line 138-145: The C# code example in the CodeBlock component contains
invalid named-argument syntax and is missing a semicolon. In the
GetExternalPurchaseCustomLinkTokenIOSAsync method call within the csharp
CodeBlock, change the named argument from `tokenType =
ExternalPurchaseCustomLinkTokenTypeIOS.ACQUISITION` to `tokenType:
ExternalPurchaseCustomLinkTokenTypeIOS.ACQUISITION` (use a colon instead of an
equals sign for C# named arguments) and add a semicolon at the end of the
statement after the closing parenthesis.
In `@packages/docs/src/pages/docs/apis/ios/get-pending-transactions-ios.tsx`:
- Around line 52-54: The C# method signature in the CodeBlock for
GetPendingTransactionsIOSAsync() is showing Task<List<PurchaseIOS>> but the
actual implementation returns Task<IReadOnlyList<PurchaseIOS>>. Update the
csharp CodeBlock content to use IReadOnlyList instead of List to match the
actual library contract defined in Types.cs and implemented across all platform
resolvers.
In `@packages/docs/src/pages/docs/apis/ios/validate-receipt-ios.tsx`:
- Around line 136-143: The code example casts OpenIapClient.Instance to
MutationResolver, but ValidateReceiptIOSAsync is actually declared on
QueryResolver, causing a compilation error. Change the cast from
MutationResolver to QueryResolver in the line where ValidateReceiptIOSAsync is
being called to reference the correct interface.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8723bdfa-1767-4cb2-a86f-10c951d02426
📒 Files selected for processing (98)
.github/workflows/ci-maui-iap.yml.github/workflows/release-maui.ymlknowledge/_claude-context/context.mdknowledge/internal/04-platform-packages.mdlibraries/maui-iap/CLAUDE.mdlibraries/maui-iap/CONVENTION.mdlibraries/maui-iap/README.mdlibraries/maui-iap/example/OpenIap.Maui.Example/Pages/AllProductsPage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/AlternativeBillingPage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/AvailablePurchasesPage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/HomePage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/OfferCodePage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/PurchaseFlowPage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/SubscriptionFlowPage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Pages/WebhookStreamPage.xaml.cslibraries/maui-iap/example/OpenIap.Maui.Example/Utils/IapLifecycle.cslibraries/maui-iap/src/Directory.Build.propslibraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csprojlibraries/maui-iap/src/OpenIap.Maui.Bindings.iOS/OpenIap.Maui.Bindings.iOS.csprojlibraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csprojlibraries/maui-iap/src/OpenIap.Maui/OpenIap.csllms-full.txtllms.txtpackages/docs/public/llms-full.txtpackages/docs/public/llms.txtpackages/docs/scripts/replace-csharp-tabs.mjspackages/docs/src/pages/docs/apis/android/acknowledge-purchase-android.tsxpackages/docs/src/pages/docs/apis/android/check-alternative-billing-availability-android.tsxpackages/docs/src/pages/docs/apis/android/consume-purchase-android.tsxpackages/docs/src/pages/docs/apis/android/create-alternative-billing-token-android.tsxpackages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsxpackages/docs/src/pages/docs/apis/android/enable-billing-program-android.tsxpackages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsxpackages/docs/src/pages/docs/apis/android/launch-external-link-android.tsxpackages/docs/src/pages/docs/apis/android/show-alternative-billing-dialog-android.tsxpackages/docs/src/pages/docs/apis/deep-link-to-subscriptions.tsxpackages/docs/src/pages/docs/apis/end-connection.tsxpackages/docs/src/pages/docs/apis/fetch-products.tsxpackages/docs/src/pages/docs/apis/finish-transaction.tsxpackages/docs/src/pages/docs/apis/get-active-subscriptions.tsxpackages/docs/src/pages/docs/apis/get-available-purchases.tsxpackages/docs/src/pages/docs/apis/get-storefront.tsxpackages/docs/src/pages/docs/apis/has-active-subscriptions.tsxpackages/docs/src/pages/docs/apis/init-connection.tsxpackages/docs/src/pages/docs/apis/ios/begin-refund-request-ios.tsxpackages/docs/src/pages/docs/apis/ios/can-present-external-purchase-notice-ios.tsxpackages/docs/src/pages/docs/apis/ios/clear-transaction-ios.tsxpackages/docs/src/pages/docs/apis/ios/current-entitlement-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-all-transactions-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-app-transaction-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-external-purchase-custom-link-token-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-pending-transactions-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-promoted-product-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-receipt-data-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-storefront-ios.tsxpackages/docs/src/pages/docs/apis/ios/get-transaction-jws-ios.tsxpackages/docs/src/pages/docs/apis/ios/is-eligible-for-external-purchase-custom-link-ios.tsxpackages/docs/src/pages/docs/apis/ios/is-eligible-for-intro-offer-ios.tsxpackages/docs/src/pages/docs/apis/ios/is-transaction-verified-ios.tsxpackages/docs/src/pages/docs/apis/ios/latest-transaction-ios.tsxpackages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsxpackages/docs/src/pages/docs/apis/ios/present-external-purchase-link-ios.tsxpackages/docs/src/pages/docs/apis/ios/present-external-purchase-notice-sheet-ios.tsxpackages/docs/src/pages/docs/apis/ios/request-purchase-on-promoted-product-ios.tsxpackages/docs/src/pages/docs/apis/ios/show-external-purchase-custom-link-notice-ios.tsxpackages/docs/src/pages/docs/apis/ios/show-manage-subscriptions-ios.tsxpackages/docs/src/pages/docs/apis/ios/subscription-status-ios.tsxpackages/docs/src/pages/docs/apis/ios/sync-ios.tsxpackages/docs/src/pages/docs/apis/ios/validate-receipt-ios.tsxpackages/docs/src/pages/docs/apis/request-purchase.tsxpackages/docs/src/pages/docs/apis/restore-purchases.tsxpackages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsxpackages/docs/src/pages/docs/events/android/user-choice-billing-listener-android.tsxpackages/docs/src/pages/docs/events/ios/promoted-product-listener-ios.tsxpackages/docs/src/pages/docs/events/purchase-error-listener.tsxpackages/docs/src/pages/docs/events/purchase-updated-listener.tsxpackages/docs/src/pages/docs/events/subscription-billing-issue-listener.tsxpackages/docs/src/pages/docs/features/discount.tsxpackages/docs/src/pages/docs/features/refund.tsxpackages/docs/src/pages/docs/features/subscription-billing-issue.tsxpackages/docs/src/pages/docs/features/subscription/index.tsxpackages/docs/src/pages/docs/features/subscription/upgrade-downgrade.tsxpackages/docs/src/pages/docs/features/validation.tsxpackages/docs/src/pages/docs/getting-started.tsxpackages/docs/src/pages/docs/kit-backend.tsxpackages/docs/src/pages/docs/setup/maui.tsxpackages/docs/src/pages/docs/types/alternative-billing-types.tsxpackages/docs/src/pages/docs/types/billing-programs.tsxpackages/docs/src/pages/docs/types/external-purchase-link.tsxpackages/docs/src/pages/docs/types/ios/app-transaction-ios.tsxpackages/docs/src/pages/docs/types/product-request.tsxpackages/docs/src/pages/docs/types/purchase-updated-listener-options.tsxpackages/docs/src/pages/docs/types/request-purchase-props.tsxpackages/docs/src/pages/docs/types/verify-purchase-with-provider-result.tsxpackages/docs/src/pages/introduction.tsxscripts/agent/compile-context.tsscripts/audit-non-godot-parity.mjsscripts/sync-versions.sh
Fix MAUI C# documentation snippets, avoid logging external transaction tokens in examples, and guard the parity audit against missing BillingClient NuGet metadata.
|
Addressed the actionable CodeRabbit feedback in
I intentionally left the |
Pin actions/setup-dotnet to the current v5 commit SHA in MAUI CI and release workflows.
|
/gemini review |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Code Review
This pull request updates the .NET MAUI SDK (maui-iap) by renaming the static facade Iap to OpenIapClient to prevent namespace collisions, while retaining Iap as a backward-compatible alias. It also introduces support for .NET 10 target frameworks and refactors Android dependencies to use NuGet PackageReferences instead of fat-bundled Maven AARs, allowing consumer apps to deduplicate dependencies. Feedback on the changes suggests a security improvement in billing-programs.tsx to avoid logging the sensitive ExternalTransactionToken to the console, aligning with best practices implemented in other documentation files.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Extend the MAUI sample app to build net10 Android, iOS, and Mac Catalyst targets alongside net9. Add a parity audit guard for the sample target matrix and clean up generated docs snippets flagged during review.
|
/gemini review |
|
@coderabbitai review |
✅ Action performedReview finished.
|
Update the MAUI billing-programs C# example to avoid printing ExternalTransactionToken values in logs.
|
/gemini review |
|
@coderabbitai review |
There was a problem hiding this comment.
Code Review
This pull request adds support for .NET 10 target frameworks across the MAUI SDK (maui-iap), transitions transitive Google and AndroidX dependencies from fat-bundled AARs to standard NuGet PackageReference dependencies to allow deduplication, and renames the static facade from Iap to OpenIapClient (with a legacy Iap compatibility shim) to prevent namespace collisions. Additionally, the documentation, examples, version sync scripts, and parity audits are updated to reflect these changes. The review feedback correctly points out a security improvement opportunity to avoid logging the raw ExternalTransactionToken in the billing programs documentation example to prevent sensitive data exposure.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
Code Review
This pull request introduces support for .NET 10 in the maui-iap library, updating target frameworks, workflows, and example apps. It refactors the Android package dependency structure by moving transitive Google, AndroidX, and Kotlin libraries from fat-bundled AARs to standard NuGet PackageReference dependencies to allow consumer apps to deduplicate them. Additionally, it renames the static facade Iap to OpenIapClient to prevent namespace collisions, while retaining Iap as a backward-compatible legacy shim. Documentation and examples are updated accordingly. Feedback suggests marking the legacy Iap class with the [Obsolete] attribute to guide developers toward the new OpenIapClient class.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| [EditorBrowsable(EditorBrowsableState.Never)] | ||
| public static class Iap |
There was a problem hiding this comment.
Since the Iap class is kept as a legacy backward-compatible alias/facade, it should be marked with the [Obsolete] attribute. This will provide compiler warnings and IDE visual cues (like strikethroughs) to guide developers toward using the new OpenIapClient class instead.
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("Use OpenIapClient instead.")]
public static class IapThere was a problem hiding this comment.
Not applying this duplicate for the same compatibility reason as the earlier thread. This class is a source-compatible shim for existing consumers; adding [Obsolete] would introduce compiler warnings in current apps, and warning-as-error projects could experience this as a source break. EditorBrowsable(Never) gives new-code guidance without making the compatibility alias risky.
Summary
OpenIapClientas the preferred MAUI facade and keepIapas a hidden legacy shim for compatibilityGitdog review
OpenIap.Maui.Iapnamespace existed in source and recommended names that did not match this repo. This PR usesOpenIapClientand keepsIapas a compatibility shim.Xamarin.Android.Google.BillingClient,GoogleGson, AndroidX/Kotlin alignment deps) and verifies the resulting package.Verification
bash scripts/sync-versions.shbun run compile:aiinscripts/agentbun audit:paritybun audit:docsbun run typecheckinpackages/docsbun run buildinpackages/docs./gradlew :openiap:assemblePlayReleaseinpackages/google../../../packages/google/gradlew :openiap:assembleReleaseinlibraries/maui-iap/androiddotnet build libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj -p:TargetFrameworks=net9.0 --nologodotnet build libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj -p:TargetFrameworks=net10.0 --nologodotnet build libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj -p:TargetFrameworks=net9.0-android --nologodotnet build libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj -p:TargetFrameworks=net10.0-android --nologodotnet build libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj -p:TargetFrameworks=net9.0-android --nologodotnet build libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj -p:TargetFrameworks=net10.0-android --nologobash packages/apple/scripts/build-xcframework.shdotnet pack libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj -c Release -o /tmp/openiap-maui-pack-178180 --nologo/tmp/openiap-maui-pack-178180/OpenIap.Maui.1.1.1.nupkg: onlyopeniap-release.aarandopeniap-play-release.aarare packaged; Google/AndroidX/Kotlin artifacts are nuspec dependenciesdotnet build /tmp/openiap-conflict-test/openiap-conflict-test.csproj --nologodotnet build /tmp/openiap-net10-android-plain/openiap-net10-android-plain.csproj --nologodotnet build libraries/maui-iap/example/OpenIap.Maui.Example/OpenIap.Maui.Example.csproj -p:TargetFrameworks=net9.0-android --nologogit diff --checkCloses #178
Closes #179
Closes #180
Summary by CodeRabbit
New Features
Documentation
OpenIapClient(withIapretained as a backward-compatible alias).Build / CI