Push Notification adalah cara paling efektif untuk menjangkau pengguna meski aplikasi tidak aktif. Di Flutter, Firebase Cloud Messaging (FCM) menyediakan solusi lintas‑platform (Android & iOS) yang terintegrasi dengan Firebase. Artikel ini membahas persiapan proyek, konfigurasi Firebase, serta contoh kode lengkap untuk menerima notifikasi di latar belakang.
1. Tambahkan Dependency
Buka pubspec.yaml dan tambahkan paket berikut:
dependencies:
firebase_core: ^2.15.0
firebase_messaging: ^14.6.5
Jalankan flutter pub get.
2. Konfigurasi Firebase Console
- Buat project di https://console.firebase.google.com.
- Tambahkan aplikasi Android (bundle ID
com.example.app) dan iOS (bundle ID yang sama). - Unduh
google-services.json(Android) danGoogleService‑Info.plist(iOS). - Letakkan file‑file tersebut di folder masing‑masing:
- Android:
android/app/ - iOS:
ios/Runner/
- Android:
- Pada Project Settings → Cloud Messaging, catat Server key (akan dipakai untuk mengirim notifikasi dari server).
3. Android Manifest
Edit android/app/src/main/AndroidManifest.xml:
<manifest ...>
<application ...>
<!-- Tambahkan permission -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Service untuk handling pesan -->
<service android:name="com.google.firebase.messaging.FirebaseMessagingService" android:exported="true" />
</application>
</manifest>
4. Inisialisasi di Flutter
Buat file lib/services/push_service.dart:
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class PushService {
final FirebaseMessaging _messaging = FirebaseMessaging.instance;
final FlutterLocalNotificationsPlugin _local = FlutterLocalNotificationsPlugin();
Future<void> init() async {
await Firebase.initializeApp();
// Request permission (iOS)
await _messaging.requestPermission();
// Token untuk server
String? token = await _messaging.getToken();
print('FCM Token: $token');
// Foreground handler
FirebaseMessaging.onMessage.listen(_onMessage);
// Background handler (top‑level function)
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
// Local notification init
const AndroidInitializationSettings initSettings = AndroidInitializationSettings('@mipmap/ic_launcher');
await _local.initialize(const InitializationSettings(android: initSettings));
}
void _onMessage(RemoteMessage message) async {
RemoteNotification? notif = message.notification;
if (notif != null) {
await _local.show(
notif.hashCode,
notif.title,
notif.body,
NotificationDetails(
android: AndroidNotificationDetails('fcm_channel', 'FCM Notifications', importance: Importance.max),
),
);
}
}
}
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
// Bisa simpan data ke local storage atau tampilkan notifikasi dengan plugin lain
}
Panggil PushService().init() pada main() sebelum runApp():
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await PushService().init();
runApp(MyApp());
}
5. Mengirim Notifikasi dari Server
Gunakan API HTTP FCM dengan Server key yang didapat di langkah 2. Contoh cURL:
curl -X POST -H "Authorization: key=YOUR_SERVER_KEY" -H "Content-Type: application/json" \
-d '{
"to": "DEVICE_FCM_TOKEN",
"notification": {"title": "Hai!", "body": "Ini contoh push notification"},
"data": {"click_action": "FLUTTER_NOTIFICATION_CLICK"}
}' https://fcm.googleapis.com/fcm/send
Anda dapat membungkusnya dalam Cloud Function atau backend Node.js.
6. Penanganan Klik Notifikasi
Tambahkan listener di main():
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
// Navigasi ke halaman tertentu berdasarkan data payload
if (message.data['screen'] != null) {
Navigator.pushNamed(context, message.data['screen']);
}
});
Pastikan payload data berisi kunci screen.
7. Testing di Emulator & Real Device
- Android: Buka Logcat, perhatikan token, gunakan cURL di atas.
- iOS: Pastikan aplikasi memiliki Push Notification capability di Xcode, jalankan di perangkat fisik (simulator tidak menerima APNs).
8. Troubleshooting Umum
| Masalah | Penyebab | Solusi |
|—|—|—|
| Token null | Permission belum diberikan (iOS) | Panggil requestPermission() dan cek Settings → Notifications |
| Notifikasi tidak muncul di latar belakang | onBackgroundMessage tidak terdaftar di AndroidManifest | Tambahkan service atau gunakan FlutterLocalNotifications |
| APNs error 403 | Sertifikat APNs tidak cocok | Perbarui APNs Auth Key di Firebase console |
9. Kesimpulan
FCM memungkinkan push notification lintas platform dengan konfigurasi yang relatif sederhana. Tambahkan dependensi, set up Firebase, inisialisasi service, dan kirim pesan dari backend. Dengan contoh kode di atas, Anda sudah siap menambahkan engagement ke aplikasi Flutter.
Coba sendiri! Share ke sosial media dan tag @ahsai001