Repository navigation
Bump Android SDK to 2.10.0, iOS SDK to 4.19.1, release 0.4.1 - #22
Merged
Merged
Conversation
SuperwallKit presents a paywall in a window of its own, whose root allowed every orientation, so Screen.autorotateTo* was never consulted while a paywall was up. superwall/Superwall-iOS#568 makes that window follow the app's own view controller. Require 4.19.1, the first release it can ship in, so games get the fix without pinning it themselves. Podfiles kept by an Append build are moved off any requirement an earlier version of this package wrote, not just `~> 4.0`. Those are listed by their version part only, so native-sdk-bump.yml's rewrite of the current pod line leaves them alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CR7gAmtFzGVaH1B6Mxxrga
Contributor
Author
|
The integration agent failed (run). This PR only contains the version bump — check the release notes above for public API changes by hand before merging. |
Require the SuperwallKit that keeps paywalls to the game's orientations
…ase 0.4.1 The iOS harness now builds against exactly SuperwallKit 4.19.1, matching the Podfile's >= 4.19.1 requirement. superwall-android 2.10.0 deprecates LogScope.storeKitManager in favour of LogScope.billing, so the bridge maps to the new scope.
Collaborator
|
Added on top of the bot bump (the integration agent failed, so I went through the 2.8.7 → 2.10.0 notes by hand):
|
SuperwallKit 4.18 raised its deployment target to iOS 15, so a game targeting a lower version failed pod install. The Podfile now uses at least iOS 15 and the build warns. EventType gains the teleport and customer center events the native SDKs now send.
…ative-sdk/android-2.10.0 # Conflicts: # CHANGELOG.md # Plugins/Android/SuperwallSDK.androidlib/build.gradle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps the Android SDK from
2.8.7to2.10.0. The package version is unchanged; the note is under[Unreleased].Opened automatically by
native-sdk-bump.ymlafter superwall/Superwall-Android 2.10.0 was released. An agent then checks the release notes below for public API changes and pushes any integration work onto this PR.Android release notes (2.8.7 → 2.10.0)
2.10.0
Breaking changes
internal, becauseSuperwall.configurebuilds them:AutomaticPurchaseController,TransactionManager,StoreManager,DeviceHelper,IdentityManager,LocalStorage,AppSessionManager,PaywallRequestManager,DeepLinkRouter,DebugManager,DebugView,TestModeandSWWebView. The public overload ofSurveyManager.presentSurveyIfAvailableis removed, andApiFactory.trackno longer has a default body. None of these were documented API; configure the SDK withSuperwall.configureand useSuperwall.instance.Enhancements
LogScope.billingfor the SDK's Google Play Billing logs.LogScope.storeKitManageris deprecated; setting it inSuperwallOptions.logging.scopesstill enables the billing logs.Fixes
purchasemessage had no product identifier and the SDK dropped it. Custom products are now sent to the paywall with their product identifier, and apurchasemessage without an identifier is resolved from the product's name on the paywall. A paywall message the SDK can't parse no longer drops the other messages sent with it.StoreProduct.isCustomProduct) not reaching the app until its next launch. After a successful custom purchase the SDK now asks Superwall for the user's entitlements in the background, as it already does after a Google Play purchase, so the entitlements your server reported for the purchase are picked up. It doesn't delay the purchase result or the paywall's dismissal. A background entitlements request whose user changed while it was in flight, afteridentifyorreset, is now discarded instead of being applied to the new user.StoreProduct.isCustomProduct) reportingstore: "PLAY_STORE". They now reportCUSTOM, so analytics no longer count purchases made through your own checkout as Google Play revenue.register()failing with "Paywall Already Presented", after the paywall activity was finished while it was in the background. This happened when the app's task was cleared while the paywall was stopped, for example by opening asingleTaskroot activity from a deep link or notification. The paywall is now dismissed when its activity is finished in the background, and the handler getsonDismiss.Error Evaluating JSerror log, withjava.lang.Exception: null, after every message the SDK posts to a paywall, such as a custom callback's result. Android reports a script's return value, and these scripts return nothing, so the log appeared even when the message was delivered. It is no longer logged in that case.SuperwallOptions.shouldObservePurchasesis on and only one purchase is in progress. A completed purchase now trackstransaction_completeand refreshes the receipt, and a cancelled one trackstransaction_abandon; before, both were dropped with an error log. Observer-mode charts can show more transactions after this release.SuperwallOptions.shouldObservePurchasesis on and Play reported a cancelled or failed purchase while no purchase was being observed. The purchase listener crashed on it; such results are now ignored.PaywallComposable. Notifications were only scheduled when the paywall was shown in aSuperwallPaywallActivityor in-window; the SDK now asks the embedding Activity for the notification permission and schedules them there.requestAnimationFrame) kept running unseen on the renderer thread every webview in the app shares, slowing the paywall on screen and the host app. A paywall is now paused once it has loaded while off screen, and resumed when it is presented.CustomerInfoand entitlements naming the first configured base plan, with an expiry based on that plan's period, when a Google Play subscription has several base plans. The SDK now saves the product that was bought against its purchase token. When it can't know the plan, such as after a reinstall or for a purchase made before this fix,productIdandlatestProductIdare the Play subscription ID and the expiry dates arenull. Those users keep their access, and a plan that was recorded now also decides which entitlements the purchase unlocks.Deprecations
LogScope.storeKitManagerin favour ofLogScope.billing. Billing logs are now reported with the scopebilling, so aSuperwallDelegate.handleLogimplementation that matches the scope string"storeKitManager"should match"billing"instead.com.superwall.sdk.billing.StoreProductType,StoreKit,StoreKitManagerInterface,ProductPurchaser,TransactionRestorer,PurchasingandTransactionVerifierFactory. They will be removed in a future release.GetProductsResponseis unchanged.2.9.0
Enhancements
attribution_matchevent. The resultingacquisition_*attributes are added to user attributes, so they can be used as breakdowns and filters in charts and audiences, and they carry over to new users afteridentifyorreset. The match runs once per install, within 7 days of install, only when the dashboard has turned it on for the app, and never blocks startup. It uses the Play install referrer's click id when present. It is skipped whileeventTrackingBehaviorisNONEand runs if tracking is turned back on. On the first launch, a paywall whose audiences useacquisition_*attributes waits up to 2 seconds for a match that's still running.SuperwallOptions.adConsentandSuperwall.instance.adConsentfor reporting the user's ad measurement consent (AdConsent.Custom(adUserData, adPersonalization), each anAdConsentStatusofGrantedorDenied). It is sent as theadUserDataConsentandadPersonalizationConsentdevice attributes and forwarded with the conversions Superwall uploads to Google Ads and Meta. WhileadConsentisAdConsent.Unspecified, the default, the SDK uses the consent stored by an IAB TCF consent banner when GDPR applies, and otherwise defaults to granted; apps with users in the EEA, UK or Switzerland that don't use a TCF banner should set it from their consent flow. Where the values came from is reported in the newadConsentSourcedevice attribute (developer,tcfordefault). Both are reported as denied wheneventTrackingBehaviorisNONE.SubscriptionUpdateParams. Users without such a subscription make a normal purchase.PurchaseController.purchase(activity, product, basePlanId, offerId, replacement). ItsProductReplacementcarries the mode and the old product's ID and purchase token, so a customPurchaseControllercan perform the replacement. The default implementation ignores it and calls the existingpurchasemethod.Superwall.instance.setPushToken(token)to register the device's Firebase Cloud Messaging token with Superwall, so Superwall can send it push notifications. Call it from yourFirebaseMessagingService.onNewTokenand withFirebaseMessaging.getInstance().tokenat startup, afterSuperwall.configure:Superwall.instancethrows before it, so ifonNewTokencan run before your app configures Superwall, keep the token and pass it in once you have. It's safe to call on every launch: an unchanged token is only sent again once a day. The SDK has no Firebase dependency and doesn't request notification permission itself. Along with the token, Superwall receives whether the app can post notifications, which is checked again whenever the app comes to the foreground. The token only travels to Superwall's servers: it doesn't appear inSuperwallDelegate.handleSuperwallEvent,SuperwallDelegate.handleLog, user attributes or audience filters. Nothing is sent until Superwall notifications are turned on for your app, and nothing is sent whileeventTrackingBehaviorisNONE.Superwall.instance.optOutOfNotifications()andoptInToNotifications()to stop and resume Superwall push notifications for the device. The choice is remembered across launches,reset()andidentify(userId).Superwall.instance.handleNotificationOpen(intent)andhandleNotificationOpen(data)to measure opens of the notifications Superwall sends. Call them only when the user taps a notification, never fromonMessageReceivedfor a delivery, which would count deliveries as opens. Pass the intent that opened your activity from the tap, or the tapped notification's data map; notifications Superwall didn't send are ignored. The intent works as is for notifications FCM displays itself, whose tap intent carries the data keys as extras; if your app builds the notification inonMessageReceived, copy theswdata value into the extras of the tapPendingIntent.Fixes
/eventsrequest logging every queued event's parameters toSuperwallDelegate.handleLog. It now logs the event count and names only. A cache entry that can't be decoded no longer logs its stored contents either.PresentationHost.IN_WINDOW. The in-window host padded the paywall for the cutout as well as the system bars; it now pads for the system bars only, asSuperwallPaywallActivitydoes, and the paywall clears the cutout with its CSS safe-area insets.transaction_completewas only sent to the paywall for subscriptions.getProducts()(and other network-backed suspend APIs) not being main-safe: network requests now always run onDispatchers.IO, so the/productsfallback no longer fails withNetworkOnMainThreadExceptionwhen called from the main thread.reset()and switching users deleting every top-level file in the host app's cache directory. Reset now only clears Superwall's own user-scoped storage.reset()oridentify()with a different user. The cached config and enrichment are kept.AtomicFile, and the in-memory cache is thread-safe.EXPIREDlatestSubscriptionStateand a wrong expiry date (the first period's end) after their first renewal. Google Play doesn't give the client an expiry date, grace period or account hold, so the device no longer guesses them: a purchased subscription isSUBSCRIBED, and a pending purchase is no longer reported as revoked or in a grace period.Superwall.instance.observe.latestSubscriptionStateis no longer set toEXPIRED. Play subscribers stay active through a failed read for up to one subscription period after Play last confirmed their purchase.reset()or switching users, the new user's purchase history and device customer info are rebuilt from Google Play straight away instead of staying empty until the next purchase or restore.PurchaseControlleris set, which processed every purchase twice.AutomaticPurchaseControllernow uses the SDK's single billing connection.Application.onCreate. The paywall activity now closes.PaywallComposablenot loading a new paywall when itsplacementchanges, and crashing when it isn't hosted in anActivity.PaywallComposable's default error are now localized. Text you set onPaywallOptions.restoreFailedis shown as is.Deprecations
PaywallOptions.useCachedTemplates. It has no effect: on-device caching is configured per paywall in the Superwall dashboard. It will be removed in the next major version.Breaking changes
AutomaticPurchaseController's constructor now takes the SDK'sBillinginstead of aContextand a billing client factory. Apps that don't construct it themselves are unaffected.2.8.8
Enhancements
AIRBRIDGE_IDas anAttributionProvider(airbridgeId), for the Airbridge Device ID fromAirbridge.fetchDeviceUUID.