‹ Rehberler

Sunucu Olmadan İndirme ve Satın Alma Takibi

iOS Geliştirme · Nisan 2026

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ç.

Kurulum

1
ntfy uygulamasını indir
App Store'dan "ntfy" ara, ücretsiz uygulamayı indir.

Uygulamayı açınca "+" butonuna bas, kanalına abone ol. Örnek kanal adları:

myapp-install-x7k2p9 (indirme bildirimleri için)
myapp-premium-n5x8j4 (satın alma bildirimleri için)

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 Service actor NtfyService { 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 await URLSession.shared.data(for: request) #if DEBUG let 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 { await NtfyService.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 in Transaction.updates { if case .verified(let transaction) = result { await transaction.finish() await self.checkEntitlements() // Ntfy bildirimi Task { await NtfyService.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.

Test

Simülatörde test et
Simülatörde uygulamayı çalıştır, onboarding'in ilk sayfasında "Devam"a bas. Xcode konsolunda şunu görmelisin:

[Ntfy] myapp-install-x7k2p9 → 200

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.