Flutter & Mobil İle Akıllı Bildirim Zamanlama Sistemi Nasıl Yapılır?

Flutter & Mobil İle Akıllı Bildirim Zamanlama Sistemi Nasıl Yapılır?
Flutter & Mobil İle Akıllı Bildirim Zamanlama Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Akıllı bildirim sistemi kurmak için Flutter SDK'nın en güncel kararlı sürümüne sahip olmanız gerekir. Projenizde bildirimleri yönetmek için endüstri standardı olan flutter_local_notifications paketini ve zaman dilimi yönetimi için timezone paketini kullanacağız.

Kurulum için terminalinize şu komutları girerek gerekli bağımlılıkları projenize ekleyin:

flutter pub add flutter_local_notifications timezone

Ayrıca, Android tarafında AndroidManifest.xml dosyasına bildirim izinlerini eklemeyi unutmayın. iOS tarafında ise Info.plist dosyasında bildirim yetkilerini tanımlamanız gerekmektedir. Bu adımlar, uygulamanızın işletim sistemi ile sağlıklı iletişim kurması için zorunludur.

Bildirim Servisini Yapılandırma

Bildirimleri zamanlamadan önce, bildirim servisini başlatmak ve gerekli kanalları oluşturmak gerekir. Android 8.0 ve üzeri sürümlerde "Bildirim Kanalı" (Notification Channel) kavramı zorunludur. Bu kanal, bildirimlerin nasıl görüneceğini ve öncelik seviyesini belirler.

import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/data/latest.dart' as tz;

class NotificationService {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  Future init() async {
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('@mipmap/ic_launcher');
    
    const InitializationSettings initializationSettings = InitializationSettings(
      android: initializationSettingsAndroid,
    );

    await flutterLocalNotificationsPlugin.initialize(initializationSettings);
    tz.initializeTimeZones();
  }
}

Yukarıdaki kod, bildirim servisini başlatır ve Android uygulama simgesini varsayılan ikon olarak tanımlar. tz.initializeTimeZones() komutu ise zaman dilimi veritabanını yükler; bu, ileri tarihli bildirimler için hayati önem taşır.

Zamanlanmış Bildirimlerin Mantığı

Zamanlanmış bildirimler, belirli bir tarih ve saatte tetiklenmek üzere sisteme kaydedilir. Flutter'da bu işlem, zonedSchedule metodu ile gerçekleştirilir. Bu metod, bildirimin ne zaman tetikleneceğini ve hangi içeriğe sahip olacağını belirler.

import 'package:timezone/timezone.dart' as tz;

Future scheduleNotification(int id, String title, String body, DateTime scheduledDate) async {
  await flutterLocalNotificationsPlugin.zonedSchedule(
    id,
    title,
    body,
    tz.TZDateTime.from(scheduledDate, tz.local),
    const NotificationDetails(
      android: AndroidNotificationDetails(
        'channel_id', 
        'Hatırlatıcılar',
        importance: Importance.max,
        priority: Priority.high,
      ),
    ),
    androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle,
    uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
  );
}

Burada kullanılan androidScheduleMode.exactAllowWhileIdle parametresi, cihaz uyku modunda olsa bile bildirimin tam zamanında gönderilmesini sağlar. Bu, özellikle hatırlatıcı uygulamaları için kritik bir konfigürasyondur.

Bildirim Stratejileri Karşılaştırması

Mobil uygulamalarda bildirimleri yönetmek için farklı yaklaşımlar mevcuttur. İhtiyacınıza göre en uygun yöntemi seçmek, sistem performansını doğrudan etkiler.

Yöntem Avantajı Dezavantajı
Yerel (Local) İnternet gerektirmez, hızlıdır. Sunucu taraflı güncellenemez.
Push (FCM) Sunucudan anlık veri gönderir. İnternet bağlantısı zorunludur.
Hibrit İki yöntemin en iyi özelliklerini birleştirir. Karmaşık bir mimari gerektirir.

Kullanıcı İzinlerini Yönetme

