chore: raise the deployment target to iOS 18 - #15
Open
romchornyi wants to merge 6 commits into
Open
Conversation
dashwallet-ios, the only consumer, has been iOS 18 for a while: its Podfile says `platform :ios, '18.0'` and every shipping build configuration of the `dashwallet` and `dashpay` targets — the two that link this package — is 18.0. Nothing has needed the iOS 14 floor for some time, and holding it costs a fallback path in every component that wants an API newer than 2020. macOS is declared alongside it at 15. The package never declared a macOS platform at all, so a macOS build fell back to the SwiftPM default and every type had to carry `@available(macOS 11)` by hand to compile there. Saying it once in the manifest replaces all of that. The `Hard constraint` section in CLAUDE.md is replaced by the new rule: do not annotate for anything at or below the floor, and gate only what is genuinely newer — as `selfSizingSheet` still does for iOS 26 corner styling. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every branch here existed to keep a component running below the old floor, and each one was a second implementation that nobody could see fail: - `SearchBar` dispatched between a focus-driven bar and `SearchBarLegacy`, a whole second bar without the cancel animation. The legacy one is gone and the shell renders the focused bar directly. - `SearchBar` and `AddressFieldView` each carried a pre-iOS 17 `TextField` without a styled prompt — and, in the address field, without the vertical axis that gives it its two-line read-out. - `DashSwitch` fell back to `accentColor`, `NavigationBarButtonStyle` to the value-less `animation(_:)` — the one that animates every change in the view, not just the press. - `SwitchView` reported `.isButton` instead of `.isToggle` to VoiceOver. - `BottomSheet` had the `isModalInPresentation` shim added for iOS 14 last week, and `selfSizingSheet` returned `self` unmodified below iOS 16 — a self-sizing sheet that did not self-size. The `#unavailable(iOS 26.0)` check stays: that one is genuinely above the floor. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`onChange(of:perform:)` was deprecated in iOS 17 / macOS 14. It stayed because the old floor made the replacement unavailable; declaring the macOS platform surfaced it as three build warnings. The package builds warning-free again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The panel was a fully rounded rectangle pushed below its own frame by the corner radius so its bottom corners fell off screen, with a comment explaining that the shape saying this in one line was iOS 16 and the library shipped to 14. It no longer does, so the workaround goes and the shape says what it draws. Rendered before and after in the simulator, light and dark: identical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
200 `@available` lines across 48 files, every one of them at or below the declared floor: `iOS 14 / macOS 11` on nearly every public type, `macOS 10.15` on the Foundation-level token types, `iOS 17 / macOS 14` on each `#Preview`. The manifest states the minimum once, so repeating a lower one per declaration only invited the question of which is true. Also folds in the last two deprecated `onChange(of:perform:)` call sites, in `BottomSheet` and `SearchBar`. They sit in UIKit-only paths, so the macOS build of the previous commit could not see them; the iOS simulator build did. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every component page opened with the `@available` line the type used to carry, and the prose recorded which feature lit up on which release — a SearchBar paragraph for the iOS 14 bar that no longer exists, a self-sizing sheet described as a no-op below iOS 16, swipe blocking split across two APIs. None of it is true at an iOS 18 floor, and none of it was worth restating per page now that the manifest says it once. `ScrollViewWithOnScrollChanged` keeps its page but says plainly that it predates `onScrollGeometryChange` and that new code can use the system API. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
4 tasks
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.
Issue being fixed or feature implemented
dashwallet-ios is an iOS 18 app —
platform :ios, '18.0'in its Podfile, and 18.0 on everyshipping build configuration of the
dashwalletanddashpaytargets, the two that linkthis package. This library was still declaring iOS 14, so every component that wanted an API
newer than 2020 carried a second implementation for hosts that no longer exist: a whole
alternative
SearchBar, single-line text fields without a styled prompt, a self-sizing sheetthat did not self-size, a
SwitchViewthat told VoiceOver it was a button.What was done?
The floor —
Package.swiftnow declares.iOS(.v18)and, for the first time,.macOS(.v15). The package never declared macOS at all, so a macOS build fell back to theSwiftPM default and every type had to carry
@available(macOS 11)by hand to compile there.Fallback paths removed —
SearchBar(theSearchBarLegacybar and the pre-17 field),AddressFieldView(pre-17 single-line field),DashSwitch(accentColor),NavigationBarButtonStyle(the value-lessanimation(_:), which animates every change inthe view rather than just the press),
SwitchView(.isButtoninstead of.isToggle),BottomSheet(theisModalInPresentationshim, andselfSizingSheetreturningselfbelow iOS 16). The
#unavailable(iOS 26.0)check inselfSizingSheetstays — that one isgenuinely above the floor.
Deprecations cleared — five
onChange(of:perform:)call sites move to the two-parameterform. They were deprecated in iOS 17 but the replacement was unavailable at the old floor;
declaring the macOS platform surfaced three of them as warnings, and the iOS build the other
two. The package now builds warning-free for both platforms.
NumericKeyboardView— the panel was a fully rounded rectangle pushed below its ownframe so its bottom corners fell off screen, with a comment explaining why the shape that
says this in one line was out of reach. It is an
UnevenRoundedRectanglenow.Annotations — 200
@availablelines across 48 files, all at or below the declared floor,are gone. The manifest states the minimum once.
Docs —
CLAUDE.md's hard-constraint section is replaced by the new rule (don't annotateat or below the floor; gate only what is newer). Component pages no longer restate an
@availableline each, and the prose that recorded which feature lit up on which release iseither gone or now true.
How Has This Been Tested?
swift buildandswift testclean on macOS (12 tests), andxcodebuild build-for-testingclean for the iOS Simulator — no errors, no warnings on either.
NumericKeyboardViewrendered in the simulator before and after the shape change, light anddark: identical.
Not run against dashwallet-ios itself yet — see below.
Breaking Changes
Yes — this raises the minimum deployment target to iOS 18 / macOS 15. Any host below that
can no longer link the package. dashwallet-ios is the only consumer and is already there, with
one exception worth fixing before this merges:
No API was removed or renamed: every public type, initialiser and parameter is unchanged, and
the components behave as they already did on iOS 18 hosts.
One follow-up worth noting rather than doing here:
ScrollViewWithOnScrollChangedexistsbecause
onScrollGeometryChangewas unavailable. It is available at this floor, so the helpercould be retired — but that is a public API removal and belongs in its own PR.
Checklist: