Teklif al
Mobil

Nightproof — Kesintiden sonra çalmayı sürdüren uyku sesi uygulaması

Algoriel'in kendi iPhone uygulaması. Gürültü maskeleme sesini telefonda koddan üretiyor; çağrı, alarm ya da kulaklık kopmasından sonra çalmayı sürdürüyor ve sabah gecenin kaydını gösteriyor. Tek seferlik satın almayı, PHP ile yazdığımız sunucu Apple imzasıyla ikinci kez doğruluyor.

Kategori Mobil
Müşteri Algoriel ürünü
Hizmetler Mobil Uygulama, Sistem Mimarisi
Yıl 2026
Durum App Store incelemesinde
Rol Tasarım & Geliştirme

Bağlam

Uykuya dalmak için arka plan sesi açan biri, ses gece ortasında bir çağrı, alarm ya da AirPods kopması yüzünden kesildiğinde bunu ancak sabah fark ediyor. Sesin ne zaman ve neden durduğunu gösteren bir kayıt da olmuyor.

Nightproof’u kendi ürünümüz olarak bu boşluğa göre yazdık ve sesin gece boyu sürmesini yan etki değil, uygulamanın asıl sözü saydık. Satın almayı doğrulamak için yanına küçük bir PHP sunucusu kurduk. Arayüz İngilizce, temel pazar ABD. Uygulama şu an App Store incelemesinde.

Genel çalışma biçimimiz

Planlama

İşin bugün nasıl yürüdüğünü ve yazılımdan ne beklediğinizi konuşuyoruz; kapsam buradan çıkıyor.

Mimari

Sistemin hangi parçalardan kurulacağına ve bilginin nerede tutulacağına karar veriyoruz.

Modelleme

Ekranları ve akışı kod yazmadan önce çiziyoruz; onayınızdan sonra geliştirmeye geçiyoruz.

Geliştirme

Yazılımı, başka bir ekibin de sürdürebileceği düzende yazıp teslim ediyoruz.

Sürecimizi gör →

Ne inşa ettik

  • Koddan üretilen yedi ses dokusu

    Beyaz, pembe, kahverengi ve gri gürültü, alçak uğultu, vantilatör ve hışırtı. Her katmanı kendi AVAudioSourceNode'u üretiyor; render bloğu bellek ayırmıyor, kilit almıyor.

  • Kesintiyi izleyen denetleyici

    Denetleyici dört sistem bildirimini dinliyor: kesinti, rota değişimi, ses servislerinin sıfırlanması, motor yapılandırması. Kulaklık kopunca hoparlöre geçmeyi ya da durmayı kullanıcı seçiyor.

  • Donanımsız test edilen kurtarma

    Her giriş noktası saati parametre olarak alıyor, ses donanımı bir protokolün arkasında duruyor. Kesinti, rota değişimi ve takılmayı gerçek donanım ve saat olmadan test ettik.

  • Telefonda kalan gece kaydı

    Uygulama her geceyi on beş olay türüyle SwiftData'ya yazıyor. Çalma süresini kesintileri düşerek, çalınan bölümlerin toplamından hesaplıyor. Kayıt telefondan hiç çıkmıyor.

  • Satın almayı ikinci kez doğrulayan PHP sunucusu

    Sunucu Apple'ın JWS zincirini, SHA-256 ile sabitlenmiş Apple Root CA G3'e karşı doğruluyor. Sertifika geçerliliğine imza tarihinde bakıyor, Xcode test işlemlerini her durumda reddediyor.

  • Sunucu düşse de açık kalan hak

    StoreKit cihazda doğruluyor, sunucu ikinci kez bakıyor. Sunucuya ulaşılamazsa ödeyen kullanıcı kilitlenmiyor; sunucu işlemi reddederse ya da iade bildirimi gelirse hak kalkıyor.

Nasıl geliştirdik

  • Swift
  • SwiftUI
  • Observation
  • SwiftData
  • Swift Concurrency
  • AVFoundation (AVAudioEngine, AVAudioSourceNode, AVAudioSession)
  • StoreKit 2
  • MediaPlayer
  • Security (Keychain)
  • PHP 8.3
  • php-jwt
  • PDO
  • SQLite
  • MySQL 8 / MariaDB
  • PHPUnit

Zorluk ve sonuç

Her satır bir çift: solda işin çözmesi gereken zorluk, sağda sistemin buna verdiği karşılık.
Zorluk Sonuç
Döngüyle çalan bir ses kaydı, gece boyunca her tekrarda aynı noktadan yeniden başlıyor Ses telefonda örnek örnek koddan üretiliyor; uygulamada tek bir ses dosyası yok
Bir çağrı, alarm ya da kulaklık kopması iOS'ta çalan sesi araya girip durduruyor Kesinti bitince ses dönüyor; kulaklık koparsa aynı karışım iPhone hoparlöründen sürüyor
Motor iOS'tan bir gerekçe gelmeden takılabiliyor ve bu sessizlik hiçbir yerde iz bırakmıyor Takılan motoru uygulama en fazla üç kez yeniden başlatıyor, olmazsa durduğu saati kaydediyor
PHP için resmî bir App Store sunucu kütüphanesi yok; satın almayı sunucu kendisi doğrulamak zorunda Sunucu Apple imzasını sabitli kök sertifikaya karşı doğruluyor; iade bildirimi hakkı geri alıyor

Nightproof hakkında bir sorunuz mu var?

Nightproof App Store incelemesinde; onay gelmeden indirilemiyor. Ürün hakkındaki sorunuzu bize yazabilirsiniz.