-
Notifications
You must be signed in to change notification settings - Fork 60
4.17.0 #525
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
4.17.0 #525
Changes from all commits
Commits
Show all changes
185 commits
Select commit
Hold shift + click to select a range
81e6377
Fix build on Xcode 26.0.1: disambiguate fontScale arithmetic
jakemor 7a81787
Keep subscribers active through empty StoreKit reads and empty web polls
jakemor 606f7a7
Scope the anti-downgrade guard by device-read authority
jakemor 0ae3358
Protect nil-store entitlements and stamp .appStore on SK1 entitlements
jakemor d53fef6
Merge remote-tracking branch 'origin/develop' into fix/subscription-s…
yusuftor 81f3ea6
Hold the guard through entitlement-mapping failures
yusuftor 6e70dcf
Stamp .appStore only on SK1 entitlements a transaction unlocks
yusuftor 699a8d2
Reword changelog entries to match the scoped guard
yusuftor 9d1ef98
Document the uncorrected isActive signal and the web revocation tradeoff
yusuftor 287a399
Correct the revocation wording: empty responses are artifacts
yusuftor d1ca3fa
Restore the test scheme to develop's parallel default
yusuftor c1fe74e
Bump to 4.16.4 and ban Unreleased changelog headings
yusuftor 47a5ba1
Update CHANGELOG.md
yusuftor 3204994
Update CHANGELOG.md
yusuftor 82ff1ee
Restore the App Store changelog entry with its precondition
yusuftor 0f2cae7
Merge pull request #506 from superwall/fix/subscription-status-anti-d…
yusuftor 93ede39
chore(github): require an affected-user link and setup details in bug…
yusuftor ebc7611
chore(github): warn against posting identifying user IDs in the affec…
yusuftor e1eeafe
chore(github): apply review suggestions to the bug report form
yusuftor 6519c3c
feat: add dev mode for previewing local paywalls
chroxify 411239d
Merge pull request #510 from superwall/chore/bug-report-issue-form
yusuftor b042bb7
fix(configure): stop the container escaping to the redeemer mid-init
yusuftor ead8520
review: kick off the cold-launch poll from Superwall's configure init
yusuftor 15647e1
Merge pull request #512 from superwall/fix/dependency-container-init-…
yusuftor 4f1779f
Merge remote-tracking branch 'origin/develop' into christo/sw-framewo…
yusuftor 48b6b35
chore: fold dev mode changelog entry into staged 4.16.4 section
yusuftor 5d8c076
chore: restage 4.16.4 release as 4.17.0
yusuftor 154f0a2
review: gate dev links out of production and unfreeze the dev-mode cache
yusuftor 75da4e8
review: pin dev-server mount URLs to the manifest's origin
yusuftor 4a032b8
review: log when a dev server surface is rejected as off-origin
yusuftor d1f5e0d
chore(examples): scope Advanced app ATS to web content and local netw…
yusuftor 254d6de
chore: split DevServerManifest.swift into one file per type
yusuftor 3482bf2
style: invert the paywall picker's open guard into a positive early r…
yusuftor 0d7ce5e
style: split the paywall picker gate into a three-branch predicate
yusuftor 362950d
style: state the picker gate positively with guard
yusuftor 11cd922
style: group the ATS warning flag with the locator's other state
yusuftor 6fed06c
style: split the ATS warning gate into single-condition checks
yusuftor c22e098
style: split the dev link parse into single-condition guards
yusuftor cf2020c
docs: drop the superwall.lock binding detail from the dev mode change…
yusuftor e751849
review: drop the debugger's product-variables timeout
yusuftor 6240aa2
style: positive-if and multiline-guard formatting in dev mode gates
yusuftor b61b66e
feat!: replace devMode and devServerURL with SuperwallOptions.devServer
yusuftor ae9e819
chore: retrigger CI after a stuck Pullfrog run
yusuftor d6f8f63
fix(debugger): make Preview work for unpushed dev-server surfaces
yusuftor ee963aa
feat(dev): serve matching local surfaces wholesale instead of patchin…
yusuftor 75c29ba
feat(dev): mark locally served paywalls and honour their presentation…
yusuftor 7e87a07
fix(events): dedupe subscription status changes by logical state
yusuftor a0a81c0
review: gate the cache save, document logical-change semantics, add b…
yusuftor 29146b4
review: mirror logical-change docs onto the ObjC delegate
yusuftor 5f22a4e
Merge pull request #515 from superwall/fix/subscription-status-logica…
yusuftor 5210fac
feat(entitlements): add grantedEntitlements merged into subscription …
yusuftor 84e9453
review: harden granted merge, resolution locking, and cached-status r…
yusuftor 800b5c3
review: lock the status store itself, not just resolution
yusuftor 9235459
review: snapshot granted once per resolution, add base-race regressio…
yusuftor de887fa
review: strengthen the base-race test's assertions
yusuftor 430e284
refactor: make granted a first-class source in every customer info merge
yusuftor 913ff2c
review: keep LogScope raw values stable, cover the external-controlle…
yusuftor 730c9ba
refactor: move status publishing into its own file, rename resolved/u…
yusuftor 9621c63
review: have publishSubscriptionStatus take its own lock, pass the gr…
yusuftor 9697d8a
review: snapshot granted entitlements inside the publish lock
yusuftor 6b95ed5
review: fix the 15 findings from the max-effort review
yusuftor 8fcb871
review: rebuild external customer info from a consistent snapshot, st…
yusuftor 7e6c817
review: bound the customer info retry, cover the external-controller …
yusuftor 78eca5d
docs: plainer wording in the granted entitlement ids comment
yusuftor 782ed3e
refactor: name what prompted a status publish instead of nil + a flag
yusuftor f7b54b4
chore: stop swiftlint crawling nested git worktrees
yusuftor a78034c
refactor: drop a stale customer info build instead of rebuilding it
yusuftor 1949e21
fix: granted entitlements no longer decide an unknown subscription st…
yusuftor d620a7b
docs: say which thread subscribers run on instead of 'don't block'
yusuftor 6b53761
docs: trim the changelog to what changed since the last release
yusuftor ad1da70
Merge pull request #516 from superwall/feat/sw-5794-granted-entitlements
yusuftor 79e8ed2
Merge remote-tracking branch 'origin/develop' into christo/sw-framewo…
yusuftor 7689d10
refactor(debugger): hold published paywalls as PaywallSummary
yusuftor eedda06
review: keep gating real, contain manifest decode failures, share the…
yusuftor 5181d83
review: inherit dashboard-owned behaviour, keep the manifest identifi…
yusuftor 8dee668
fix(dev): let the local paywall keep owning its notifications
yusuftor 0027657
fix(dev): inherit what the manifest can't carry, honour multi-paywall…
yusuftor bff8c79
refactor(dev): read paywall settings from the published paywall only
yusuftor 694331b
fix(dev): take identity from the paywall a surface stands in for
yusuftor a280567
docs(dev): stop promising config.ts presentation reaches dev mode
yusuftor e518f87
docs(dev): name local notifications as the exception to inheritance
yusuftor 1af8f0a
docs(dev): make the on-device cache exception explicit
yusuftor 8a29ef0
fix: send unknown entitlement details as null, not as missing
yusuftor 1647e0e
test: cover the string-valued fields and tidy the filter helper
yusuftor 9539a22
refactor: null the unknown fields only for audience filters
yusuftor f60d255
test: pin the one call site that turns the null encoding on
yusuftor 193dc25
Update CHANGELOG.md
yusuftor 1b24185
Merge pull request #517 from superwall/fix/entitlement-unknown-fields
yusuftor 1e97fc2
feat(dev): present a local paywall the way its config.ts says
chroxify 7ba938d
feat(dev): let config.ts pick intro offer eligibility
yusuftor a7e0db7
fix(dev): rebuild the paywall when config.ts settings change
yusuftor bfa0d23
docs(dev): name intro offer eligibility as config.ts's
yusuftor cb48599
Fix crash when register is called from more than one thread
yusuftor 3dd3685
Serialize the task swap on a queue instead of a lock
yusuftor 519c7cd
Hand operations to one task through a stream
yusuftor 9ad7439
Address review: comment wording, last racy swap, test-only surface
yusuftor af2d496
Run operations at the enqueuer's priority, and restore Sendable
yusuftor 4ffdb41
Guard the priority test, and correct a comment
yusuftor a414575
fix: refresh and sync integration device attributes
Makisuo 29239d5
Skip the purchased-product fetch on StoreKit 2 at cold launch
yusuftor eb96e0d
Log failed purchased-product fetches and fix a stale doc comment
yusuftor 86ebffd
Drop the load timing logs
yusuftor b1b7b53
Merge pull request #522 from superwall/fix/skip-purchased-product-fet…
yusuftor e7941b2
Publish config from the saved entitlements before the StoreKit read
yusuftor 18875a3
Restore each saved item on its own expiry, and take the fast path wit…
yusuftor 3953a56
Seed device purchases only, admit lifetime purchases, and pin the exp…
yusuftor 4176c14
Test the fast path for a web-only subscriber
yusuftor 0ac31c4
Take the fast path for developer-granted entitlements
yusuftor a5dac2f
Seed consumables inactive and scope the fast path to StoreKit 2
yusuftor 9ece061
Say the early publish applies to StoreKit 2 in the changelog
yusuftor 6ff9697
Update CHANGELOG.md
yusuftor 1fab1de
Wait for the purchases load only where the answer depends on it
yusuftor 7a92811
Carry grants into the restore, and don't restore an undated subscription
yusuftor 5b16335
Merge grants in the caller, and match the read's merge rules
yusuftor 991eebc
Address the review on the device-attribute refresh
yusuftor bfb8793
Restore the whole integration state after a reset
yusuftor 965e848
Merge pull request #520 from superwall/fix/register-task-race
yusuftor 03d47bd
Deactivate lapsed saved rows before merging grants in
yusuftor 922b1d7
Keep only the install-scoped attributes across a reset
yusuftor 82e160c
Keep the eligible-override intro check on post-read data
yusuftor b6cab4c
Close the two ways a person-scoped id could still survive a reset
yusuftor 26dc72f
Derive the integration attribute cases from CaseIterable
yusuftor 7b1741e
Drop the scope assertion the exhaustive switch already guarantees
yusuftor 2124140
Wait for the read in the entitlement-history check too
yusuftor 6eb2c24
Wait for the read in the custom-product trial check too
yusuftor 3bb6ef4
Skip the purchases wait when no App Store product is involved
yusuftor f9c3590
Say what actually decides whether the load can move an entitlement
yusuftor 153dba7
Only treat a grant as in reach for apps with a purchase controller
yusuftor 8f067a7
Drop the granted short-circuit, which named the wrong refresh
yusuftor bfbfde2
Update CHANGELOG.md
yusuftor 7ad336f
Merge pull request #523 from superwall/fix/publish-config-from-saved-…
yusuftor 703e3ce
Merge develop into codex/appsflyer-device-context
yusuftor bf25d0d
Call them device identifiers, and repair them when an app overwrites …
yusuftor 95e2eaf
Lock status reads, emit in store order, and publish corrected state d…
yusuftor 1f44b3d
Judge an overwrite by the value, not just the key
yusuftor c9b7f32
Match the ATT status on what it says, not how it's boxed
yusuftor 7deda32
Don't let a boolean pass for an ATT status
yusuftor c6fd4f3
Leave the saved customer info alone under an external purchase contro…
yusuftor 84bd145
Merge pull request #521 from superwall/codex/appsflyer-device-context
yusuftor 5209ccb
Pin the external-controller guard on the restore with a test
yusuftor c30012a
Merge remote-tracking branch 'origin/develop' into fix/subscription-s…
yusuftor fb5be35
Correct lapsed rows under a purchase controller without touching its …
yusuftor 4a0e8ee
Leave the customer info alone under a purchase controller after all
yusuftor 7738da3
Merge pull request #526 from superwall/fix/subscription-status-review…
yusuftor c29fdce
Stop identify() hanging after an install match, and answer paywall ov…
yusuftor d568e98
Assert only what other suites can't disturb in the user-switch test
yusuftor 387c6a1
Drop the overwrite check on the paywall attribute path
yusuftor b56231b
Say on reset(duringIdentify:) which queue it runs on, and check the r…
yusuftor 5647609
Merge pull request #527 from superwall/fix/identify-switch-hang
yusuftor 0919782
Keep a paywall's experiment with the request that presented it
yusuftor d714e83
Drop the redundant claim log and fix the present operator's doc comment
yusuftor 208e046
Keep a getPaywall claim made while the paywall is on screen, and don'…
yusuftor da4041f
Only restore a handed-out claim on an appearance that starts a presen…
yusuftor b1c7a81
Tie the stored publisher check to this test's own presentation
yusuftor 5632083
Merge pull request #528 from superwall/fix/shared-paywall-attribution
yusuftor 94fb59d
Update CHANGELOG.md
yusuftor 059a2aa
Show the paywall version a claim resolved, not just its products
yusuftor f88573e
Install a claim's delegate before reloading, and load once on restore
yusuftor 2e841b5
Update CHANGELOG.md
yusuftor 7424c1f
Merge pull request #529 from superwall/fix/claim-brings-paywall-version
yusuftor 8d3fe5c
Surface the web funnel's user attributes on a redeemed code
yusuftor 5946a33
Keep the old Objective-C initialiser and document blank answers
yusuftor 5d0d919
Pin the blank answer in the round trip test
yusuftor 630dd61
Only send freeTrial_start to the paywall when a trial started
ianrumac 6d04a83
Merge pull request #530 from superwall/feat/redemption-user-attributes
yusuftor a6b5c06
Keep the mock alive for the whole of the new message handler tests
yusuftor 62f7f4f
Merge pull request #531 from superwall/ir/fix/gate-free-trial-start-m…
yusuftor e96b181
Merge remote-tracking branch 'origin/develop' into christo/sw-framewo…
yusuftor aecdd16
Update CHANGELOG.md
yusuftor aa55087
Merge pull request #511 from superwall/christo/sw-framework-support
yusuftor 8ffa7e2
Update CHANGELOG.md
yusuftor 2941322
Scope the dev server lookup to the address it was asked for
yusuftor c1ae976
Address review feedback on the dev server and shared paywall controller
yusuftor e7f2760
Hold the dev server lookup to the server it set out to find
yusuftor 1a4c22e
Let the early publish test wait for the purchases load to start
yusuftor 6e75fa7
Hold only the entitlements a device read has no authority over
yusuftor 4f2139a
Refresh the dev server manifest before previewing or presenting a loc…
yusuftor dcc2e9e
Send configState from processConfig instead of from its callers
yusuftor d63ddd5
Keep entitlements a device read has no authority over, whether or not…
yusuftor d873648
Drop a selected dev surface the refreshed manifest no longer lists
yusuftor 62e294a
Pin the intro offer eligibility key in the manifest fixture
yusuftor dbaebd5
Update changelog, remove redundant code
yusuftor 0014fae
Drop an entitlement past its own expiry even when the device read sai…
yusuftor d4055e6
Resolve the debugger's selected surface the way Present does
yusuftor 9835f8b
Say which stores the expiry prune actually settles
yusuftor File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,131 @@ | ||
| name: 🐛 Bug report | ||
| description: Report a bug in SuperwallKit. The more you give us up front, the faster we can find the cause. | ||
| title: "[BUG] " | ||
| labels: ["bug"] | ||
| body: | ||
| - type: checkboxes | ||
| id: checklist | ||
| attributes: | ||
| label: New issue checklist | ||
| options: | ||
| - label: I have read the [documentation](https://superwall.com/docs) and this doesn't appear to be expected behavior | ||
| required: true | ||
| - label: I have searched [existing issues](https://github.com/superwall/Superwall-iOS/issues) and this is not a duplicate | ||
| required: true | ||
| - label: I have tried to reproduce the issue in a minimal sample project I can share | ||
| required: false | ||
| - type: input | ||
| id: affected-user | ||
| attributes: | ||
| label: Affected user | ||
| description: > | ||
| A link to a user who hit the bug lets us check their event logs, which is often the | ||
| fastest route to a diagnosis. In the | ||
| [dashboard](https://superwall.com/select-application?pathname=/applications/:app/users/v2), | ||
| open **Users**, search for the app user ID you pass to `Superwall.shared.identify(userId:)` | ||
| (or the `$SuperwallAlias:...` ID from `Superwall.shared.userId` if you don't identify users), | ||
| open the user, and paste the page URL. The link only opens for your own team and us, | ||
| but issues are public and the URL contains the user ID itself — so if your app user IDs | ||
| are personally identifying (e.g. an email address), paste the user's `$SuperwallAlias:...` | ||
| URL instead (shown on their user page), or share the link privately via the support chat | ||
| in the dashboard and mention this issue. If the bug isn't tied to a user (e.g. a build | ||
| error), write "N/A". | ||
| placeholder: https://superwall.com/applications/<appId>/users/v2/<userId> | ||
| validations: | ||
| required: true | ||
| - type: input | ||
| id: occurred-at | ||
| attributes: | ||
| label: When did it happen? | ||
| description: Approximate date and time the bug occurred, including timezone. Helps us correlate server-side logs. | ||
| placeholder: e.g. 2026-08-15 14:30 UTC | ||
| - type: input | ||
| id: sdk-version | ||
| attributes: | ||
| label: SuperwallKit version | ||
| placeholder: e.g. 4.16.3 | ||
| validations: | ||
| required: true | ||
| - type: input | ||
| id: previous-sdk-version | ||
| attributes: | ||
| label: Last SDK version that worked | ||
| description: If the bug appeared after updating the SDK, which version were you on before? | ||
| placeholder: e.g. 4.15.4 | ||
| - type: input | ||
| id: ios-version | ||
| attributes: | ||
| label: iOS version(s) | ||
| placeholder: e.g. iOS 26.5 | ||
| validations: | ||
| required: true | ||
| - type: input | ||
| id: xcode-version | ||
| attributes: | ||
| label: Xcode version | ||
| placeholder: e.g. 26.1 | ||
| validations: | ||
| required: true | ||
| - type: dropdown | ||
| id: installation | ||
| attributes: | ||
| label: Installation method | ||
| options: | ||
| - Swift Package Manager | ||
| - CocoaPods | ||
| - Other | ||
| validations: | ||
| required: true | ||
| - type: input | ||
| id: devices | ||
| attributes: | ||
| label: Devices/simulators affected | ||
| placeholder: e.g. iPhone 17 Pro, all simulators | ||
| - type: dropdown | ||
| id: repro-example | ||
| attributes: | ||
| label: Reproducible in the example app? | ||
| options: | ||
| - "Yes" | ||
| - "No" | ||
| - Haven't tried | ||
| validations: | ||
| required: true | ||
| - type: textarea | ||
| id: sdk-setup | ||
| attributes: | ||
| label: How is the SDK set up? | ||
| description: | | ||
| Briefly describe your integration — it changes which code paths run: | ||
| - Are you using a `PurchaseController` (e.g. with RevenueCat)? If so, where do you set `Superwall.shared.subscriptionStatus`? | ||
| - How do you present paywalls (`register(placement:)`, `PaywallView`, `getPaywall`)? | ||
| - Do you call `Superwall.shared.identify(userId:)`? | ||
| validations: | ||
| required: true | ||
| - type: textarea | ||
| id: description | ||
| attributes: | ||
| label: Describe the bug | ||
| description: A clear and concise description of the bug, including expected vs. actual behavior. Screenshots and screen recordings help a lot. | ||
| validations: | ||
| required: true | ||
| - type: textarea | ||
| id: steps | ||
| attributes: | ||
| label: Steps to reproduce | ||
| placeholder: | | ||
| 1. ... | ||
| 2. ... | ||
| validations: | ||
| required: true | ||
| - type: textarea | ||
| id: logs | ||
| attributes: | ||
| label: Debug logs | ||
| description: Set `options.logging.level = .debug` in `SuperwallOptions` before configuring the SDK, reproduce the bug, and paste the console output covering when it happened. Automatically formatted as code. Please redact anything personal — logs can contain user attributes you've set. | ||
| render: shell | ||
| - type: textarea | ||
| id: other | ||
| attributes: | ||
| label: Other information | ||
| description: Stack traces, crash reports, related issues, links, or anything else that gives context. |
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
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
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
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.