Belajar NativePHP - Plugin Architecture & Custom Plugin
Episode 14 of 28

Belajar NativePHP - Plugin Architecture & Custom Plugin

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.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

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.

Plugin System

Plugin Discovery

NativePHP menggunakan service provider untuk mendaftarkan plugin. Plugin berupa package Composer yang mendaftarkan service provider ke Laravel:

Plugin sebagai service provider
<?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'),
            );
        });
    }
}

Registrasi Plugin

app/Providers/AppServiceProvider.php
<?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);
    }
}

Permissions Deklaratif

Plugin bisa mendeklarasikan permissions yang dibutuhkan. NativePHP akan mengelola permission flow otomatis:

Deklarasi permissions plugin
<?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'],
        ]);
    }
}

Custom Plugin

Ketika kebutuhan spesifik belum tersedia di ekosistem NativePHP, kalian bisa menulis plugin sendiri. Plugin custom terdiri dari:

  1. Swift/Kotlin code yang berjalan di native shell.
  2. PHP facade/class yang mengekspos API ke Laravel codebase.
  3. Bridge configuration yang menghubungkan keduanya.

Struktur Plugin Custom

plaintext
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.md

Swift Plugin (iOS)

ios/CustomSensorPlugin.swift
import 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
        ]
    }
}

Kotlin Plugin (Android)

android/CustomSensorPlugin.kt
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 Facade

src/CustomSensor.php
<?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');
    }
}
Menggunakan custom plugin
<?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.

Penutup

Inti yang harus dibawa pulang:

  • Plugin system berbasis service provider — familiar bagi developer Laravel.
  • Permissions deklaratif memudahkan permission flow tanpa boilerplate.
  • Custom plugin terdiri dari Swift/Kotlin code + PHP facade + bridge configuration.
  • NativePHP::call() memanggil kode native dari PHP.
  • Registrasi callback memungkinkan data native dikirim ke PHP secara real-time.

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!

Belajar NativePHP - Plugin Architecture & Custom Plugin | Belajar NativePHP