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:
composer update nativephp/mobilephp artisan native:installphp 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.