Backend kurma, SDK entegre etme, API key yönetme — bunların hiçbiri olmadan uygulamanın her indirmesinde ve satın alımında anında bildirim alabilirsin. Bu rehberde ntfy.sh'i iOS uygulamasına nasıl entegre edeceğini adım adım anlatıyorum.
ntfy nedir?
ntfy (notify), açık kaynaklı ve ücretsiz bir HTTP tabanlı bildirim servisidir. Bir URL'e POST isteği atarak telefonuna anlık bildirim gönderebilirsin.
Neden ntfy?
• SDK yok — standart URLSession yeterli
• Kullanıcı verisi gönderilmiyor
• Uygulama içinde tamamen gizli çalışıyor
• Ücretsiz, hesap gerektirmiyor
• Apple App Store kurallarıyla uyumlu (anonim, kişisel veri yok)
ntfy.sh/KANAL_ADI formatında çalışıyor. Kanal adın senin "şifren" — tahmin edilemez bir isim seç.
Kanal adını tahmin edilemez yap — UUID veya rastgele karakterler kullan.
Kanal adın herkese açık. Kolayca tahmin edilebilirse başkaları da abone olabilir. "myapp-installs" gibi basit isimler kullanma.
2
NtfyService.swift dosyasını oluştur
Projeye yeni bir Swift dosyası ekle:
import Foundation
// MARK: - Ntfy ServiceactorNtfyService {
static let shared = NtfyService()
private init() {}
private let installTopic = "myapp-install-x7k2p9"private let premiumTopic = "myapp-premium-n5x8j4"func onboardingStarted() async {
await send(topic: installTopic, message: "Yeni kullanıcı")
}
func premiumPurchased() async {
await send(topic: premiumTopic, message: "Yeni satın alım")
}
private func send(topic: String, message: String) async {
guard let url = URL(string: "https://ntfy.sh/\(topic)")
else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = message.data(using: .utf8)
request.timeoutInterval = 5
do {
let (_, response) = try awaitURLSession.shared.data(for: request)
#if DEBUGlet status = (response as? HTTPURLResponse)?.statusCode ?? 0
print("[Ntfy] \(topic) → \(status)")
#endif
} catch {
// Sessizce başarısız ol — kullanıcıyı etkilemez
}
}
}
actor kullanmak Swift 6 uyumluluğu sağlar ve thread safety garantiler. NSLock veya DispatchQueue gerekmez.
3
Onboarding'e ekle
Kullanıcının ilk "Devam" tuşuna bastığı yere ekle:
// İlk sayfadan geçişte tetikle (page 0 → 1)if currentPage == 0 {
Task { awaitNtfyService.shared.onboardingStarted() }
}
// Normal sayfa geçişi devam eder
currentPage += 1
İlk sayfada tetikle — son sayfada değil. Kullanıcı onboarding'i yarıda bıraksa bile indirme sayılır.
4
Satın almaya ekle
StoreKit 2 ile yapılan satın almalar Transaction.updates listener'ından geçer. Buna eklemek, normal satın alma, promosyon kodu ve restore dahil tüm senaryoları yakalar:
private func listenForTransactions() {
Task.detached {
for await result inTransaction.updates {
if case .verified(let transaction) = result {
await transaction.finish()
await self.checkEntitlements()
// Ntfy bildirimiTask { awaitNtfyService.shared.premiumPurchased() }
}
}
}
}
purchase() fonksiyonuna değil, Transaction.updates'e ekle. Böylece App Store üzerinden gelen tüm işlemler yakalanır — uygulama kapalıyken yapılan işlemler bile.
Aynı anda telefonundaki ntfy uygulamasında bildirim gelecek.
200 aldın ama bildirim gelmediyse:
• ntfy uygulamasında kanal adını kontrol et
• Bildirim izinlerini kontrol et
• Kanaldan çık ve tekrar abone ol
Apple App Store uyumu
Bu yaklaşım Apple kurallarıyla uyumlu mu?
Evet — şu koşullar sağlandığında:
• Kişisel veri gönderilmiyor: "Yeni kullanıcı" gibi sabit bir metin gönderiyorsun — cihaz ID, IP, kullanıcı bilgisi yok
• Kullanıcı fark etmiyor: Arka planda sessizce çalışıyor, kullanıcı deneyimini etkilemiyor
• Analitik değil, kendi bildirimin: Veriler üçüncü taraflarla paylaşılmıyor
Apple Guideline 5.1.2 kullanıcı verisini izlemeyi kısıtlar. Anonim sinyal göndermek bu kapsama girmiyor.
PrivacyInfo.xcprivacy'de bu HTTP isteğini beyan etmen gerekmiyor — kullanıcıya ait hiçbir veri işlenmiyor.
Sınırlar
Ücretsiz planda ne kadar kullanabilirsin?
ntfy.sh ücretsiz planda burst olarak 60 mesaj, sonrasında her 5 saniyede 1 mesaj gönderebilirsin. Bu, günde yüzlerce indirme anlamına gelir — büyük çoğunluk için yeterli.
Limitin üstüne çıkarsan: Uygulama sessizce başarısız olur, kullanıcı etkilenmez. Sadece o bildirim gelmiyor.
Daha yüksek limit gerekirse ntfy.sh ücretli plan (~$5/ay) veya kendi sunucunda ntfy kurabilirsin.