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:
- Cihazdan aldığınız native token'ı bir Expo Push Token'a dönüştürür,
- 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)
- FCM V1 servis hesabı: Firebase konsolu → Proje Ayarları → Hizmet Hesapları → Yeni özel anahtar oluştur. İnen JSON dosyasını saklayın.
- APNs anahtarı (iOS): Muhtemelen Firebase'e zaten bir
.p8yüklediniz. Aynı anahtarı kullanabilirsiniz (yoksa oluşturma adımları: iOS rehberi). - expo.dev üzerinde bir proje oluşturun ve proje ID'sini (UUID) not edin.
- 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
- 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)
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:
{ "data": { "expoPushToken": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]" } }
Bu endpoint Expo'nun kendi
expo-notificationskütüphanesinin kullandığı endpoint'tir ve Expo tarafından ayrıca dokümante edilmemiştir.
3. NotiPilot'a kayıt
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
override fun onNewToken(token: String) {
// Mevcut kodunuz (örn. kendi backend'inize gönderim) aynen kalabilir
scope.launch { NotiPilot.registerDevice(applicationContext, fcmToken = token) }
}
iOS — Firebase Messaging ile APNs token'ını almak
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
final token = Platform.isIOS
? await FirebaseMessaging.instance.getAPNSToken()
: await FirebaseMessaging.instance.getToken();
Tam kod: Flutter
React Native — @react-native-firebase/messaging
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_NOTIFICATIONSizni, 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
.p8anahtarı Expo projesine yüklendi - iOS'ta APNs token (FCM token değil) dönüştürülüyor
-
onNewToken/didReceiveRegistrationTokeniçinde NotiPilot kaydı yenileniyor - Paneldeki Expo Project ID, paket adı ve bundle ID doğru