APNS (Apple Push Notification Service), ekosistem cihazlarına (iPhone, iPad, Mac, Apple Watch ve Apple TV) push bildirimleri göndermek için Apple'ın altyapı hizmetidir. Servis, cihaz ile Apple sunucuları arasındaki kalıcı TLS bağlantısı aracılığıyla güvenilir mesaj teslimi sağlar. Apple Developer Documentation'a göre, APNS, uygulama sunucularıyla çift yönlü iletişim için HTTP/2 protokolünü kullanır.
Anahtar Noktalar
Apple Push Notification Service (APNS), uygulama sunucusundan kullanıcı cihazlarına push bildirimleri yönlendiren Apple'a özel hizmettir. FCM'nin aksine APNS, Android veya diğer platformları desteklemez — tamamen Apple ekosistemine bağlıdır.
Servis, her Apple cihazının başlatıldığında APNS sunucularıyla kurduğu kalıcı bir TLS bağlantısı aracılığıyla çalışır. Bu bağlantı arka planda tutulur ve minimum gecikmeyle bildirimleri iletmek için kullanılır.
APNS tüm teslim altyapısını yönetir: şifreleme, kimlik doğrulama, önceliklendirme ve cihaz kullanılamadığında yeniden gönderme. Geliştiricinin yalnızca doğru biçimlendirilmiş bir yük ve geçerli bir push tokenı sağlaması gerekir.
Başlangıçta APNS, 2195–2196 numaralı portlarda ikili protokol üzerinden çalışıyordu. 2015'ten itibaren Apple, hizmeti çoğullama, başlık sıkıştırma ve sunucu push bildirimlerini destekleyen modern HTTP/2 protokolüne taşıdı. HTTP/2, Haziran 2020'de zorunlu hale geldi.
APNS aracılığıyla push bildirimi teslim süreci beş aşamadan oluşur: cihaz kaydı, push tokenı alma, sunucudan istek gönderme, APNS yönlendirmesi ve cihaza teslim.
Cihaz kullanılamıyorsa (kapalı veya ağ yok), APNS her uygulama için en son mesajı saklar ve bağlantı yeniden kurulduğunda teslim eder. Maksimum saklama süresi 4 haftadır, ardından mesaj silinir.
Apple, push bildirimleri gönderirken uygulama sunucusunu doğrulamak için iki yöntemi destekler. Her yöntemin geçerlilik süresi, yönetimi ve kullanım kolaylığı açısından kendine özgü özellikleri vardır.
| Parametre | Token Tabanlı (p8) | Sertifika Tabanlı (.p12) |
|---|---|---|
| Geçerlilik | Süresiz (anahtar sona ermez) | Sertifika geçerliliğiyle sınırlı (genellikle 1 yıl) |
| Dönüşüm | Anahtar tehlikeye girmediği sürece gerekmez | Yıllık değişim zorunludur |
| Çoklu uygulama | Hesaptaki tüm uygulamalar için tek anahtar | Her uygulama için ayrı sertifika |
| Ortam | Sandbox ve Production için tek anahtar | Sandbox ve Production için farklı sertifikalar |
Token tabanlı kimlik doğrulama, 2019'dan beri Apple tarafından önerilen yöntemdir. Apple Developer Console'da tek bir p8 anahtarı oluşturur, sunucunuza yükler ve her APNS isteğini bununla imzalarsınız. Anahtar asla sona ermez ve hesabınızdaki tüm uygulamalar için çalışır.
Yeni projeler için Token tabanlı kimlik doğrulama açıkça tercih edilir: tüm hesap için tek p8 anahtarı, süresiz, ortam bağımsız. Sertifika tabanlı (.p12) hâlâ eski projelerde kullanılır ancak yıllık değişim ve Sandbox ile Production için ayrı sertifikalar gerektirir. CI/CD planlarken sertifika son kullanma tarihini göz önünde bulundurun.
APNS, cihazdaki davranışları ve istek özellikleri gereksinimleri açısından farklılık gösteren üç tür push bildirimini destekler. Tür seçimi, UX senaryosuna ve mesajın aciliyetine bağlıdır.
Background bildirimleri için content-available: 1 anahtarını belirtmeli ve önceliği 5 (enerji verimli teslim) olarak ayarlamalısınız. Uygulama bunları zamanında işlemezse sistem arka plan bildirimlerinin sayısını sınırlayabilir.
APNS iki öncelik değerini destekler: 10 (anında teslim) ve 5 (enerji verimli). Alert bildirimleri için 10 kullanın — kullanıcı bunları hemen almalıdır. Arka plan bildirimleri için 5 kullanın — sistem pil tasarrufu için teslimi geciktirebilir. Arka plan için yanlış öncelik APNS reddine yol açabilir.
APNS, normal bildirimler için maksimum 4 KB ve VOIP için 5 KB boyutuyla JSON biçiminde yük kabul eder. Yük, görüntüleme ayarlarıyla zorunlu aps sözlüğünü ve isteğe bağlı özel alanları içerir.
{
"aps": {
"alert": {
"title": "Yeni mesaj",
"body": "3 okunmamış sohbetiniz var"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
thread-id anahtarı, iOS Bildirim Merkezi'nde bildirimleri gruplandırır. category anahtarı, eylem düğmelerini göstermek için bildirimi bir UNNotificationCategory'ye bağlar. Bu anahtarlar olmadan tüm bildirimler ayrı ayrı görüntülenir.
Zorunlu aps sözlüğüne ek olarak, APNS yükü en üst düzeyde herhangi bir özel alan içerebilir. Bu alanlar, bildirim işlenirken userInfo sözlüğü aracılığıyla uygulama tarafından erişilebilir. Özel veriler, varlık tanımlayıcılarını, ekranları veya bağlantıları iletmek için kullanışlıdır. Maksimum yük boyutu 4 KB'dir, bu nedenle push aracılığıyla büyük miktarlarda veri aktarmaktan kaçının; bildirimi açtıktan sonra API üzerinden yükleyin.
Sunucudan bir push bildirimi göndermek için, doğru kimlik doğrulama başlıklarıyla APNS bitiş noktasına bir POST isteği yapmanız gerekir. Aşağıda Token tabanlı kimlik doğrulama kullanan Node.js örneği verilmiştir.
const http2 = require("http2")
const fs = require("fs")
const jwt = require("jsonwebtoken")
const token = jwt.sign(
{ iss: "TEAM_ID", iat: Math.floor(Date.now() / 1000) },
fs.readFileSync("AuthKey.p8"),
{ algorithm: "ES256", keyid: "KEY_ID" }
)
const payload = JSON.stringify({
aps: { alert: { title: "Merhaba!", body: "Test push" } }
})
const client = http2.connect(
"https://api.push.apple.com"
)
const req = client.request({
":method": "POST",
":path": "/3/device/DEVICE_PUSH_TOKEN",
"authorization": "bearer " + token,
"apns-push-type": "alert",
"apns-topic": "com.example.app",
"apns-priority": "10"
})
req.end(payload)
req.on("response", (headers) => {
if (headers[":status"] === 200) {
console.log("Push başarıyla gönderildi")
}
})
Gönderme sonrası, APNS başarılı teslimde HTTP durumu 200 veya yanıt gövdesinde açıklamalı hata kodu döndürür. token-unregistered (410) hatalarını işlemek önemlidir — bu tür tokenlar sunucudan kaldırılmalıdır, çünkü uygulama cihazdan silinmiştir.
APNS her gönderme isteği için HTTP durum kodları döndürür. Başarılı teslim durum 200 döndürür. Hatalar farklı işleme stratejileri gerektirir. BadDeviceToken (400) veya Unregistered (410) — cihaz tokenı güncelliğini yitirmiştir ve sunucudan kaldırılmalıdır. PayloadTooLarge (413) — 4 KB sınırı aşıldı, yükü azaltın.
TooManyRequests (429) — istek sınırı aşıldı. APNS, saniye başına gönderim sayısına bir kota belirler. 429 alındığında, üstel geri çekilme (exponential backoff) uygulayın ve yeniden deneyin. HTTP/2 bağlantısı başına saniyede 100 isteği aşmamanız önerilir.
APNS tarafı hataları — 500 ve 503 (Iç Sunucu Hatası / Hizmet Kullanılamıyor). Bunlar Apple altyapısının geçici arızalarıdır. Bu durumlarda 1–5 saniye gecikmeyle yeniden deneyin, en fazla 3 deneme. Tamamen çalışan bir sunucuda kalıcı 5xx hataları nadirdir ve genellikle TLS bağlantı sorunlarıyla ilgilidir.
Production ortamları için, token, hata kodu ve zamanla birlikte tüm APNS hatalarının günlüklenmesini uyguladığınızdan emin olun. Bu, sertifikalar, kotalar veya belirli cihaz tokenlarıyla ilgili sorunları hızla belirlemeye yardımcı olur. Sertifika tabanlı kimlik doğrulama kullanıyorsanız sertifika son kullanma tarihlerini düzenli olarak kontrol edin.
Sıkça Sorulan Sorular
APNS, HTTP/2 API için TCP 443 (HTTPS) üzerinden çalışır. Önceden, ikili protokol için 2195 ve 2196 portları kullanılıyordu. Haziran 2020'den itibaren Apple, 443 numaralı portta yalnızca HTTP/2 kullanımını zorunlu kılar. Sunucunuzun api.push.apple.com'a erişimi olduğundan emin olun.
Sandbox, push bildirimlerini hata ayıklamak için APNS test ortamıdır. Production, gerçek kullanıcılar için canlı ortamdır. Token tabanlı kimlik doğrulama ile tek anahtar her iki ortam için de çalışır — bitiş noktası farklıdır: api.sandbox.push.apple.com veya api.push.apple.com.
Push tokenı şu durumlarda değişebilir: uygulamanın yedekten geri yüklenmesi, uygulamanın yeniden yüklenmesi, işletim sistemi güncellemesi, ağ ayarlarının sıfırlanması. App Store üzerinden normal uygulama güncellemeleri sırasında token değişmez. Sunucu, BadDeviceToken (400) hatasını tokenı kaldırma sinyali olarak işlemelidir.
Normal alert/background bildirimleri için 4 KB (4096 bayt). PushKit aracılığıyla VOIP bildirimleri için 5 KB (5120 bayt). Boyutu aşmak PayloadTooLarge (413) hatası döndürür. Yükü minimum tutmanız ve ek verileri sunucu üzerinden yüklemeniz önerilir.
APNS, internet bağlantısı olmayan bir cihaza bildirim gönderemez. Cihaz çevrimdışıysa, APNS en son mesajı (uygulama başına cihaz başına) 28 güne kadar saklar. Bağlantı yeniden kurulduğunda mesaj anında teslim edilir. Daha eski mesajlar korunmaz.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun