NativePHPについて
Laravelを基盤としてデスクトップアプリ・モバイルアプリを開発出来るフレームワークです
先にデスクトップアプリ用が2025/4に正式リリースされて2025/5/2にモバイルアプリ用が正式リリースされました
まだ出たばかりというのもありモバイルアプリ用のライセンスを購入する必要があります
必要要件
- PHP 8.3以上
- Laravel 10以上
iOS向け要件
- macOS 12以上のApple Silicon Mac
- XCode 16以上
Android向け要件
-
java -v
とadb devices
がターミナルで実行できること - (Windowsの場合は) 7zipのインストール
環境変数の設定
macOSの場合
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$JAVA_HOME/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools
Windowsの場合
set ANDROID_HOME=C:\Users\yourname\AppData\Local\Android\Sdk
set PATH=%PATH%;%JAVA_HOME%\bin;%ANDROID_HOME%\platform-tools
set JAVA_HOME=C:\Program Files\Microsoft\jdk-17.0.8.7-hotspot
設定出来たらターミナルの再起動などを行ってください
環境構築
ディレクトリ構成
nativephp/
├── docker/
│ ├── php/
│ │ └── Dockerfile
│ └── nginx/
│ └── default.conf
├── .env
├── docker-compose.yml
└── src/
docker-compose.yml
services:
app:
build:
context: ./docker/php
container_name: laravel_app
volumes:
- ./src:/var/www
working_dir: /var/www
ports:
- "9000:9000"
depends_on:
- mysql
web:
image: nginx:latest
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: laravel
volumes:
- db_data:/var/lib/mysql
node:
image: node:22
container_name: node
working_dir: /var/www
volumes:
- ./src:/var/www
tty: true
volumes:
db_data:
Dockerfile
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y \
git zip unzip curl libzip-dev libpng-dev libonig-dev libxml2-dev \
&& docker-php-ext-install pdo_mysql mbstring zip exif pcntl
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
default.conf
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
location ~ /\.ht {
deny all;
}
}
Laravel環境構築
docker compose run --rm app composer create-project laravel/laravel .
起動
docker compose up -d
起動して問題なくwebからアクセス出来るか確認をします
ライセンス購入
ここからラインセンスを購入します
購入するプランはご自身で選んでください
https://nativephp.com/mobile
登録し続ければ下記画面まで進める事ができます
ライセンスキーは誰もにも教えずメモしておいてください
.envに追記
NATIVEPHP_APP_ID
のvalueをデフォルトのcom.nativephp.yourapp
だとエラーが出てしまうのでcom.roll1226.roll1226app
のように設定してください
NATIVEPHP_APP_ID="com.nativephp.yourapp"
NATIVEPHP_APP_VERSION="DEBUG"
NATIVEPHP_APP_VERSION_CODE="1"
NativePHPのライブラリをインストール
composer.jsonに追記
{
...
"require-dev": {
"fakerphp/faker": "^1.23",
"laravel/pail": "^1.2.2",
"laravel/pint": "^1.13",
"laravel/sail": "^1.41",
"mockery/mockery": "^1.6",
"nunomaduro/collision": "^8.6",
"phpunit/phpunit": "^11.5.3"
},
+ "repositories": [
+ {
+ "type": "composer",
+ "url": "https://nativephp.composer.sh"
+ }
+ ],
...
}
composerでインストール
docker compose exec app composer require nativephp/ios
docker compose exec app composer require nativephp/mobile
1つ目のライブラリをインストールしようとすると対話モードが始まります
Username
とPassword
を入力するよう求められます
- Username → ライセンス登録時に入力したEmail
- Password → メモしたライセンスキー
を入力してください
NativePHPのインストーラーを実行
コンテナ内からローカルのエミュレータを起動することが難しかったためローカルからコマンドを実行するようにしています
なのでNativePHPのコマンドを実行する際はローカルでコマンドを実行するとよさそうです
cd src
php artisan native:install
こちらも実行すると対話モードが始まります
プラットフォームの選択
今回はiOSとAndroid両方を見ていきたいのでBoth
を選択してください
Include ICU-enabled PHP binary?
と聞かれるのでこちらはどちらでも構わいません
実行が完了したら実際に実行していこうと思います
実行
Android
php artisan native:run android --build=debug
実行出来ればLaravelのwelcome画面が表示されます
iOS
php artisan native:run ios --build=debug
実行するとどのエミュレータで動かすか聞かれるので開発に使用するエミュレータを選んでください
実行出来ればLaravelのwelcome画面が表示されます
機能実装
簡単な機能を実装していこうと思います
livewireのインストール
NativePHPがlivewireを使用しているため今回の実装でも使用していきます
docker compose exec app composer require livewire/livewire
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
+ @livewireStyles
</head>
<body>
+ @livewireScripts
</body>
</html>
これでlivewireが使用できるようになりました
カメラの実装
livewireを実行してファイルを作成していきます
docker compose exec app php artisan make:livewire camera
作成出来たらコードを書いていきます
<?php
namespace App\Livewire;
use Livewire\Component;
+use Native\Mobile\Facades\System;
class Camera extends Component
{
+ public function camera()
+ {
+ System::camera();
+ }
public function render()
{
return view('livewire.camera');
}
}
<div>
- {{-- The whole world belongs to you. --}}
+ <button wire:click="camera">カメラ</button>
</div>
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
@livewireStyles
</head>
<body>
@livewireScripts
+ <livewire:camera />
</body>
</html>
コードが書けたらエミュレータを実行することで確認が出来ます
シェアの実装
livewireを実行してファイルを作成していきます
docker compose exec app php artisan make:livewire share
作成出来たらコマンドを書いていきます
<?php
namespace App\Livewire;
use Livewire\Component;
+use Native\Mobile\Facades\Dialog;
class Share extends Component
{
+ public function share()
+ {
+ Dialog::share('Google', 'GoogleのURLをシェア', 'https://www.google.com');
+ }
public function render()
{
return view('livewire.share');
}
}
<div>
- {{-- The whole world belongs to you. --}}
+ <button wire:click="share">シェア</button>
</div>
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
@livewireStyles
</head>
<body>
@livewireScripts
<livewire:camera />
+ <livewire:share />
</body>
</html>
使ってみて
NativePHP for mobileを使ってみた感想ですが「まだ実用は難しいのでは」と感じました
現状ライセンスが有料なのでReactNativeやFlutterを採用する流れになるかと思います(今後、無料になる可能性があると公式は出しています)
またNativePHP for mobileの情報が少ないので開発には難航するかと思いますので無理やり開発に採用する必要はないです
ですが、面白い取り組みなので今後も追っていこうと思います