All notable changes to this package will be documented in this file.
- Android: bumped the
superwall-androidpin from 2.7.21 to 2.7.23. Transitive dependencies are unchanged (stillandroidx.activity1.10.1 / Billing 8.0.0), so the compile SDK andminSdkrequirements of this package are unaffected. Upstream in that range:- Fixes paywall text inputs silently dropping non-Latin keyboard text (Cyrillic, Korean, Thai, emoji). The webview no longer replaces Chromium's
InputConnectionunlessisGameControllerEnabledis set, restoring composition, autocorrect, swipe typing and autofill. - Errors thrown when the user lacks billing no longer propagate to the app.
- The backend is always notified of purchased entitlements.
- Fixes paywall text inputs silently dropping non-Latin keyboard text (Cyrillic, Korean, Thai, emoji). The webview no longer replaces Chromium's
- Android:
SuperwallSDK.androidlibno longer hardcodescompileSdkVersion 34— it now inherits the host project's compile SDK fromunity.compileSdkVersion(written intogradle.propertiesby Unity from Player Settings), with a fallback of 35. FixescheckReleaseAarMetadatafailures after superwall-android started requiring compileSdk 35+ via androidx.activity 1.10.1. - Android:
superwall-androidis now pinned to an exact version (2.7.21) instead of the floating2.+, so a Maven-side release can no longer break consumer builds overnight. The pin will be bumped deliberately with each Unity SDK release. - Android: the
kotlin-androidplugin is only applied on AGP < 9. AGP 9+ (custom gradle templates / future Unity versions) ships built-in Kotlin, and applying the external plugin there crashed Gradle evaluation (BaseExtensionremoved / duplicatekotlinextension). The module's build script now uses new-DSL-safe syntax and builds under both AGP 8.x and AGP 9. - Android:
restorePurchasesbridge callback never fired — superwall-android 2.7.x changedrestorePurchases()to returnResult<RestorationResult>, which the bridge still matched as a bareRestorationResult(bothwhenbranches were unreachable). Now unwrapped correctly. - iOS: the generated Podfile no longer hardcodes
platform :ios, '16.0'— it honors the minimum iOS version from Player Settings (fallback 15.0), so Pods build for the same deployment target as the host app and older simulators/devices stay selectable in Xcode.
- The Android harness job is now a matrix over AGP 8.5.2/Gradle 8.7 and AGP 9.0.1/Gradle 9.3.1, with the harness AGP version parameterized via
-PagpVersion.
- Fix configure result emitting an unknown error on success
- iOS
_SuperwallBridge_ShowAlertABI mismatch (3 pointers vs C#(string)) — now takes a singlealertJsonstring matching the C# extern. iOS additionally fires theonCloseCallbackIdimmediately so the pending C# callback is cleaned up. - Android
showAlertwas readingactionCallbackId/closeCallbackId, but C# emitsonActionCallbackId/onCloseCallbackId— alert callbacks never fired. Fixed. - iOS bridge: removed access to internal
Superwall.shared.options—SetLocalResourcesnow stashes the resource map and applies it viaSuperwallOptions.localResourcesduringConfigure(must be called beforeConfigureon iOS; logs a warning otherwise). - Post-build
pod installnow locatespodacross common install paths (/usr/local/bin,/opt/homebrew/bin, rbenv/asdf shims,which podunder a login shell) and runs under a login shell so user PATH from~/.zshrc/~/.bash_profileis honored. Clear manual-install instructions on failure. - Post-build
pod installnow setsLANG=en_US.UTF-8andLC_ALL=en_US.UTF-8in the subprocess so CocoaPods no longer crashes withEncoding::CompatibilityErrorwhen Unity is launched from Finder (inherits launchd's emptyLANG).
- Added
Tests/Runtime/BridgeContractTests.cscovering the async-response contract, Configure success/failure paths, and the delegate/handler payload shapes for the regressions fixed in this release.
- Added
.github/workflows/native.yml— builds the iOS Swift bridge via SPM on macOS and the Android.androidlibvia Gradle on Ubuntu, on every push and PR. No Unity license required. - Added parked
.github/workflows/unity.ymlfor full game-ci Unity build + test runs, documented with the licensing secrets and wrapping-project steps needed to enable it. - CI harness scaffolding lives under
ci~/(tilde-suffixed so Unity ignores it during package import — never copied into player builds).
- Minimum Unity version lowered from
6000.4to6000.3.
- Android purchase controller parity with the iOS purchase controller flow
SetIntegrationAttribute/SetIntegrationAttributesnow route toSuperwall.instance.setIntegrationAttributeswithAttributionProviderparsingGetOverrideProductsByName/SetOverrideProductsByNamenow read/writeSuperwall.instance.overrideProductsByNameGetEntitlementsByProductIdsnow resolves throughentitlements.byProductIds(...)and returns serialized entitlement setConsume(token, completion)now invokes the suspendSuperwall.instance.consume(token)and reportssuccess/failedwith token or error
SetLocalResources(Dictionary<string, string>)is now implemented on iOS — setsSuperwall.shared.options.localResources, supporting bothfile://URLs and raw paths
- Minor issue fixes
- Fix mapping issue with skip handlers and product shape for getProducts
Configurecompletion signature changed fromAction<bool>toAction<ConfigurationResult>to match the native SDKs'Result<Unit>semantics. The result exposesIsSuccessand a typedFailedResult.Erroron failure. Android now propagates SDK init errors through this; iOS still always signals success since SuperwallKit's completion has no failure variant.
- Renamed asmdef files to
Superwall.*
SetLocalResources(Dictionary<string, string>)— map asset names to local file paths for paywall WebViews (Android only)
- Android: added
willRedeemLink,didRedeemLink,userAttributesDidChangedelegate callbacks - iOS: added
handleSuperwallDeepLink,userAttributesDidChangedelegate callbacks - iOS: added
ShowAlertno-op stub to prevent missing symbol crash
- Full Android support via bundled
.androidlibGradle module — no manualmainTemplate.gradlesetup needed - Kotlin bridge compiled with Kotlin 2.0.21 to match Superwall Android SDK 2.x
- Custom
ActivityProviderfor Unity ensures paywall presentation works correctly - AndroidManifest with required activity declarations merged automatically
Purchase(productId, callback)— programmatic purchase without a paywallGetProducts(productIds, callback)— fetch product details by IDGetAssignments(callback)— get experiment assignments without confirmingShowAlert(title, message, ...)— show alerts on the current paywallRefreshConfiguration()— force SDK config refresh
- Full
SuperwallOptionsparsing on both platforms (was incomplete) - Added
PaywallOptions.UseCachedTemplatesandPaywallOptions.TimeoutAfter TestModeBehavior,NetworkEnvironment,Paywalls.*,Logging.Scopesnow properly passed to native SDKs
- All
ISuperwallDelegatecallbacks now receive deserialized objects instead of null SubscriptionStatusgetter properly deserializes native state (was always returning Unknown)- All async getters (
Entitlements,CustomerInfo,PaywallInfo,PresentationResult,ConfirmedAssignment,RestorationResult) now deserialize correctly - Fixed async callback mechanism — was dropping response data, causing
Configurecompletion to always return false
- Purchase controller flow implemented with async continuations
- Integration attributes mapping implemented
- Full options parity with Android
- Removed legacy
com.ian_unity558.com.superwall.sdkpackage - Removed stale
EnsureAndroidGradleDependencyeditor script (replaced by.androidlib)
- Android package support
- Handler callback arguments
- More properties implemented
- Improved option support
- iOS support, registering and callbacks