PatchDay
iOS Universel / Forme et santé
An iOS app for managing HRT medication schedules. Pairs well with the "patch staggering" technique for transdermal patches. Also supports Pills, Injection-based HRT, and Gel-based HRT. Order the site schedule to match the sites you want to rotate through.
Quoi de neuf dans la dernière version ?
Added
- **iCloud sync.** New Settings → iCloud section to mirror your hormones, pills, sites, and most settings across your Apple ID devices. Off by default; needs a relaunch. PatchDay never sees your data — sync goes through your private iCloud database.
- First-launch **Set up PatchDay** sheet offering iCloud sync + notifications, with the legal disclaimer text folded in. Appears once for new installs and 3.x upgraders.
Changed
- Rewrote the UI in SwiftUI (Hormones, Pills, Sites, Settings).
- Minimum iOS is now 17.0 (was 15.4).
- Hormones tab title and icon reflect the configured Delivery Method (Patches / Injections / Gel).
- Pill detail supports the full options set: name, notify, 1–4 times/day, every Day / every Other Day / First X Days / Last X Days / X Days On X Days Off, and the X-Days controls.
- Site detail includes the image picker scoped to the current Delivery Method.
- Edit Hormone: tap the Site row for an action sheet with Type / Select / Auto. Auto picks the next site only; the separate **Change** button at the bottom applies site + date together (was "Autofill").
- Reducing Quantity or switching Delivery Method prompts a confirmation alert.
- New pills default to 8 AM as the first time-of-day.
- Hormones tab (Patches only): faded "Add patch" ghost cell immediately after your last patch. Tap to add a slot. Long-press a patch and pick "Remove patch" to drop a specific one. Settings → Quantity still works.
- Pills tab modernized: tap a pill for Take / Edit / Remove (the standalone Take button is gone). Toolbar plus replaced by a faded "Add pill" row at the bottom.
- Sites tab: toolbar plus replaced by a faded "Add site" row at the bottom.
- "Use static expiration time" is now exposed as "Dynamic expiration time" (the inverse). New installs default to off (static); existing users keep their 3.x behavior via a one-time migration.
Fixed
- Settings: Expiration Interval picker shows the current saved value (was blank); also refreshes when Delivery Method changes.
- Notifications: single-hormone schedules now receive notifications. Cancel-then-schedule is now correct even when notify is turned off (no stale items in the queue). Auth is requested only when the system hasn't been asked yet. Taking a pill from a notification updates the badge immediately. Unknown action identifiers now correctly invoke the system completion handler.
- Pill detail: warns about unsaved changes and lets you discard. Discarding a freshly-added pill cleans it up. Switching from an X-Days interval to Every Day / Every Other Day clears the old X-Days values. `timesTakenToday` no longer exceeds `timesaday` for never-taken pills.
- Sites: resetting no longer crashes when no extras exist to delete. Deleting no longer removes unrelated sites with a nil id. Reordering: the suggested-site arrow follows the move correctly.
- Hormones: site name no longer clears the custom site image id. `createExpirationDate(from:)` honors the passed start date. Sort with placeholder dates is stable.
- Calendar math: `daysSince` is correct across daylight-saving transitions (was off-by-one twice a year).
- Returning to the app no longer rebuilds every list (scroll position preserved).
- Memory leak in `Notifications`' pill-action handler retain cycle.
- Help link updated to `https://www.antazoey.me/#patchday`.