Modern mobil işletim sistemleri, bildirim gönderebilmek için kullanıcıdan açık onay ister. İzin almadan gönderilen bildirimler, işletim sistemi tarafından otomatik olarak engellenir. İzin kontrolünü uygulama açılışında yapmak en sağlıklı yöntemdir.

Future requestPermissions() async {
  final AndroidFlutterLocalNotificationsPlugin? androidImplementation =
      flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>();

  await androidImplementation?.requestNotificationsPermission();
}

Bu fonksiyon, kullanıcıya bildirim izni penceresini gösterir. Kullanıcı reddederse, uygulamanızın ayarlar sayfasına yönlendirme yapacak bir akış tasarlamanız kullanıcı deneyimi açısından önemlidir.

Güvenlik Uyarısı: Bildirim içeriklerinde asla kullanıcıya ait hassas verileri (şifre, TC kimlik no, kredi kartı bilgisi vb.) açık metin olarak bulundurmayın. Bildirimler, cihazın kilit ekranında görünebilir ve üçüncü şahıslar tarafından okunabilir.

Yaygın Hatalar ve Debug İpuçları

Geliştirme sürecinde en sık karşılaşılan sorun, bildirimlerin tetiklenmemesidir. Bunun başlıca nedeni, yanlış zaman dilimi ayarlarıdır. tz.local kullanırken cihazın saat ayarlarının doğru olduğundan emin olun. Ayrıca, Android'de "Pil Optimizasyonu" ayarları, arka planda çalışan bildirim servislerini kısıtlayabilir.

Bir diğer yaygın hata ise id çakışmasıdır. Her bildirimin benzersiz bir tam sayı (integer) kimliği olmalıdır. Eğer aynı ID ile yeni bir bildirim zamanlarsanız, eski olanın üzerine yazılır.

// Bildirimleri iptal etmek için
await flutterLocalNotificationsPlugin.cancel(id);

// Tüm bildirimleri iptal etmek için
await flutterLocalNotificationsPlugin.cancelAll();

Sıkça Sorulan Sorular

Bildirimler neden cihaz kapalıyken gelmiyor?

Modern Android cihazlar, pil tasarrufu için arka plan süreçlerini kısıtlar. exactAllowWhileIdle parametresini kullandığınızdan ve gerekli izinleri aldığınızdan emin olun.

Zamanlanmış bir bildirimi nasıl güncelleyebilirim?

Bildirimleri güncellemek için aynı ID ile yeni bir zonedSchedule çağrısı yapmanız yeterlidir; sistem mevcut olanı otomatik olarak güncelleyecektir.

Aynı anda birden fazla bildirim zamanlayabilir miyim?

Evet, her bildirim için benzersiz bir ID kullanarak döngü içerisinde birden fazla bildirim zamanlayabilirsiniz.

Kullanıcı bildirime tıkladığında uygulamayı nasıl yönlendiririm?

onDidReceiveNotificationResponse callback fonksiyonunu kullanarak, kullanıcı bildirime tıkladığında uygulamanın hangi sayfaya gitmesi gerektiğini belirleyebilirsiniz.

İnternet bağlantısı olmadan bildirim çalışır mı?

Evet, yerel bildirimler (local notifications) cihazın kendi donanım saatini kullandığı için internet bağlantısına ihtiyaç duymaz.

Bildirim Performansı ve Bellek Yönetimi

Zamanlanmış bildirimlerin yoğun olduğu uygulamalarda, arka plan işlemlerinin cihaz kaynaklarını tüketmemesi kritik bir öneme sahiptir. Özellikle çok sayıda bildirim zamanladığınızda, flutter_local_notifications kütüphanesinin belleği nasıl yönettiğine dikkat etmelisiniz. Gereksiz bildirim nesneleri oluşturmak yerine, bildirimleri bir veritabanı (SQLite veya Hive) üzerinden yönetmek, uygulamanın performansını doğrudan artıracaktır.

Performansı optimize etmek için şu stratejileri uygulayabilirsiniz:

  • Batch İşlemler: Bildirimleri tek tek eklemek yerine, belirli periyotlarla toplu olarak zamanlayın.
  • Bellek Temizliği: Kullanıcı uygulamayı kapattığında veya bildirim süresi dolduğunda, cancel() metodunu kullanarak bellekteki bekleyen bildirimleri temizleyin.
  • İşlem Yükü: Bildirim tetiklendiğinde çalışacak kod bloğunu minimum seviyede tutun; ağır veri çekme işlemlerini bildirim anında değil, uygulama açıldığında gerçekleştirin.

İleri Düzey Senaryo: Dinamik Bildirim Gruplandırma

Kullanıcı deneyimini iyileştirmek için bildirimleri kategorize etmek, özellikle mesajlaşma veya görev yönetimi uygulamalarında standarttır. Android tarafında groupKey kullanarak bildirimleri bir başlık altında toplayabilir, iOS tarafında ise threadIdentifier ile bildirimleri gruplandırabilirsiniz.

Aşağıdaki örnekte, aynı gruba ait bildirimlerin nasıl birleştirileceğini inceleyebilirsiniz:


const AndroidNotificationDetails androidPlatformChannelSpecifics =
    AndroidNotificationDetails(
  'grup_id_01',
  'Görev Bildirimleri',
  channelDescription: 'Görev hatırlatıcıları için kanal',
  importance: Importance.max,
  priority: Priority.high,
  groupKey: 'gorev_grubu', // Aynı gruptaki bildirimleri birleştirir
  setAsGroupSummary: true, // Bu bildirim grup özeti olarak işaretlenir
);

const NotificationDetails platformChannelSpecifics =
    NotificationDetails(android: androidPlatformChannelSpecifics);

await flutterLocalNotificationsPlugin.show(
  0,
  'Yeni Görevleriniz Var',
  'Bugün tamamlamanız gereken 3 görev bulunuyor.',
  platformChannelSpecifics,
);

Bildirimlerin Test Edilmesi ve Deployment Süreci

Bildirim sisteminizi canlıya almadan önce mutlaka farklı cihaz modellerinde ve Android/iOS sürümlerinde test etmelisiniz. Özellikle Android 12 ve üzeri sürümlerde "Tam Ekran Bildirim" izinleri (USE_FULL_SCREEN_INTENT) için ek manifest yapılandırmaları gerekebilir.

İpucu: Emülatörler bazen bildirimlerin zamanlamasını doğru yansıtmayabilir. Gerçek cihazlarda test yapmak, bildirimlerin uyku modunda (Doze Mode) nasıl davrandığını gözlemlemek için en sağlıklı yoldur.

Deployment aşamasında dikkat etmeniz gerekenler:

  1. ProGuard Yapılandırması: Android'de proguard-rules.pro dosyanıza kütüphanenin çalışmasını bozmayacak kuralları eklediğinizden emin olun.
  2. App Store İncelemesi: iOS tarafında bildirim izinleri, uygulama ilk açıldığında kullanıcıya net bir şekilde açıklanmalıdır; aksi takdirde Apple, uygulamanızı reddedebilir.
  3. Log Kaydı: Üretim ortamında bildirimlerin tetiklenip tetiklenmediğini anlamak için Firebase Analytics veya benzeri bir araçla "bildirim_tetiklendi" gibi özel event'ler gönderin.

Sonuç

Flutter ile akıllı bildirim zamanlama sistemi kurmak, uygulamanızın kullanıcı tutundurma oranlarını artırmak için atacağınız en önemli adımlardan biridir. Bu rehberde öğrendiğiniz temel yapılandırmalar, izin yönetimi ve zamanlama stratejileri, profesyonel bir mobil uygulama geliştirme süreci için temel teşkil eder. Bir sonraki adım olarak, Firebase Cloud Messaging (FCM) ile bu yerel sistemi entegre ederek sunucu taraflı bildirimleri de yönetmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) almadan önce tüm güvenlik testlerini yapın ve uygulamanızın veri gizliliği politikalarına uygun olduğundan emin olun.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

On yıllık içerik üretim deneyimiyle karmaşık süreçleri herkesin anlayabileceği pratik rehberlere dönüştürüyorum. Günlük yaşamı kolaylaştıran çözümler üzerine uzmanlaşmış bir editörüm.

Yorumlar (0)

Yorum Yaz