firebase_fcm_token

Firebase FCM token yönetimi ve server entegrasyonu için kapsamlı Flutter paketi. Bu paket FCM token'larını otomatik olarak yönetir, server'a gönderir ve uygulama durumunu kontrol ederek gerekli durumlarda beyaz ekran gösterir.

Özellikler

  • Otomatik FCM Token Yönetimi: Token'ları otomatik olarak alır ve server'a gönderir
  • Uygulama Durum Kontrolü: Server'dan uygulama durumunu kontrol eder
  • Beyaz Ekran Koruması: Uygulama kapalı ise beyaz ekran gösterir
  • Cross-Platform: Android, iOS ve Web desteği
  • MySQL Entegrasyonu: PHP server dosyaları ile MySQL veritabanı desteği
  • Token Yenileme: Otomatik token yenileme ve güncelleme
  • Background/Foreground: Arka plan ve ön plan mesaj yönetimi
  • Comprehensive API: Tam özellikli PHP REST API

Kurulum

pubspec.yaml dosyanıza ekleyin:

dependencies:
  firebase_fcm_token: ^1.0.0
  firebase_core: ^2.24.2
  firebase_messaging: ^14.7.10

Paketleri yükleyin:

flutter pub get

Firebase Kurulumu

  1. Firebase Console'da projenizi oluşturun
  2. FCM'i etkinleştirin
  3. Platform-specific konfigürasyonu yapın

Android Konfigürasyonu

android/app/google-services.json dosyasını ekleyin ve android/app/build.gradle dosyasında:

plugins {
    id 'com.google.gms.google-services'
}

dependencies {
    implementation 'com.google.firebase:firebase-messaging:23.4.0'
}

iOS Konfigürasyonu

ios/Runner/GoogleService-Info.plist dosyasını ekleyin ve gerekli capability'leri etkinleştirin.

Kullanım

Temel Kullanım

import 'package:firebase_fcm_token/firebase_fcm_token.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // Firebase FCM Token paketini başlat (sadece uygulama adı gerekli!)
  await FirebaseFcmToken().initialize(
    appName: 'your_app_name',
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirebaseFcmToken().buildAppStatusWidget(
        child: YourHomeWidget(),
      ),
    );
  }
}

İleri Seviye Kullanım

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final FirebaseFcmToken _fcmToken = FirebaseFcmToken();

  @override
  void initState() {
    super.initState();
    
    // Notification permission iste
    _fcmToken.requestPermission();
    
    // Foreground mesajları dinle
    _fcmToken.onMessage.listen((message) {
      print('Yeni mesaj: ${message.notification?.title}');
    });
    
    // Background mesaj handler
    _fcmToken.setBackgroundMessageHandler((message) async {
      print('Background mesaj: ${message.messageId}');
    });
  }

  @override
  Widget build(BuildContext context) {
    return _fcmToken.buildAppStatusWidget(
      child: Scaffold(
        appBar: AppBar(title: Text('My App')),
        body: Column(
          children: [
            ElevatedButton(
              onPressed: () async {
                // Manual olarak uygulama durumunu kontrol et
                await _fcmToken.refreshAppStatus();
              },
              child: Text('Durumu Kontrol Et'),
            ),
            ElevatedButton(
              onPressed: () async {
                // FCM token'ı al
                final token = await _fcmToken.getToken();
                print('FCM Token: $token');
              },
              child: Text('Token Al'),
            ),
          ],
        ),
      ),
    );
  }
}

Widget Örnekleri

// Basit uygulama durum widget'ı
AppStatusWidget(
  isAppEnabled: true,
  child: MyContent(),
)

// Özelleştirilebilir durum widget'ı
AppStatusWidget(
  isAppEnabled: false,
  disabledColor: Colors.grey[100],
  disabledMessage: 'Uygulama geçici olarak kullanılamıyor',
  child: MyContent(),
)

// Loading ile kombineli widget
AppStatusWrapper(
  isAppEnabled: appEnabled,
  isLoading: isLoading,
  loadingMessage: 'Yükleniyor, lütfen bekleyin...',
  disabledMessage: 'Uygulama kapalı',
  child: MyContent(),
)

Server Kurulumu

Pakete dahil PHP dosyalarını server'ınıza yükleyin:

1. Veritabanı Kurulumu

-- database.sql dosyasını çalıştırın
mysql -u username -p database_name < server/database.sql

2. Konfigürasyon

server/config.php dosyasını düzenleyin:

define('DB_HOST', 'localhost');
define('DB_NAME', 'firebase_fcm_db');
define('DB_USER', 'your_username');
define('DB_PASS', 'your_password');

3. API Endpoints

Pakette aşağıdaki API endpoint'leri mevcuttur:

  • POST /api/fcm_token.php - Token kaydetme
  • POST /api/app_status.php - Uygulama durumu kontrolü
  • GET /api/get_tokens.php - Token listesi
  • POST /api/delete_token.php - Token silme
  • POST /api/update_app_status.php - Uygulama durumu güncelleme

4. API Kullanım Örnekleri

# Token kaydetme
curl -X POST https://yourserver.com/api/fcm_token.php \
  -H "Content-Type: application/json" \
  -d '{
    "token": "fcm_token_here",
    "app_name": "my_app",
    "device_id": "device_123",
    "platform": "android"
  }'

# Uygulama durumu kontrolü
curl -X POST https://yourserver.com/api/app_status.php \
  -H "Content-Type: application/json" \
  -d '{
    "app_name": "my_app"
  }'

# Uygulama durumunu güncelleme
curl -X POST https://yourserver.com/api/update_app_status.php \
  -H "Content-Type: application/json" \
  -d '{
    "app_name": "my_app",
    "is_enabled": false,
    "disabled_reason": "Maintenance"
  }'

Server URL Konfigürasyonu

Paket varsayılan olarak dahili server URL'lerini kullanır. Eğer kendi server'ınızı kullanmak istiyorsanız:

// Custom server URL ile
await FirebaseFcmToken().initialize(
  appName: 'your_app_name',
  serverUrl: 'https://your-custom-server.com',
);

// Sadece uygulama adı (önerilen)
await FirebaseFcmToken().initialize(
  appName: 'your_app_name',
);

Environment Yönetimi

import 'package:firebase_fcm_token/firebase_fcm_token.dart';

// Development için
if (kDebugMode) {
  await FirebaseFcmToken().initialize(
    appName: 'your_app_dev',
    serverUrl: FCMConfig.environments['development'],
  );
} else {
  // Production için
  await FirebaseFcmToken().initialize(
    appName: 'your_app_prod',
  );
}

Veritabanı Yapısı

fcm_tokens Tablosu

  • id: Primary key
  • token: FCM token
  • app_name: Uygulama adı
  • device_id: Cihaz ID'si
  • platform: Platform (android/ios/web)
  • created_at: Oluşturma tarihi
  • updated_at: Güncelleme tarihi
  • last_used: Son kullanım tarihi
  • is_active: Aktif durumu

app_status Tablosu

  • id: Primary key
  • app_name: Uygulama adı
  • is_enabled: Aktif durumu
  • disabled_reason: Kapatılma nedeni
  • disabled_at: Kapatılma tarihi
  • created_at: Oluşturma tarihi
  • updated_at: Güncelleme tarihi

api_logs Tablosu

  • id: Primary key
  • endpoint: API endpoint
  • method: HTTP method
  • request_data: İstek verisi
  • response_data: Yanıt verisi
  • ip_address: IP adresi
  • status_code: HTTP durum kodu
  • created_at: Oluşturma tarihi

API Referansı

FirebaseFcmToken Sınıfı

Metodlar

  • initialize({required String appName, String? serverUrl, FirebaseOptions? firebaseOptions}): Paketi başlatır
  • getToken(): FCM token'ını döndürür
  • requestPermission(): Notification permission ister
  • refreshAppStatus(): Uygulama durumunu yeniler
  • buildAppStatusWidget({required Widget child}): Uygulama durum widget'ı oluşturur

Properties

  • isAppEnabled: Uygulamanın aktif olup olmadığını döndürür
  • onMessage: Foreground mesajlar için stream
  • onTokenRefresh: Token yenileme için stream

FCMTokenModel Sınıfı

FCM token verilerini temsil eden model sınıfı:

FCMTokenModel(
  token: 'fcm_token',
  appName: 'app_name',
  deviceId: 'device_id',
  timestamp: DateTime.now(),
)

AppStatusWidget Sınıfı

Uygulama durumuna göre içerik gösteren widget:

AppStatusWidget(
  isAppEnabled: true,
  disabledColor: Colors.white,
  disabledMessage: 'Özel mesaj',
  child: YourContent(),
)

Özelleştirme

Beyaz Ekran Özelleştirme

AppStatusWidget(
  isAppEnabled: false,
  disabledColor: Colors.grey[50],
  disabledMessage: 'Bakım çalışması devam ediyor...',
  disabledTextStyle: TextStyle(
    color: Colors.grey[800],
    fontSize: 18,
  ),
  child: MyContent(),
)

Loading Durumu

AppStatusLoader(
  isLoading: true,
  loaderColor: Colors.blue,
  loadingMessage: 'Veriler yükleniyor...',
  child: MyContent(),
)

Hata Ayıklama

Yaygın Sorunlar

  1. Token alınamıyor: Firebase konfigürasyonunu kontrol edin
  2. Server bağlantısı yok: URL ve network izinlerini kontrol edin
  3. Veritabanı hatası: MySQL bağlantı bilgilerini kontrol edin
  4. Notification çalışmıyor: Platform-specific konfigürasyonu kontrol edin

Log'ları Kontrol Etme

// Debug modunda detaylı log'lar gösterilir
if (kDebugMode) {
  print('FCM Token: $token');
  print('App Status: ${fcm.isAppEnabled}');
}

Server Log'ları

PHP server'da server/logs/app.log dosyasını kontrol edin:

tail -f server/logs/app.log

Güvenlik

  • API endpoint'lerinde rate limiting uygulayın
  • HTTPS kullanın
  • Veritabanı bağlantılarını güvenli hale getirin
  • Input validation yapın (pakette mevcut)

Katkıda Bulunma

  1. Fork yapın
  2. Feature branch oluşturun (git checkout -b feature/AmazingFeature)
  3. Değişikliklerinizi commit edin (git commit -m 'Add some AmazingFeature')
  4. Branch'inizi push edin (git push origin feature/AmazingFeature)
  5. Pull Request açın

Lisans

Bu proje MIT lisansı altında lisanslanmıştır. Detaylar için LICENSE dosyasına bakın.

Changelog

1.0.0

  • İlk stabil sürüm
  • Firebase FCM entegrasyonu
  • PHP server API'ları
  • MySQL veritabanı desteği
  • Otomatik uygulama durum kontrolü
  • Kapsamlı dokümantasyon ve örnekler

Destek

Sorunlar için GitHub Issues kullanın: https://github.com/your-username/firebase_fcm_token/issues

Katkıda Bulunanlar

  • Sizin adınız - İlk geliştirici

Teşekkürler

  • Firebase ekibine FCM için
  • Flutter ekibine platform desteği için
  • PHP ve MySQL topluluklarına

Libraries

firebase_fcm_token