PushizoDocs
OperasyonRunbook'lar

Runbook: Gerçek cihaza APNs ve FCM test gönderimi

Bu runbook, kanal kimlik bilgilerinin gerçek sağlayıcılarla çalıştığını doğrulamak için izlenir. Faz 3'te "doğrula" ucu sağlayıcıya test bağlantısı kurar; gerçek cihaza gönderim Faz 4 (POST /v1/notifications) ve Faz 5…

Bu runbook, kanal kimlik bilgilerinin gerçek sağlayıcılarla çalıştığını doğrulamak için izlenir. Faz 3'te "doğrula" ucu sağlayıcıya test bağlantısı kurar; gerçek cihaza gönderim Faz 4 (POST /v1/notifications) ve Faz 5 (SDK) ile tamamlanır. Buradaki adımlar her iki fazda da geçerlidir.

Ön koşullar

  • Dashboard'da app oluşturulmuş ve App ayarları → Kanallar açılmış olmalı.
  • Apple: Apple Developer hesabı, Keys → Create a key → Apple Push Notifications service (APNs) ile üretilmiş .p8 dosyası, Key ID (10 karakter), Team ID (10 karakter), uygulamanın Bundle ID'si.
  • Google: Firebase projesi, Project settings → Service accounts → Generate new private key ile indirilmiş servis hesabı JSON'u (project_id, client_email, private_key alanları zorunlu).

1. APNs (iOS)

  1. Kanallar → iOS Push → sağlayıcı APNs.
  2. Key ID, Team ID, Bundle ID girin; ortamı seçin (sandbox: Xcode ile yüklenen build; production: TestFlight/App Store).
  3. .p8 dosyasını seçin (içerik tarayıcıdan okunur ve şifrelenerek saklanır; bir daha görüntülenemez).
  4. Kaydet ve doğrula. Beklenen sonuç: durum Aktif. Pushizo sıfır cihaz token'ı ile bir istek gönderir; Apple 400 BadDeviceToken döndürürse kimlik bilgisi geçerlidir.
  5. Hata eşlemesi:
    SonuçAnlamıÇözüm
    InvalidProviderTokenKey ID / Team ID / p8 uyumsuzÜçlüyü aynı Apple hesabından kontrol edin
    TopicDisallowed / BadTopicBundle ID anahtarla yetkili değilBundle ID'yi ve anahtarın push yetkisini kontrol edin
    NETWORKapi.push.apple.com:443 erişilemiyorGüvenlik duvarı/HTTP2 çıkışını açın
  6. Gerçek cihaz (Faz 4+): cihazda uygulamayı açın, SDK kaydı sonrası Abonelikler ekranında ios_push kaydını görün; Test cihazı anahtarını açın ve test push gönderin. Bildirim gelmezse Mesaj İzleme ekranında sağlayıcı yanıtına bakın (Unregistered → token eski/ortam yanlış: sandbox build'e production anahtarı gibi).

2. FCM (Android)

  1. Kanallar → Android Push → sağlayıcı FCM.
  2. Servis hesabı JSON dosyasını seçin veya içeriğini yapıştırın. Yalnızca project_id ve client_email görünür kalır; private_key şifrelenir.
  3. Kaydet ve doğrula. Pushizo OAuth2 ile erişim token'ı alır ve validate_only modunda sahte token'a istek atar; 400 INVALID_ARGUMENT / 404 kimlik bilgisinin geçerli olduğunu gösterir.
  4. Hata eşlemesi:
    SonuçAnlamıÇözüm
    OAUTH_FAILEDprivate_key/client_email geçersiz veya saat kaymasıJSON'u yeniden indirin; sunucu saatini NTP ile eşitleyin
    PERMISSION_DENIEDServis hesabının FCM yetkisi yokHesaba Firebase Cloud Messaging API Admin rolü verin; FCM API'nin etkin olduğundan emin olun
    SENDER_ID_MISMATCH (gönderimde)Cihaz token'ı başka Firebase projesine aitUygulamadaki google-services.json ile projeyi eşleştirin
  5. Gerçek cihaz (Faz 4+): uygulamayı açın, Abonelikler'de android_push kaydını görün, test push gönderin. UNREGISTERED → uygulama kaldırılmış veya token yenilenmiş.

3. Web Push

  1. Kanallar → Web Push → sağlayıcı Web Push; mailto: adresinizi ve site URL'sini girin. VAPID çifti otomatik üretilir; yalnızca public anahtar görünür ve SDK config ucundan yayınlanır.
  2. Mevcut bir VAPID çiftiniz varsa (ör. başka bir servisten taşıma) public/private değerleri birlikte girin; uyumsuzsa kayıt reddedilir.
  3. Gerçek tarayıcı (Faz 5): Web SDK izin isteyip aboneliği kaydettikten sonra test push gönderin. 410 → abonelik iptal edilmiş; 401/403 → VAPID anahtarı site kaydıyla uyuşmuyor (anahtar yenilendiyse tarayıcı abonelikleri yenilenmelidir).

4. Simülasyon modu

Gerçek kimlik bilgisi yoksa her kanal için mock sağlayıcı seçilebilir. Mock, token önekine göre deterministik sonuç üretir: mock:invalid, mock:transient, mock:rate, mock:auth, mock:fail; diğer token'lar başarılı sayılır. MOCK_LATENCY_MS ile gecikme simüle edilir.

5. Güvenlik notları

  • Kimlik bilgileri envelope encryption ile saklanır (docs/adr/0008), API/UI'dan geri okunmaz; yalnızca "yüklü / son doğrulama / son hata" görünür.
  • Doğrulama ucu dakikada 10 istekle sınırlıdır.
  • Anahtar rotasyonu için docs/runbooks/key-rotation.md.

Bu sayfada