The canary and stable iOS builds ran on macos-latest, whose Xcode 26.6
links the iOS 26.5 SDK. iPhone Duo runs an app linked that way in a
compatibility window at a legacy iPhone size, without the vertical bar,
so the drawer bar never appears. These builds now run on the xcode-27
runner and select Xcode 27.1, whose SDK has the bar APIs; the image
defaults to 27.0. The deployment target stays at iOS 15.0.
Validation: both workflows parse; the first canary run confirms the
runner and the TestFlight upload.
The drawer bar was described across two iOS bullets, a page bullet
and an upstream-sync entry. MobileStyleAdaptation now gives it one
section: placement, the snapshot as its single source, publishing,
activation and page styling. API/Layout keeps what extension and theme
authors observe, iOSDevelopment keeps the simulator notes, and tt-docs
is regenerated.
Validation: pnpm run check.
The native bar is designed around the Duo's postures. The host now
attaches a UIHingeInteraction and draws the drawers only while the
hierarchy reports a hinge, so other iPhones and iPads keep the page's
own top bar even on iOS 27.1. The first hinge update arrives
asynchronously after the interaction is added and lays the window out
again; later updates relayout only when the hinge appears or goes away.
Validation: pnpm run check; on the iOS 27.1 iPhone Duo simulator the
outer display reports a closed hinge and shows the native bar in the
closed portrait layout. The 27.1 runtime offers no other device.
Left, right and top bars now follow one rule: the edge whose
layoutRegionForBarOnEdge:extent: region is non-empty and lies inside
that edge's safe-area inset hosts the drawers, vertical bars first. The
status bar strip follows the same vertical bar.
verticalBarEdge is no longer read. While rotating, that trait trails
the safe area by one layout pass, so the bar and the status bar strip
briefly took the side the vertical bar had just left. The host checks
for iOS 27.1 with available! instead of probing the trait's selector.
The simulator notes cover rotating the outer display from the app and
why simctl's screenConfig power must not simulate folding.
Validation: pnpm run check; on the iOS 27.1 iPhone Duo simulator, a
probe app compared the rule with UIKit's regions in the closed
portrait, closed landscape (both directions, through the rotation) and
unfolded wide layouts.
iPhone Duo keeps bar regions outside the safe area: a vertical bar
beside the content in the closed portrait and unfolded wide layouts,
and a top band beside the status bar in the unfolded tall layout. The
page's own top bar sat next to them and left that space empty.
From iOS 27.1, while the vertical size class is regular, the window
host draws the page's top-level drawers as a native glass capsule of
SF Symbol buttons in that region: the system vertical bar when
verticalBarEdge reports one, otherwise the top bar region when UIKit
lays it inside the top safe-area inset. Compact height, such as the
closed landscape layout, keeps the page's top bar.
The window snapshot announces the edge as drawerBar. drawer-bar.js
publishes each drawer's id, title, open state and mark through
set_drawer_bar_items, and a native tap dispatches
tt-drawer-bar-activate, which clicks the drawer's own icon, so opening
and hydration keep their existing path. The page hides its top bar and
the drawers slide in from the bar's edge.
Without the top bar, page content would run under the rounded display
corners. The host's content guide follows the safe area and, while it
draws the drawer bar, takes UIKit's corner-adapted top; the snapshot
insets read the same guide, so the backdrop strips and #bg1 stay
aligned. The status bar icons follow the strip on the edge that holds
the status bar.
Validation: pnpm run check; iPhone Duo simulator on iOS 27.1 in the
closed portrait, closed landscape, unfolded wide and unfolded tall
layouts.
macOS 26 shrinks irregular .icns icons onto a gray plate. Bundle an Icon Composer document with the iOS light background and the logo as one layer; Tauri compiles it into Assets.car, the system derives the dark, tinted and clear appearances, and icon.icns remains the fallback for macOS 15 and earlier.
Validation: pnpm run check; debug app bundle carries CFBundleIconName and Aqua/DarkAqua/Tintable stacks, rendered by system icon services.
Tauri 2.12.3, swift-rs 1.0.9 and the official plugin releases mark the
Swift `@_cdecl` entry points that Rust links against `public`, so iOS
release builds made with Xcode 27 link again. With the runtime exports
kept in optimized builds, drop the dev-profile overrides that built
Tauri and the Swift plugins unoptimized.
fs 2.7.0 returns only the bytes it read; the file stream already
validates the trailing count, so only its comment changes. The dialog
wrapper stays: 2.8.2 still turns confirm() into async IPC.
OpenHarmony stays on its 2.11 forks until they follow. The Nix pnpmDeps
hash is updated separately.
Validation: pnpm run check. Pending: iOS dev build on device and release
build with Xcode 27.
Upgrade tauri-plugin-pilot to 0.8.1, which reaches mobile webviews,
and register it on every platform the devtools-pilot feature builds.
Mobile builds take the plugin without the desktop-only press backend.
The pilot config lists the mobile capabilities too, since its explicit
list replaces the default capability set.
Add android:dev:pilot and ios:dev:pilot. The Simulator socket is found
directly; Android forwards the app's abstract socket over ADB, as
AndroidDevelopment describes.
Validation: cargo check with devtools-pilot for the host and
aarch64-apple-ios-sim; pilot 0.8.1 ping, eval, assert and snapshot on
macOS dev, the iPhone 17 Simulator and an API 36.1 emulator.
Tao 0.35.3 handed UIKit a UISceneConfiguration it had already
released, so iOS release builds crashed at launch. Tao 0.37 fixes
this and enables the scene lifecycle from the scene manifest alone:
the app now declares a single scene and no longer closes extra ones.
Wry 0.57 enables element fullscreen on every iOS version, so the host
stops configuring it.
Rebase the two Android Wry overrides on the 0.57.0 originals and keep
their approved differences; the chrome client uses WryActivity's
launchers. LAN discovery releases its multicast lock in the plugin's
Activity callback, the same source as Rust's resume event. Align the
CLI, official plugins and tauri-winrt-notification with the 2.12 line,
list the features the CLI writes in every tauri entry, and drop the
no-op macos-private-api feature.
OpenHarmony stays on its 2.11.6 fork and cannot build until the fork
follows. The Nix pnpmDeps hash is updated separately.
Fixes#337
Validation: pnpm run check; cargo check with devtools-pilot and for
aarch64-apple-ios; macOS pilot dev launch and Android API 36.1 debug
launch. Pending: iOS release on device, R8, Windows and Linux
artifacts, TestFlight.
Hide WebKit's form accessory bar and let UIKit's interactive dismissal
own the gesture. A full-window KeyboardScrollView inside WindowHost is
the pan surface: it has no content, recognizes alongside WebKit's
overflow scroll views, never cancels page touches, and keeps a zero
content offset because an empty bounce makes WebKit recompute visible
geometry every frame. The WebView stays constrained to the host's safe
area and keyboard guides.
The accessory bar also caused the two-stage dismissal: keyboardLayoutGuide
tracks the union of bar and keyboard, and the bar leaves about 400 ms
after the keyboard. Without it the guide returns to the safe area in one
animation.
While the pan is active the WebView height is held. iOS WebKit treats
every view-height change as a stylesheet-environment change and rebuilds
all styles (WebPage::viewportConfigurationChanged ->
updateSizeForCSSDefaultViewportUnits -> didChangeStyleSheetEnvironment),
about 30 ms per step on an iPhone 13. Like Safari, the page relayouts
once when the keyboard settles while the keyboard itself follows the
finger.
swift-rs picks Swift optimization from the Rust debug setting, and with
Xcode 27 an optimized Swift package loses the runtime exports Tauri's
plugin registration needs (Brendonovich/swift-rs#79). Keep debug info
for tauri and for every plugin that ships a Swift package so they build
in one mode: mixing modes passes on the simulator but aborts on device
in registerPlugin with swift_deletedMethodError.
swift-rs 1.0.8 fixes the SDK mix-up in SwiftPM cross builds. Remove the
overrides once the upstream export fix ships.
Consume system bars, cutouts and docked keyboards in Android and iOS,
then let web content use the resulting viewport. Publish window wallpaper
strips through one shared background path.
Remove the old CSS and IME compensation layers, update layout ABI v2,
and keep the matching documentation and behavior tests together.
Centralize file picking, staging and delivery across platforms, with explicit cancellation outcomes and source ownership.
Remove superseded platform bridges and redundant tests, and document the shared contract and platform differences.
Validation: pnpm run check; Android aarch64 cargo check; 117 host tests.