You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A leading navbar button now yields its slot to the back button. One rule on every platform and mode: the button shows on screens with nothing to go back to, like a tab's root. If you rely on a leading button staying visible on pushed screens (previously iOS Normal Mode only), move it to position: :trailing. Before, iOS Normal Mode showed both, iOS Advanced Mode lost its back button behind the leading button, and Android dropped the button outside a tab root.
Android apps are now portrait-only by default, matching iOS. Android previously ignored appearance.landscape and always rotated. If your app should rotate, set landscape: true and rebuild; rotation then resizes in place instead of restarting the screen.
Added
Signing out or switching accounts now resets the app, clearing every tab, once you opt in with the identity tag. Add <%= native_identity_tag current_user&.id %> to your layout; signing in never resets, and apps without the tag keep today's behavior. Docs, including the Inertia setup.
Links to another tab's path now switch tabs on Android in Normal Mode, matching iOS for Turbo, Inertia, and plain links.
The Android back button now follows your app's navigation history in Normal Mode, skipping form pages.
Hiding the tab bar no longer loses the page in Advanced Mode on Android. The iOS half shipped in 0.11.2.
Builds and screenshot captures now use the native code that matches your gem version. Patch fixes still arrive automatically; a new native minor arrives when you update the gem.
Navbar segments now render on Android as a Material segmented control in both modes, closing the gap with iOS for Turbo and Inertia apps.
Share buttons and share menu items now work on Android in both modes, opening the system share sheet.
Submitting a form now refreshes the other tabs on Android the next time you open them, so lists no longer show pre-submit data. Normal Mode; iOS already did this.
The navbar save button on Android now enables and disables live as the form changes, matching iOS.
Re-tapping the current tab on Android now returns it to its root, matching iOS.
Leading navbar buttons now render in Advanced Mode on Android, which previously never showed them.
Tabs marked eager: true now preload on Android, matching iOS.
Android apps now cold-start offline using the last known configuration, matching iOS.
CSS keyed on body.can-go-back now activates on Android in Normal Mode.
The Android error screen now names a gem/app version mismatch with "Gem update needed" or "App update needed" and the fix, matching iOS. Demo app only.
Changed
Backgrounding an Android app now pauses video, audio, and page timers, matching iOS and saving battery.
Android release builds are now minified, shrinking the APK and stripping debug logging.
Security
A crafted ruby_native login link can no longer hand your CLI token to whoever sent it. Update the gem and run ruby_native login again; an older CLI can no longer complete a sign-in, and the browser says so.
Restoring a purchase now grants the subscription to the account that bought it. One paid subscription could previously be restored onto any number of other accounts.
A crafted native sign-in link can no longer send someone's session to another app. Only apps using auth.oauth_paths were affected.
Fixed
A crashed page now recovers instead of freezing or killing the app. When the system reclaims a page's memory, iOS reloads it in place and Android rebuilds the tab; Android previously crashed outright and iOS sat on a blank page until relaunch. Normal Mode; Advanced Mode already recovered on both platforms.
Background tabs can no longer sign you out, flip the tab bar, or swallow a cold-launch notification tap. Only the tab on screen steers shared state now, matching Advanced Mode. Normal Mode, iOS only.
Returning to a tab no longer re-fires its last action on Android. A cross-tab link could bounce the tab straight back, and a completed scan could reopen the camera. Normal Mode, Android only.
The Android splash screen no longer hangs on a first page that fails to load. It gives way after ten seconds, matching iOS.
Fast navigation can no longer mark the wrong page as a form page, which quietly made the back button skip it for the rest of the session. The same fix keeps native_presentation_tag :root from clearing history it shouldn't in Inertia apps. Both platforms, Normal Mode.
Saving a form no longer leaves a back button pointing at the submitted form. Landing on a page whose only history is the form behind it now shows no back affordance, and on Android the back press no longer silently does nothing after a navbar-button submit. Both platforms, Normal Mode.
Purchase buttons no longer risk claiming in-app purchases are unavailable in a build that has them. A script-timing race let the no-IAP fallback claim the button first; it now always yields to the real purchase flow. iOS only.
Turbo's cached page previews no longer report stale signals. Badge counts and navbar state now always come from the fresh page. Both platforms.
Share buttons and share menu items now show the Material share glyph on Android by default. Without icons: they rendered the missing-icon placeholder, since the default is an SF Symbol name.
Tapping a link while a page is still loading no longer shows an error screen. Normal Mode, iOS only.
The QR code generated by ruby_native preview now scans on Android. It failed on dark terminal themes before.
The "Wants to Use ... to Sign In" alert now shows your app's name instead of "RubyNative". iOS only; your next deploy picks it up.
ruby_native deploy --if-needed no longer crashes before an app's first successful build, and --android --if-needed now compares against Android builds instead of iOS ones.
Upgrade guide
bundle update ruby_native. On its own this closes both sign-in holes above and fixes which account a restore credits.
Run ruby_native login again. An existing CLI session keeps working, but new sign-ins need this version.
Using in-app purchases? Run bin/rails generate ruby_native:iap and then bin/rails db:migrate. Your on_subscription_change callback then fires once per purchase instead of once per restore. Skipping it is safe, and so is re-running the generator.
Recommended: adopt the identity tag. Add <%= native_identity_tag current_user&.id %> to your layout, outside any signed-in check, and rebuild. Skipping it is safe. Inertia apps: follow the sign out docs.