The changelog for Superwall
. Also see the releases on GitHub.
- Renames
SuperwallPlacement
back toSuperwallEvent
- Fixes issue with
NoAudienceMatch
appearing on some devices and issues with certain campaign rules
- Changes back to
handleSuperwallEvent
naming with a deprecation notice and a typealias for previous methods
- Removes extra failure logging when displaying alerts
- Finds nearest activity instead of relying just on Context in
PaywallComposable
- Improves cleanup in
PaywallComposable
Our 2.0.0 release brings some major and minor changes to both our API's and core features. For more information, please look at our migration docs
- Adds
PaywallBuilder
class as an alternative to existinggetPaywallView
method. This provides a cleaner API and an ability to change purchase loading bar and shimmer view. - Ensure safety of static webview calls that are known to fail randomly due to Webview's internal issues
- Adds
purchase
method toSuperwall
you can use to purchase products without having to resort on paywalls. To purchase a product you can pass it in one of the following objects:- Google Play's
ProductDetails
- Superwall's
StoreProduct
object - Or a string containing the product identifier, i.e.
Superwall.instance.purchase("product_id:base_plan:offer")
- Google Play's
- Adds
restorePurchases
method toSuperwall
you can use to handle restoring purchases - Adds
getProducts
method toSuperwall
you can use to retrieve a list ofProductDetails
given the product ID, i.e. i.e.Superwall.instance.purchase("product_id:base_plan:offer")
- Adds support for observing purchases done outside of Superwall paywalls. You can now observe purchases done outside of Superwall paywalls by setting the
shouldObservePurchases
option to true and either:- Manually by calling
Superwall.instance.observe(PurchasingObserverState)
or utility methodsSuperwall.instance.observePurchaseStart/observePurchaseError/observePurchaseResult
- Automatically by replacing
launchBillingFlow
withlaunchBillingFlowWithSuperwall
. This will automatically observe purchases done outside of Superwall paywalls.
- Manually by calling
- Adds consumer proguard rules to enable consumer minification
Superwall.instance
now provides blocking or callback based version of multiple calls, suffixed with*Sync
- Improves preloading performance and reduces impact on the main thread
- Reduces minSDK to 22
SuperwallPaywallActivity
andPaywallView
have been moved intocom.superwall.sdk.paywall.view
package fromcom.superwall.sdk.paywall.vc
package.- Removes
PaywallComposable
and Jetpack Compose support from the main SDK artifact in favor ofSuperwall-Compose
module for Jetpack Compose support:- You can find it at
com.superwall.sdk:superwall-compose:2.0.0-alpha
- Usage remains the same as before, but now you need to include the
superwall-compose
module in your project.
- You can find it at
- Removed methods previously marked as Deprecated
SubscriptionStatus.Active
now takes in a set ofEntitlements
, whileInactive
andActive
have been turned into objects.Superwall.instance.register
now usesplacement
instead ofevent
as the argument namepreloadPaywalls
now usesplacementNames
instead ofeventNames
as the argument namePaywallPresentationHandler.onDismiss
now has two arguments,PaywallInfo
andPaywallResult
PaywallComposable
now usesplacement
argument instead ofevent
TriggerResult.NoRuleMatch
andTriggerResult.EventNotFound
have been renamed toTriggerResult.NoAudienceMatch
andTriggerResult.PlacementNotFound
PresentationResult.NoRuleMatch
andPresentationResult.EventNotFound
have been renamed toPresentationResult.NoAudienceMatch
andPresentationResult.PlacementNotFound
SuperwallEvent
has been renamed toSuperwallPlacement
, belonging properties witheventName
have been renamed toplacementName
SuperwallEventInfo
has been renamed toSuperwallPlacementInfo
ComputedPropertyRequest.eventName
has been renamed toComputedPropertyRequest.placementName
Superwall.instance.events
has been renamed toSuperwall.instance.placements
LogScope.events
has been renamed toLogScope.placements
PaywallPresentationRequestStatusReason.EventNotFound
has been renamed toPaywallPresentationRequestStatusReason.PlacementNotFound
PaywallSkippedReason.EventNotFound
has been renamed toPaywallSkippedReason.PlacementNotFound
SuperwallDelegate.handleSuperwallEvent
method has been renamed toSuperwallDelegate.handleSuperwallPlacement
- Removed
PurchaseResult.Restored
Superwall.instance.register
now usesplacement
instead ofevent
as the argument namepreloadPaywalls
now usesplacementNames
instead ofeventNames
as the argument name- Superwall's
PaywallPresentationHandler.onDismiss
now has two arguments,PaywallInfo
andPaywallResult
PaywallComposable
now usesplacement
argument instead ofevent
- Remove
PurchaseResult.Restored
SuperwallEvents.entitlementStatusDidChange
has been renamed toSuperwallEvents.subscriptionStatusDidChange
SuperwallDelegate.entitlementStatusDidChange
has been renamed toSuperwallEvents.entitlementStatusDidChange
TriggerResult.NoRuleMatch
andTriggerResult.EventNotFound
have been renamed toTriggerResult.NoAudienceMatch
andTriggerResult.PlacementNotFound
PresentationResult.NoRuleMatch
andPresentationResult.EventNotFound
have been renamed toPresentationResult.NoAudienceMatch
andPresentationResult.PlacementNotFound
SuperwallEvent
has been renamed toSuperwallPlacement
, belonging properties witheventName
have been renamed toplacementName
SuperwallEventInfo
has been renamed toSuperwallPlacementInfo
ComputedPropertyRequest.eventName
has been renamed toComputedPropertyRequest.placementName
Superwall.instance.events
has been renamed toSuperwall.instance.placements
LogScope.events
has been renamed toLogScope.placements
PaywallPresentationRequestStatusReason.EventNotFound
has been renamed toPaywallPresentationRequestStatusReason.PlacementNotFound
PaywallSkippedReason.EventNotFound
has been renamed toPaywallSkippedReason.PlacementNotFound
SuperwallDelegate.handleSuperwallEvent
method has been renamed toSuperwallDelegate.handleSuperwallPlacement
- API Changes:
- Migration of
setEntitlementStatus
tosetSubscriptionStatus
- Exposing
Superwall.instance.entitlementsStatus
- Migration of
SuperwallDelegate.entitlementStatusDidChange
toSuperwallDelegate.subscriptionStatusDidChange
- Migration of
- Add
PaywallBuilder
class as an alternative to existinggetPaywallView
method. This provides a cleaner API and an ability to change purchase loading bar and shimmer view. - Add callback versions of new 2.0 methods
- Ensure safety of static webview calls that are known to fail randomly due to Webview's internal issues
SuperwallPaywallActivity
andPaywallView
have been moved intocom.superwall.sdk.paywall.view
package fromcom.superwall.sdk.paywall.vc
package.- Removes
PaywallComposable
and Jetpack Compose support from the main SDK artifact in favor ofSuperwall-Compose
module for Jetpack Compose support:- You can find it at
com.superwall.sdk:superwall-compose:2.0.0-alpha
- Usage remains the same as before, but now you need to include the
superwall-compose
module in your project.
- You can find it at
- Removed methods previously marked as Deprecated
- Removes
SubscriptionStatus
, together with belonging update methods andsubscriptionStatusDidChange
callback. - These are replaced with
EntitlementStatus
andentitlementStatusDidChange
callback. You can find more details on this migration in our docs.
-
Adds
purchase
method toSuperwall
you can use to purchase products without having to resort on paywalls. To purchase a product you can pass it in one of the following objects:- Google Play's
ProductDetails
- Superwall's
StoreProduct
object - Or a string containing the product identifier, i.e.
Superwall.instance.purchase("product_id:base_plan:offer")
- Google Play's
-
Adds
restorePurchases
method toSuperwall
you can use to handle restoring purchases -
Adds
getProducts
method toSuperwall
you can use to retrieve a list ofProductDetails
given the product ID, i.e. i.e.Superwall.instance.purchase("product_id:base_plan:offer")
-
Adds support for observing purchases done outside of Superwall paywalls. You can now observe purchases done outside of Superwall paywalls by setting the
shouldObservePurchases
option to true and either:- Manually by calling
Superwall.instance.observe(PurchasingObserverState)
or utility methodsSuperwall.instance.observePurchaseStart/observePurchaseError/observePurchaseResult
- Automatically by replacing
launchBillingFlow
withlaunchBillingFlowWithSuperwall
. This will automatically observe purchases done outside of Superwall paywalls.
- Manually by calling
-
Adds consumer proguard rules to enable consumer minification
-
Reduces minSDK to 22
-
Adds
purchaseToken
to purchase events -
Superwall.instance
now provides blocking or callback based version of multiple calls, suffixed with*Sync
-
Improves preloading performance and reduces impact on the main thread
- Fixes potential distribution issues for variant selection in edge cases
- Fixes potential memory leaks of paywall calling activity
- Fixes issue when a paywall would dismiss with
ForNextPaywall
but next paywall could not be shown due to triggers or limits. Now it resolves into the proper dismiss status.
- Add
purchaseToken
to TransactionComplete
- Fix chromium crashes caused by race conditions in webview's implementation
- Updates superscript dependencies to reduce minSDK version
- Adds consumer proguard rules to avoid minifying JNA classes during minification
- Adds
shimmerView_start
andshimmerView_complete
events to track the loading of the shimmer animation. - Makes
hasFreeTrial
match iOS SDK behavior by returningtrue
for both free trials and non-free introductory offers - Adds
Superwall.instance.events
- A SharedFlow instance emitting all Superwall events asSuperwallEventInfo
. This can be used as an alternative to a delegate for listening to events. - Adds a new shimmer animation
- Adds support for SuperScript expression evaluator
- Fixes concurrency issues with subscriptions triggered in Cordova apps
- Adds
shimmerView_start
andshimmerView_complete
events to track the loading of the shimmer animation. - Makes
hasFreeTrial
match iOS SDK behavior by returningtrue
for both free trials and non-free introductory offers
- Adds
Superwall.instance.events
- A SharedFlow instance emitting all Superwall events asSuperwallEventInfo
. This can be used as an alternative to a delegate for listening to events. - Adds a new shimmer animation
- Adds support for SuperScript expression evaluator
- Adds
appVersionPadded
attribute
- Fixes issue where
PaywallPresentationHandler.onError
would be skipped in case ofBillingError
s
- Improves paywall loading and preloading performance
- Reduces impact of preloading on render performance
- Updates methods to return
kotlin.Result
instead of relying on throwing exceptions - This introduces some minor breaking changes:
configure
completion block now provides aResult<Unit>
that can be used to check for success or failurehandleDeepLink
now returns aResult<Boolean>
getAssignments
now returns aResult<List<ConfirmedAssignments>>
confirmAllAssignments
now returns aResult<List<ConfirmedAssignments>>
getPresentationResult
now returns aResult<PresentationResult>
getPaywallComponents
now returns aResult<PaywallComponents>
- Removes Gson dependency
- Adds
isScrollEnabled
flag to enable remote control of Paywall scrollability - Adds
PaywallResourceLoadFail
event to enable tracking of failed resources in Paywall - Improves bottom navigation bar color handling
- Fixes issue where paywalls without fallback would fail to load and missing resource would cause a failure event
- Fixes issue with
trialPeriodDays
rounding to the higher value instead of lower, i.e. whereP4W2D
would return 28 days instead of 30, it now returns 30. - Fixes issue with system navigation bar not respecting paywall color
- Fixes issues with cursor allocation in Room transaction
- Improves handling of chromium render process crash
- Fixes issue where paywalls without fallback would fail to load and missing resource would cause a failure event
- Removes Gson dependency
- Adds
isScrollEnabled
flag to enable remote controll of Paywall scrollability
- Fixes issue with
trialPeriodDays
rounding to the higher value instead of lower, i.e. whereP4W2D
would return 28 days instead of 30, it now returns 30. - Fixes issue with system navigation bar not respecting paywall color
- Reduces impact of preloading on render performance
- Fixes issues with cursor allocation in Room transaction
- Updates methods to return
kotlin.Result
instead of relying on throwing exceptions - This introduces some minor breaking changes:
configure
completion block now provides aResult<Unit>
that can be used to check for success or failurehandleDeepLink
now returns aResult<Boolean>
getAssignments
now returns aResult<List<ConfirmedAssignments>>
confirmAllAssignments
now returns aResult<List<ConfirmedAssignments>>
getPresentationResult
now returns aResult<PresentationResult>
getPaywallComponents
now returns aResult<PaywallComponents>
- Fixes issue when destroying activities during sleep would cause a background crash
- Fixes issue when using Superwall with some SDK's would cause a crash (i.e. Smartlook SDK)
- The existing
getPaywall
method has been deprecated and renamed togetPaywallOrThrow
. The newgetPaywall
method now returns akotlin.Result<PaywallView>
instead of throwing an exception. - Adds a new option to
SuperwallOptions
-passIdentifiersToPlayStore
which allows you to pass the user's identifiers (fromSuperwall.instance.identify(userId: String, ...)
) to the Play Store when making a purchase. Note: When passing in identifiers to use with the play store, please make sure to follow their [guidelines](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setObfuscatedAccountId(java.lang.String). - Adds
Superwall.instance.confirmAllAssignments()
, which confirms assignments for all placements and returns an array of all confirmed experiment assignments. Note that the assignments may be different when a placement is registered due to changes in user, placement, or device parameters used in audience filters.
- Fixes issues with Paywall sometimes not displaying when returning from background
- Fixes issue with SDK crashing when WebView is not available
- Fixes issue with
SuperwallPaywallActivity
NPE - Update visibility of internal
getPaywall
methods tointernal
to prevent misuse
- Fixes issues with
MODAL
presentation style and scrolling containers - Fixes issues with
FULLSCREEN
presentation style rendering behind navigation
- Fixes issues with Paywall presentation styles not being properly passed
- Exposes current configuration status via
Superwall.instance.configurationStatus
- Fixes issues with Paywall previews not loading
- Fixes issue where the paywall would not show in some cases when using
minutes_since
- Fixes issue with wrong URL being logged when a paywall fails to load
- Adds a
Modifier
toPaywallComposable
to allow for more control - Adds a
PaywallView.setup(...)
method to allow for easy setup when usingPaywallView
directly - Adds support for
MODAL
presentation style
- Fixes issue with displaying
PaywallComposable
- Resolves issue where users would get
UninitializedPropertyAccessException
when callingSuperwall.instance
- For users who are not able to upgrade their AGP or Gradle versions, we have added a new artifact
superwall-android-agp-7
which keeps compatibility.
- Fixes issue with decoding custom placements from paywalls.
- Expose
placementName
,paywallInfo
andparams
on acustom_placement
event
- Adds support for multiple paywall URLs, in case one CDN provider fails.
ActivityEncapsulatable
now uses a WeakReference instead of a reference- SW-2900: Adds Superwall.instance.localeIdentifier as a convenience variable that you can use to dynamically update the locale used for evaluating rules and getting localized paywalls.
- SW-2919: Adds a
custom_placement
event that you can attach to any element in the paywall with a dictionary of parameters. When the element is tapped, the event will be tracked. The name of the placement can be used to trigger a paywall and its params used in audience filters. - Adds support for bottom sheet presentation style (DRAWER), no animation style and default animation.
- Adds
build_id
andcache_key
toPaywallInfo
. - SW-2917: Tracks a
config_attributes
event after callingSuperwall.configure
, which contains info about the configuration of the SDK. This gets tracked whenever you set the delegate. - Adds in device attributes tracking after setting the interface style override.
- To comply with new Google Play Billing requirements we now avoid setting empty
offerToken
for one-time purchases
- Adds the ability for the SDK to refresh the Superwall configuration every session start, subject to a feature flag.
- Tracks a
config_refresh
Superwall event when the configuration is refreshed. - SW-2890: Adds
capabilities
to device attributes. This is a comma-separated list of capabilities the SDK has that you can target in audience filters. This release adds thepaywall_event_receiver
capability. This indicates that the paywall can receive transaction from the SDK. - SW-2902: Adds
abandoned_product_id
to atransaction_abandon
event to use in audience filters. You can use this to show a paywall if a user abandons the transaction for a specific product.
- Adds DSL methods for configuring the SDK. You can now use a configuration block:
fun Application.configureSuperwall( apiKey: String, configure: SuperwallBuilder.() -> Unit, )
This allows you to configure the SDK in a more idiomatic way:
configureSuperwall(CONSTANT_API_KEY){
options {
logging {
level = LogLevel.debug
}
paywalls {
shouldPreload = false
}
}
}
This release includes multiple deprecations that will be removed in upcoming versions. Most are internal and will not affect the public API, those that will are marked as such and a simple migration path is provided. The notable ones in the public API are as follows:
-
Deprecated
DebugViewControllerActivity
in favor ofDebugViewActivity
-
Deprecated
PaywallViewController
in favor ofPaywallView
- Deprecated belonging methods:
viewWillAppear
in favor ofbeforeViewCreated
viewDidAppear
in favor ofonViewCreated
viewWillDisappear
in favor ofbeforeOnDestroy
viewDidDisappear
in favor ofdestroyed
presentAlert
in favor ofshowAlert
- Deprecated belonging methods:
-
Deprecated
PaywallViewControllerDelegate
in favor ofPaywallViewCallback
- Deprecated belonging methods:
didFinish
in favor ofonFinished
- Deprecated belonging methods:
-
Deprecated
PaywallViewControllerEventDelegate
in favor ofPaywallViewEventCallback
- Users might also note deprecation of
PaywallWebEvent.OpenedUrlInSafari
in favor ofPaywallWebEvent.OpenedUrlInChrome
didFinish
in favor ofonFinished
- Users might also note deprecation of
-
In
Superwall
, the following methods were deprecated:Superwall.paywallViewController
in favor ofSuperwall.paywallView
Superwall.eventDidOccur
argumentpaywallViewController
in favor ofpaywallView
Superwall.dismiss
in favor of `Superwall.presentPaywallViewSuperwall.presentPaywallViewController
in favor ofSuperwall.presentPaywallView
-
Deprecated
Paywallmanager.getPaywallViewController
in favor ofPaywallManager.getPaywallView
-
Deprecated
DebugManager.viewController
in favor ofDebugManager.view
-
Deprecated
DebugViewController
in favor ofDebugView
-
Deprecated
LogScope.debugViewController
in favor ofLogScope.debugView
-
Deprecated
PaywallPresentationRequestStatus.NoPaywallViewController
in favor ofNoPaywallView
- Deprecated configuration method
Superwall.configure(applicationContext: Context, ...)
in favor ofSuperwall.configure(applicationContext: Application, ...)
to enforce type safety. The rest of the method signature remains the same.
- SW-2878: and it's related leaks. The
PaywallViewController
was not being properly detached when activity was stopped, causing memory leaks. - SW-2872: Fixes issue where
deviceAttributes
event and fetching would not await for IP geo to complete. - Fixes issues on tablet devices where the paywall would close after rotation/configuration change.
- SW-2859: Adds error message to
paywallWebviewLoad_fail
. - SW-2866: Logs error when trying to purchase a product that has failed to load.
- SW-2869: Add
Reset
event to track whenSuperwall.instance.reset
is called. - SW-2867: Prevents Geo api from being called when app is in the background
- SW-2431: Improves coroutine scope usages & threading limits
- Toolchain and dependency updates
- SW-2863: Fixed a
NullPointerException
some users on Android 12 & 13 would experience when callingconfigure
.
- SW-2805: Exposes a
presentation
property on thePaywallInfo
object. This contains information about the presentation of the paywall. - SW-2855: Adds
restore_start
,restore_complete
, andrestore_fail
events.
- SW-2854: Fixed issue where abandoning the transaction by pressing back would prevent the user from restarting the transaction.
- SW-2833: Adds support for dark mode paywall background color.
- Adds ability to target devices based on their IP address location. Use
device.ipRegion
,device.ipRegionCode
,device.ipCountry
,device.ipCity
,device.ipContinent
, ordevice.ipTimezone
. - Adds
event_name
to the event params for use with audience filters.
- Fixes issue with products whose labels weren't primary/secondary/tertiary.
- Fixes thread safety crash when multiple threads attempted to initialize the
JavaScriptSandbox
internally.
- Tracks an
identity_alias
event whenever identify is called to alias Superwall's anonymous ID with a developer provided id. - Adds
setInterfaceStyle(interfaceStyle:)
which can be used to override the system interface style. - Adds
device.interfaceStyleMode
to the device template, which can beautomatic
ormanual
if overriding the interface style.
- Uses
JavascriptSandbox
when available for filter expression evaluation on a background thread instead of running code on the main thread in a webview. - Fixes crash where the loading spinner inside the
PaywallViewController
was being updated outside the main thread.
- Updates build.gradle configuration which means we can now upload the SDK to maven central. You no longer need to specify our custom repo in your build.gradle to get our SDK and therefore installation should be easier.
- Fixes
ConcurrentModificationException
crash that sometimes happened when identifying a user. - Fixes crash on purchasing a free trial when using
getPaywall
.
- Fixes an issue loading products with offers.
- SW-2768: Adds
device.regionCode
anddevice.preferredRegionCode
, which returns theregionCode
of the locale. For example, if a locale isen_GB
, theregionCode
will beGB
. You can use this in the filters of your campaign. - Adds support for unlimited products in a paywall.
- SW-2785: Adds internal feature flag to disable verbose events like
paywallResponseLoad_start
.
- SW-2732: User attributes weren't being sent on app open until identify was called. Now they are sent every time there's a new session.
- SW-2733: Fixes issue where the spinner would still show on a paywall if a user had previously purchased on it.
- SW-2744: Fixes issue where using the back button to dismiss a paywall presented via
getPaywall
would calldidFinish
in thePaywallViewControllerDelegate
with the incorrect values. - Fixes issue where an invalid paywall background color would prevent the paywall from opening. If this happens, it will now default to white.
- SW-2748: Exposes
viewWillAppear
,viewDidAppear
,viewWillDisappear
andviewDidDisappear
methods ofPaywallViewController
which you must call when usinggetPaywall
. - Stops
Superwall.configure
from being called multiple times. getPresentationResult
now confirms assignments for holdouts.- Gracefully handles unknown local notification types if new ones are added in the future.
- SW-2761: Fixes issue where "other" responses in paywall surveys weren't showing in the dashboard.
- Prevents a paywall from opening in a separate activity inside a task manager when using
taskAffinity
within your app.
- Fixes serialization of
feature_gating
inSuperwallEvents
. - Changes the product loading so that if preloading is enabled, it makes one API request to get all
products available in paywalls. This results in fewer API requests. Also, it adds retry logic on failure.
If billing isn't available on device, the
onError
handler will be called.
- Changes the import path for the
LogScope
, andLogLevel
.
- Fixes rare thread-safety crash when sending events back to Superwall's servers.
- Calls the
onError
presentation handler block when there's no activity to present a paywall on. - Fixes issue where the wrong product may be presented to purchase if a free trial had already been used and you were letting Superwall handle purchases.
- Fixes
IllegalStateException
on Samsung devices when letting Superwall handle purchases. - Keeps the text zoom of paywalls to 100% rather than respecting the accessibility settings text zoom, which caused unexpected UI issues.
- Fixes rare
UninitializedPropertyAccessException
crash caused by a threading issue. - Fixes crash when the user has disabled the Android System WebView.
- Fixes issue where the
paywallProductsLoad_fail
event wasn't correctly being logged. This is a "soft fail", meaning that even though it gets logged, your paywall will still show. The error message with the event has been updated to include all product subscription IDs that are failing to be retrieved.
- Fixes rare issue where paywall preloading was preventing paywalls from showing.
- Adds
handleLog
to theSuperwallDelegate
.
- Makes sure client apps use our proguard file.
- Removes need for
SCHEDULED_EXACT_ALARM
permission in manifest.
- Fixes issue presenting paywalls to users who had their device language set to Russian, Polish or Czech.
- Adds missing
presentationSourceType
toPaywallInfo
. - Fixes issue where the status bar color was always dark regardless of paywall color.
- Adds
TypeToken
to proguard rules to prevent r8 from 'optimizing' our code and causing a crash.
- SW-2682: Adds
Superwall.instance.latestPaywallInfo
, which you can use to get thePaywallInfo
of the most recently presented view controller. - SW-2683: Adds
Superwall.instance.isLoggedIn
, which you can use to check if the user is logged in.
- Removes use of
USE_EXACT_ALARM
permission that was getting apps rejected. - Fixes issue with scheduling notifications. The paywall wasn't waiting to schedule notifications before dismissal so the permissions wasn't always showing.
- SW-2684: Adds error logging if the
currentActivity
isnull
when trying to present a paywall.
- Fixes bug where paywalls might not present on first app install.
- Fixes bug where all
paywallResponseLoad_
events were being counted aspaywallResponseLoad_start
. - Adds ProGuard rule to prevent
DefaultLifecycleObserver
from being removed.
- Adds
X-Subscription-Status
header to all requests. - Caches the last
subscriptionStatus
. - Adds
subscriptionStatus_didChange
event that is fired whenever the subscription status changes. - Calls the delegate method
subscriptionStatusDidChange
whenever the subscription status changes. - SW-2676: Adds a completion block to the
configure
method.
- Fixes issue where the main thread was blocked when accessing some properties internally.
- SW-2679: Fixes issue where the
subscription_start
event was being fired even if a non-recurring product was purchased.
- Fixes issue where
transaction_complete
events were being rejected by the server.
- Changes
Superwall.instance.getUserAttributes()
toSuperwall.instance.userAttributes
. SuperwallOptions.logging.logLevel
is now non-optional. Set it toLogLevel.none
to prevent logs from being printed to the console.
- SW-2663: Adds
preloadAllPaywalls()
andpreloadPaywalls(eventNames:)
to be able to manually preload paywalls. - SW-2665: Adds
Superwall.instance.userId
so you can access the current user's id. - SW-2668: Adds
preferredLocale
andpreferredLanguageLocale
to the device attributes for use in rules. - Adds
Superwall.instance.logLevel
as a convenience variable to set and get the log level.
- SW-2664: Fixes race condition between resetting and presenting paywalls.
- Fixes issue where a user would be asked to enable notifications even if there weren't any attached to the paywall.
- SW-2214: Adds ability to use free trial notifications with a paywall.
- Adds
cancelAllScheduledNotifications()
to cancel any scheduled free trial notifications. - SW-2640: Adds
computedPropertyRequests
toPaywallInfo
. - SW-2641: Makes
closeReason
inPaywallInfo
non-optional.
- Fixes issue where thrown exceptions weren't always being caught.
- SW-2638: Adds
Restored
toPurchaseResult
. - SW-2644: Adds
RestoreType
toSuperwallEvent.TransactionRestore
. - SW-2643: Makes
storePayment
non-optional for aStoreTransaction
. - SW-2642: Adds
productIdentifier
toStorePayment
.
- SW-2635: Fixes crash that sometimes occurred if an app was trying to get Superwall's paywall configuration in the background.
- SW-2154: The SDK now includes a paywall debugger, meaning you can scan the QR code of any paywall in the editor to preview it on device. You can change its localization, view product attributes, and view the paywall with or without a trial.
- More bug fixes relating to the loading of products.
- SW-2631: Fixes issue where paywalls weren't showing if the products within them had a base plan or offer ID set.
- SW-2615: Fixes crash on Android versions <8 when accessing the Android 8+ only class Period.
- SW-2616: Fixes crash where the
PaywallViewController
was sometimes being added to a new parent view before being removed from it's existing parent view.
- #SW-2218: Changes the
PurchaseController
purchase function topurchase(activity:productDetails:basePlanId:offerId:)
. This adds support for purchasing offers and base plans.
- #SW-2600: Backport device attributes
- Adds support for localized paywalls.
- Paywalls are only preloaded if their associated rules can match.
- Adds status bar to full screen paywalls.
- Fixes issue where holdouts were still matching even if the limit set for their corresponding rules were exceeded.
- #SW-2584: Fixes issue where prices with non-terminating decimals were causing products to fail to load.
- Additional fixes to make Google billing more robust.
- Fixes an issue that causes
transaction_complete
events to fail.
- Fixes an issue that could cause "n/a" to be displayed on a paywall in place of the proper subscription period string.
- Fixes an issue where calling
identify
right afterconfigure
would hang b/c network requests need to access the user id to add to headers. - Fixes a potential crash when loading data from disk
- Fixes threading issue
- Changes Activity to AppCompatActivity
- Fixes
app_open
race condition - Prevents calling purchase twice
- Disables interactivity during purchase
- Fixes
app_launch
event not triggering
- Adds the ability to provide an
ActivityProvider
when configuring the SDK. This is an interface containing the functiongetCurrentActivity()
, which Superwall will use to present paywalls from. You would typically conform anActivityLifecycleTracker
to this interface.
- Fixes a crash when storing a
List
to user attributes and if that List or a Map had a null value.
- Adds automatic purchase controller
- Improves memory handling for webviews
- Hides the loading indicator on a paywall if transactionBackgroundView is set to NONE
- Adds
trigger_session_id
to Superwall Events. - Resets the scroll position of the paywall on close.
- Fixes issue where an invalid currency code on a device would crash the app when trying to retrieve products.
- Fixes concurrency issues when setting and retrieving values like the appUserId and seed.
- Can now use both non-recurring products and subscription products in paywalls.
- Fixes a crash issue that was caused by a lazy variable being accessed before it was initialized.