Giriş
Mobil uygulamalarda kullanıcılara anlık bildirimler göndermek, modern uygulama geliştirmenin vazgeçilmez bir parçası haline geldi. E-ticaret uygulamalarında sipariş durumu bildirimleri, sosyal medya uygulamalarında yeni mesaj uyarıları veya haber uygulamalarında güncel haber bildirimleri gibi birçok senaryoda push notification’lar kritik bir rol oynuyor. Flutter ile geliştirdiğimiz uygulamalarda Firebase Cloud Messaging (FCM) kullanarak hem token tabanlı hem de topic tabanlı push notification sistemleri kurabiliyoruz. Bu yazıda, Flutter ve Node.js backend kullanarak nasıl profesyonel bir push notification sistemi oluşturabileceğimizi adım adım inceleyeceğiz.

Gelişme: Proje Yapısı ve Temel Kurulum
Projemiz iki ana bileşenden oluşuyor: Flutter mobil uygulaması ve Node.js Express backend sunucusu. Flutter tarafında Firebase Messaging servisini kullanarak bildirimleri alıyoruz, backend tarafında ise Firebase Admin SDK ile bildirimleri gönderiyoruz.
Firebase Messaging Servisi
Flutter uygulamamızda Firebase Messaging servisini başlatmak için şu kodu kullanıyoruz:
class FirebaseMessagingService {
static final FirebaseMessagingService _instance =
FirebaseMessagingService._internal();
factory FirebaseMessagingService.instance() => _instance;
Future<void> init({required LocalNotificationsService localNotificationsService}) async {
_localNotificationsService = localNotificationsService;
_requestPermission();
await _initializeNotificationSubscription();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
FirebaseMessaging.onMessage.listen(_onForegroundMessage);
}
Future<void> subscribeToGeneralTopic() async {
await FirebaseMessaging.instance.subscribeToTopic('everyone');
await SharedPreferencesHelper.setNotificationEnabled(true);
}
Future<String?> getFCMToken() async {
return await FirebaseMessaging.instance.getToken();
}
}Bu servis, uygulamanın başlatılması sırasında çalışır ve kullanıcıdan bildirim izni ister. Ayrıca topic’lere abone olma ve FCM token alma gibi işlemleri yönetir. Singleton pattern kullanarak uygulama genelinde tek bir instance üzerinden erişim sağlanır. Foreground’da gelen bildirimler için local notification gösterimi yapılır, background ve terminated durumlarında ise Firebase’in kendi bildirim sistemi devreye girer.

Backend API Endpoint’leri
Backend tarafında iki ana endpoint bulunuyor: topic bildirimleri ve token bildirimleri. Topic bildirimleri, belirli bir konuya abone olan tüm kullanıcılara gönderilirken, token bildirimleri sadece belirli bir cihaza gönderilir. Bu yaklaşım, hem genel duyurular hem de kişisel mesajlar için esnek bir çözüm sunar.
// Topic bildirimi gönderme
app.post("/api/topic/notify", async (req, res) => {
try {
const { title, body } = req.body;
const message = {
notification: { title, body },
topic: "everyone",
};
const response = await admin.messaging().send(message);
res.json({
success: true,
messageId: response,
message: "Notification sent successfully",
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message,
});
}
});API Servisi ve HTTP İstekleri
Flutter uygulamasından backend’e HTTP istekleri göndermek için Dio paketini kullanıyoruz. Dio, modern ve güçlü bir HTTP client kütüphanesidir ve async/await desteği ile kolay kullanım sağlar:
class ApiService {
static const String baseUrl = 'http://localhost:3000';
final Dio _dio = Dio();
ApiService() {
_dio.options.baseUrl = baseUrl;
_dio.options.connectTimeout = const Duration(seconds: 5);
_dio.options.receiveTimeout = const Duration(seconds: 5);
}
Future<ApiResponse> sendTopicNotification(String title, String body) async {
try {
final response = await _dio.post(
'/api/topic/notify',
data: {'title': title, 'body': body},
);
if (response.statusCode == 200) {
return const ApiResponse(
success: true,
message: 'Notification sent successfully',
);
}
return const ApiResponse(
success: false,
message: 'Failed to send notification',
);
} on DioException catch (e) {
return ApiResponse(
success: false,
message: e.message ?? 'Failed to send notification',
);
}
}
}Bu servis, timeout ayarları ve hata yönetimi ile güvenilir bir iletişim sağlar. Android emulator için local IP adresi, iOS simulator için localhost kullanılmalıdır.

Sonuç: Pratik Kullanım Senaryoları
Bu proje, Flutter uygulamalarında push notification sistemlerinin nasıl kurulacağını ve kullanılacağını gösteriyor. Token tabanlı bildirimler, kullanıcıya özel mesajlar göndermek için idealdir. Örneğin, bir e-ticaret uygulamasında kullanıcının sipariş durumu değiştiğinde sadece o kullanıcıya bildirim gönderilebilir. Topic tabanlı bildirimler ise genel duyurular veya kampanyalar için mükemmeldir. Tüm kullanıcılara yönelik indirim kampanyaları veya sistem bakım bildirimleri gibi senaryolarda topic kullanımı çok daha verimlidir.

iOS için APNs (Apple Push Notification service) konfigürasyonu yapılması gerekiyor. Firebase Console’dan APNs Authentication Key veya Certificate yüklenerek iOS bildirimleri aktif hale getirilebilir. APNs Authentication Key yöntemi daha modern ve önerilen yaklaşımdır çünkü tek bir key ile hem development hem production ortamlarında kullanılabilir.

Backend tarafında Firebase Admin SDK kullanmak için Service Account Key’inin indirilmesi ve projeye eklenmesi gerekiyor. Bu key, backend sunucusunun Firebase servislerine erişmesini sağlar. Güvenlik açısından bu dosyanın asla version control sistemine commit edilmemesi ve production ortamında environment variable olarak kullanılması önemlidir.
Özet
Konuyu anlatan youtube videosuna buradan erişebilirsiniz: https://www.youtube.com/watch?v=oETdrD_Vs5A
Projenin kodlarını ilgili github linkinde bulabilirsiniz: https://github.com/nurullahturkoglu/flutter-fcm-topic-notifications
Flutter ve Firebase Cloud Messaging kullanarak hem Android hem de iOS platformlarında çalışan kapsamlı bir push notification sistemi kurduk. Token ve topic tabanlı bildirimler sayesinde hem kişisel hem de genel bildirimler gönderebiliyoruz. Bu sistem, modern mobil uygulamaların vazgeçilmez bir özelliği olan anlık bildirimleri kullanıcılara ulaştırmamızı sağlıyor. Proje, production-ready bir yapıda tasarlandı ve gerçek dünya senaryolarında kullanılabilecek şekilde geliştirildi. Local notification desteği, hata yönetimi ve kullanıcı deneyimi optimizasyonları ile profesyonel bir çözüm sunuyor.