Skip to content

v0.12.0

Latest

Choose a tag to compare

@joemasilotti joemasilotti released this 04 Aug 03:20

Breaking

  • 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

  1. bundle update ruby_native. On its own this closes both sign-in holes above and fixes which account a restore credits.
  2. Run ruby_native login again. An existing CLI session keeps working, but new sign-ins need this version.
  3. 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.
  4. 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.