Bifrost turns 1! Get 30% off annual plans with code
HAPPYBIRTHDAY
Blog

NativePHP Mobile 4.6.0

NativePHP for Mobile 4.6.0 is out. React to device rotation from PHP, declare which languages the app supports, keep the Android APP_KEY in the Keystore instead of the bundle, and build a simulator app without a simulator running — plus iOS 26 chrome fixes, safer plugin builds, and WebP on Android.

Upgrade with:

Copied!
composer update nativephp/mobile
php artisan native:install
php artisan native:run

native:install has to run after the composer update and before native:run so the native shell picks up the new package.

Device awareness#

OrientationChanged fires when the device rotates, and System::orientation() reads the current orientation from PHP (#371). Apps can declare which languages they support (#369). Device info picks up thermal state and extra telemetry (#359).

Keys and security#

Android stores the APP_KEY in the Keystore and stops bundling the developer's key with the app (#519). Keystore passwords that contain special characters are no longer mangled on Android (#299).

Build and distribute#

You can build a simulator app without needing a simulator running (#494). Play Store commits no longer fail when changes cannot be sent for review (#516). Plugin hook failures surface instead of producing a broken app (#414). Windows robocopy no longer times out mid-copy (#468), and registerNativeComponents() handles Windows path separators correctly (#163).

Chrome and layout#

On iOS 26, toolbar back chevron and actions hit-test the whole glass pill (#443). Inline top-bar backgrounds paint again on iOS 26.2 (#396). The PHP window background paints behind tabs chrome (#358). Top-bar actions get an opt-in disabled prop (#378).

Android maps more SF Symbol names to Material icons (#454), honors centering and inset-stretch on containers with absolute children (#376), and ships WebP image output with fixed uncompressed PNG (#399). Theme borders no longer overrule an explicit border width (#349).

Keyboard, webview, and events#

Keyboard dismissal is symmetric, with keep-focus-on-submit as the escape hatch (#521). Webview request and response bodies travel as bytes on iOS and Android (#490). Extra native payload keys are accepted when dispatching events over HTTP (#515). UI plugins can register custom Blade @event names (#432). Exceptions caught by the native error screen report into Laravel (#506). The callback expression parser no longer corrupts or drops arguments (#352).

Full changelog#

  • OrientationChanged + System::orientation() (#371)
  • Declare supported languages (#369)
  • Device thermal state + extra getInfo telemetry (#359)
  • Android APP_KEY in Keystore (#519)
  • Build a simulator app without a simulator (#494)
  • Surface plugin hook failures (#414)
  • iOS 26 glass hit-testing, top-bar paint, tabs background (#443, #396, #358)
  • Android WebP, SF Symbol maps, absolute-child layout (#399, #454, #376)
  • Symmetric keyboard dismissal; byte webview bodies (#521, #490)
  • Custom Blade @event names for UI plugins (#432)

Full changelog · GitHub release

Thanks to Sander (@sandermj), Sadiq (@sadiqk2), Adam Marshall, East Agile Tracker, Remco Danklof, Dr Codswallop, thelemon2020, SRWieZ, Simon Hamp, Willem Leuverink, PrestaEdit, David (@unlocdavid), ngunyimacharia, and Shane Rosenthal.