Memahami sistem plugin NativePHP: plugin discovery & registrasi, permissions deklaratif, cara menulis custom plugin Swift/Kotlin untuk kebutuhan spesifik, serta mengeksposnya ke PHP codebase via bridge.

Setelah di episode 13 kita membangun native components dan navigasi stack, pada episode ini kita masuk ke sistem plugin: bagaimana NativePHP memperluas kemampuannya dengan plugin, bagaimana plugin didaftarkan, dan bagaimana kalian bisa menulis custom plugin Swift/Kotlin untuk kebutuhan spesifik yang belum tersedia.
NativePHP dirancang dengan arsitektur plugin sejak awal. Setiap device API — kamera, biometrik, GPS, notifikasi — pada dasarnya adalah plugin yang dibundel dengan framework. Ketika kalian butuh fitur yang belum tersedia, kalian bisa membuat plugin sendiri.
NativePHP menggunakan service provider untuk mendaftarkan plugin. Plugin berupa package Composer yang mendaftarkan service provider ke Laravel:
<?php
namespace NativePHP\Firebase;
use Illuminate\Support\ServiceProvider;
class FirebaseServiceProvider extends ServiceProvider
{
public function boot(): void
{
$this->publishes([
__DIR__.'/../config/firebase.php' => config_path('firebase.php'),
]);
}
public function register(): void
{
$this->app->singleton(FirebaseService::class, function ($app) {
return new FirebaseService(
config('firebase.project_id'),
config('firebase.service_account_path'),
);
});
}
}<?php
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
// Plugin NativePHP didaftarkan di sini
$this->app->register(\NativePHP\Firebase\FirebaseServiceProvider::class);
}
}Plugin bisa mendeklarasikan permissions yang dibutuhkan. NativePHP akan mengelola permission flow otomatis:
<?php
namespace NativePHP\Firebase;
use Native\Laravel\Facades\Permissions;
class FirebaseServiceProvider extends ServiceProvider
{
public function boot(): void
{
Permissions::declare('firebase.notifications', [
'ios' => ['NSUserNotificationsUsageDescription'],
'android' => ['android.permission.POST_NOTIFICATIONS'],
]);
}
}Ketika kebutuhan spesifik belum tersedia di ekosistem NativePHP, kalian bisa menulis plugin sendiri. Plugin custom terdiri dari:
nativephp-custom-sensor/
├── src/
│ ├── CustomSensorServiceProvider.php
│ └── CustomSensor.php
├── ios/
│ ├── CustomSensorPlugin.swift
│ └── SensorBridge.swift
├── android/
│ ├── CustomSensorPlugin.kt
│ └── SensorBridge.kt
├── config/
│ └── custom-sensor.php
├── composer.json
└── README.mdimport Foundation
@objc class CustomSensorPlugin: NSObject {
private var callback: (([String: Any]) -> Void)?
@objc func startMonitoring(callback: @escaping ([String: Any]) -> Void) {
self.callback = callback
// Implementasi sensor monitoring
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
let reading = self.readSensorData()
callback(reading)
}
}
private func readSensorData() -> [String: Any] {
return [
"temperature": 25.5,
"humidity": 60.0,
"timestamp": Date().timeIntervalSince1970
]
}
}package com.nativephp.customsensor
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorManager
class CustomSensorPlugin(private val context: Context) {
private var sensorManager: SensorManager? = null
private var callback: ((Map<String, Any>) -> Unit)? = null
fun startMonitoring(callback: (Map<String, Any>) -> Unit) {
this.callback = callback
sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensor = sensorManager?.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE)
sensor?.let {
sensorManager?.registerListener(
object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
callback(mapOf(
"temperature" to event.values[0],
"timestamp" to System.currentTimeMillis()
))
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}
},
it,
SensorManager.SENSOR_DELAY_NORMAL
)
}
}
}<?php
namespace App\NativePHP;
use Native\Laravel\Facades\NativePHP;
class CustomSensor
{
public function startMonitoring(callable $callback): void
{
NativePHP::registerCallback('sensor-data', $callback);
NativePHP::call('custom-sensor.startMonitoring');
}
public function getTemperature(): float
{
return NativePHP::call('custom-sensor.getTemperature');
}
}<?php
use App\NativePHP\CustomSensor;
$sensor = new CustomSensor();
$sensor->startMonitoring(function ($data) {
\Log::info("Temperature: {$data['temperature']}°C");
if ($data['temperature'] > 35) {
\App\Jobs\SendHeatAlert::dispatch($data['temperature']);
}
});Note
Custom plugin membutuhkan pemahaman Swift (iOS) atau Kotlin (Android). Jika kalian hanya PHP developer, pertimbangkan untuk menggunakan plugin resmi NativePHP yang sudah ada terlebih dahulu, atau minta bantuan mobile developer untuk bagian native code.
Inti yang harus dibawa pulang:
Di episode 15 selanjutnya, kita akan membahas Integrasi API Remote & Sync Patterns — arsitektur app on-device + backend Laravel, autentikasi token, delta sync, conflict resolution, dan optimis updates. Sampai jumpa di episode 15!