Skip to content

chore: raise the deployment target to iOS 18 - #15

Open
romchornyi wants to merge 6 commits into
masterfrom
chore/ios-18-deployment-target
Open

chore: raise the deployment target to iOS 18#15
romchornyi wants to merge 6 commits into
masterfrom
chore/ios-18-deployment-target

Conversation

@romchornyi

Copy link
Copy Markdown
Collaborator

Issue being fixed or feature implemented

dashwallet-ios is an iOS 18 app — platform :ios, '18.0' in its Podfile, and 18.0 on every
shipping build configuration of the dashwallet and dashpay targets, the two that link
this 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 sheet
that did not self-size, a SwitchView that told VoiceOver it was a button.

What was done?

The floorPackage.swift now declares .iOS(.v18) and, for the first time,
.macOS(.v15). The package never declared macOS 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.

Fallback paths removedSearchBar (the SearchBarLegacy bar and the pre-17 field),
AddressFieldView (pre-17 single-line field), DashSwitch (accentColor),
NavigationBarButtonStyle (the value-less animation(_:), which animates every change in
the view rather than just the press), SwitchView (.isButton instead of .isToggle),
BottomSheet (the isModalInPresentation shim, and selfSizingSheet returning self
below iOS 16). The #unavailable(iOS 26.0) check in selfSizingSheet stays — that one is
genuinely above the floor.

Deprecations cleared — five onChange(of:perform:) call sites move to the two-parameter
form. 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 own
frame 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 UnevenRoundedRectangle now.

Annotations — 200 @available lines across 48 files, all at or below the declared floor,
are gone. The manifest states the minimum once.

DocsCLAUDE.md's hard-constraint section is replaced by the new rule (don't annotate
at or below the floor; gate only what is newer). Component pages no longer restate an
@available line each, and the prose that recorded which feature lit up on which release is
either gone or now true.

How Has This Been Tested?

  • swift build and swift test clean on macOS (12 tests), and xcodebuild build-for-testing
    clean for the iOS Simulator — no errors, no warnings on either.
  • Every commit builds on its own.
  • NumericKeyboardView rendered in the simulator before and after the shape change, light and
    dark: 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:

The Testnet configuration of the dashpay target still has
IPHONEOS_DEPLOYMENT_TARGET = 17.0 — the only configuration in the project that does. It
links DashUIKit, so it will fail to build against this branch until it is moved to 18.0.
A separate PR against dashwallet-ios covers it.

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: ScrollViewWithOnScrollChanged exists
because onScrollGeometryChange was unavailable. It is available at this floor, so the helper
could be retired — but that is a public API removal and belongs in its own PR.

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation

Roman and others added 6 commits August 27, 2026 17:24
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>
@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 1fdfd9ec-2df3-48a9-8f54-8872da702d5b


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant