Geliştiriciler · API v1.0.0

Firebase (FCM) Kullanan Projeler İçin Entegrasyon

Bu rehber uygulamasında zaten Firebase Cloud Messaging (FCM) kullanan ekipler içindir: native Android/iOS, Flutter, React Native Firebase veya Capacitor fark etmez. Mevcut Firebase kurulumunuzu bozmadan NotiPilot'u nasıl ekleyeceğinizi anlatır. Genel API referansı için Genel bakış.

Desteklenen sürümler: Firebase Android BoM 33+ · Firebase iOS SDK 10+ · firebase_messaging (Flutter) 15+ · @react-native-firebase/messaging 20+

Bilmeniz gereken tek şey

NotiPilot 1.0.0 bildirimleri Expo Push Service üzerinden teslim eder ve Expo da Android'de FCM'i, iOS'ta APNs'i kullanır. Yani Firebase altyapınız aynen kalır; yalnızca:

  1. Cihazdan aldığınız native token'ı bir Expo Push Token'a dönüştürür,
  2. Bu token'ı NotiPilot'a kaydedersiniz.
Platform Dönüşüme gönderilecek token Firebase API'si
Android FCM registration token FirebaseMessaging.getInstance().getToken()
iOS APNs device token (FCM token değil!) Messaging.messaging().apnsToken

⚠️ iOS'ta Firebase'in verdiği FCM token'ını göndermeyin. Expo, iOS'a APNs ile doğrudan teslim ettiği için ham APNs token'ına ihtiyaç duyar.

API'ye doğrudan FCM token'ı (provider: "fcm") da kaydedebilirsiniz; cihaz kaydolur ve segmentlerde görünür, ancak 1.0.0'da bu cihazlara bildirim teslim edilmez.

1. Firebase ve Expo kimlik bilgileri (bir kez)

  1. FCM V1 servis hesabı: Firebase konsolu → Proje Ayarları → Hizmet Hesapları → Yeni özel anahtar oluştur. İnen JSON dosyasını saklayın.
  2. APNs anahtarı (iOS): Muhtemelen Firebase'e zaten bir .p8 yüklediniz. Aynı anahtarı kullanabilirsiniz (yoksa oluşturma adımları: iOS rehberi).
  3. expo.dev üzerinde bir proje oluşturun ve proje ID'sini (UUID) not edin.
  4. expo.dev → Proje → Credentials:
    • Android → FCM V1 service account key → 1. adımdaki JSON
    • iOS → Bundle ID ekle → Push Key → .p8 + Key ID + Team ID
  5. NotiPilot panelinde uygulamanızı ekleyin: Expo Project ID, Expo Access Token (expo.dev → Access Tokens), Android Package, iOS Bundle ID.

2. Token dönüşümü (tüm platformlar için aynı HTTP isteği)

HTTP
POST https://exp.host/--/api/v2/push/getExpoPushToken
Content-Type: application/json

{
  "type": "fcm",                        // Android: "fcm", iOS: "apns"
  "deviceId": "8f14e45f-ceea-467a-9575-0b3f5c6b2a11", // device_uid ile aynı (küçük harf UUID)
  "development": false,                 // iOS debug build (APNs sandbox) için true
  "appId": "com.example.app",           // Android package / iOS bundle id
  "deviceToken": "<FCM veya APNs token>",
  "projectId": "<Expo proje ID'si>"
}

Yanıt:

JSON
{ "data": { "expoPushToken": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]" } }

Bu endpoint Expo'nun kendi expo-notifications kütüphanesinin kullandığı endpoint'tir ve Expo tarafından ayrıca dokümante edilmemiştir.

3. NotiPilot'a kayıt

HTTP
POST https://app.notipilot.com/api/v1/register-device
Content-Type: application/json

{
  "app_id": "<Expo proje ID'si>",
  "device_uid": "8f14e45f-ceea-467a-9575-0b3f5c6b2a11",
  "token": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
  "platform": "android",
  "provider": "expo",
  "attributes": { "locale": "tr", "country": "TR", "city": "Istanbul" }
}

4. Mevcut Firebase koduna ekleme noktaları

Android — FirebaseMessagingService

Kotlin
override fun onNewToken(token: String) {
    // Mevcut kodunuz (örn. kendi backend'inize gönderim) aynen kalabilir
    scope.launch { NotiPilot.registerDevice(applicationContext, fcmToken = token) }
}

Tam kod: Kotlin · Java

iOS — Firebase Messaging ile APNs token'ını almak

Swift
import FirebaseMessaging

extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        // FCM token yenilendi; NotiPilot için APNs token'ını kullanın
        guard let apnsToken = Messaging.messaging().apnsToken else { return }
        Task { try? await NotiPilot.shared.registerDevice(apnsToken: apnsToken) }
    }
}

FirebaseAppDelegateProxyEnabled kapalıysa didRegisterForRemoteNotificationsWithDeviceToken içinde Messaging.messaging().apnsToken = deviceToken atamasını yaptığınızdan emin olun. Tam kod: Swift · Objective-C

Flutter — firebase_messaging

Dart
final token = Platform.isIOS
    ? await FirebaseMessaging.instance.getAPNSToken()
    : await FirebaseMessaging.instance.getToken();

Tam kod: Flutter

React Native — @react-native-firebase/messaging

TypeScript
const token = Platform.OS === 'ios'
  ? await messaging().getAPNSToken()
  : await messaging().getToken();

Tam kod: React Native — Yöntem B

5. Gelen bildirimi okuma

Expo, Android'e FCM üzerinden şu alanlarla gönderir. Kodunuzu her iki biçimi de destekleyecek şekilde yazın:

Bilgi Konum
Başlık notification.title veya data["title"]
Metin notification.body veya data["message"]
Panelden gönderilen özel veri data["body"] (JSON string)
Kanal data["channelId"] = "default"

iOS'ta başlık ve metin standart aps.alert içinde gelir; özel veri userInfo["body"] anahtarındadır.

6. Firebase ile birlikte kullanımda dikkat edilecekler

  • Kendi backend'inizden FCM ile gönderim yapmaya devam edebilirsiniz; NotiPilot buna engel olmaz.
  • Aynı bildirimin iki kez gelmemesi için aynı kampanyayı hem kendi sisteminizden hem NotiPilot'tan göndermeyin.
  • Firebase Web SDK (web push) 1.0.0'da desteklenmez.
  • Android 13+ için POST_NOTIFICATIONS izni, iOS için kullanıcı izni gereklidir (Firebase'de zaten istiyorsanız ek bir şey yapmanız gerekmez).

Kontrol listesi

  • FCM V1 servis hesabı JSON'u ve APNs .p8 anahtarı Expo projesine yüklendi
  • iOS'ta APNs token (FCM token değil) dönüştürülüyor
  • onNewToken / didReceiveRegistrationToken içinde NotiPilot kaydı yenileniyor
  • Paneldeki Expo Project ID, paket adı ve bundle ID doğru