Mengedit langsung proyek native: Info.plist permissions & AppDelegate extension untuk iOS, AndroidManifest & Gradle dependencies untuk Android, serta memahami filosofi Capacitor bahwa native project adalah source of truth yang di-commit ke git.

Setelah di episode 12 kita menulis custom plugin Swift dan Kotlin, pada episode ini kita memahami cara mengkustomisasi proyek native secara langsung. Di Capacitor, native project bukan artifact yang di-generate ulang — ia adalah source code yang di-commit ke git. Kalian bisa (dan harus) mengedit file native langsung untuk kebutuhan spesifik.
Mengapa penting? Karena beberapa konfigurasi hanya bisa dilakukan di level native: permission声明 di Info.plist, Gradle dependencies untuk SDK pihak ketiga, dan AppDelegate/MainActivity extensions untuk lifecycle hooks native.
Setiap permission yang dibutuhkan aplikasi harus dideklarasikan di ios/App/App/Info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "...">
<plist version="1.0">
<dict>
<!-- Kamera -->
<key>NSCameraUsageDescription</key>
<string>Aplikasi membutuhkan akses kamera untuk mengambil foto profil.</string>
<!-- Lokasi -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>Aplikasi membutuhkan lokasi untuk menampilkan konten terdekat.</string>
<!-- Push Notification -->
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
</dict>
</plist>Untuk menambahkan behavior native di lifecycle iOS, edit AppDelegate.swift:
import Capacitor
import UserNotifications
@UIApplicationMain
class AppDelegate: CAPBridgingAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// Setup notification delegate
UNUserNotificationCenter.current().delegate = self
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
) {
// Tampilkan notifikasi meskipun app di foreground
completionHandler([.banner, .badge, .sound])
}
}Beberapa konfigurasi hanya bisa diubah di Xcode:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mycapacitorapp">
<!-- Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Kamera -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Lokasi -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Push Notification -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
</manifest><application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- Deep Link -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https"
android:host="myapp.com"
android:pathPrefix="/article" />
</intent-filter>
</application>buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.4.0'
}
}apply plugin: 'com.google.gms.google-services'
dependencies {
// Firebase
implementation 'com.google.firebase:firebase-analytics:22.0.0'
implementation 'com.google.firebase:firebase-messaging:24.0.0'
// Third-party SDK
implementation 'com.stripe:stripe-android:20.0.0'
}Perbedaan fundamental Capacitor vs Cordova:
| Aspek | Capacitor | Cordova |
|---|---|---|
| Native project | Source code (di-commit) | Artifact (di-generate) |
| Edit native | Langsung edit file | Harus lewat config.xml |
| Hilang saat rebuild | Tidak | Ya |
| Tim native bisa kontribusi | Ya | Sulit |
Implikasinya:
Info.plist langsung di Xcode atau text editor.AndroidManifest.xml langsung.Warning
Jangan edit file di node_modules/@capacitor/. Edit selalu di project native kalian sendiri (ios/App/ atau android/app/). File di node_modules akan ditimpa saat npm install.
Info.plist, tambahkan NSCameraUsageDescription.Camera.getPhoto() — permission dialog muncul.<uses-permission android:name="android.permission.CAMERA"/> di AndroidManifest.xml.build.gradle jika diperlukan.Pada episode 13 ini, kalian telah memahami:
Di episode 14 selanjutnya, kita akan membahas Swift Package Manager & Dependency Management — adopsi SPM sebagai package manager iOS di Capacitor 8, migrasi dari CocoaPods, dan cara menambah SDK iOS via SPM. Sampai jumpa!