İçeriğe atla
megapromotingHadi konuşalım

Uzmanlık · Mobil uygulamalar

Telefon için uygulamalar, mantığın telefonsuz doğrulanabilmesi için böyle inşa edilir.

Swift ile, sensörler ve HealthKit içeren yerel iOS uygulamaları ve proje sensör gerektirmediğinde iOS, Android ve web için tek kodlu uygulamalar kuruyoruz. Mantık çekirdeği ekrandan ayrı test edilir.

Zaten kurduklarımızSunt trei implementări proprii, nu una. Un depozit cu cinci ținte de aplicație (patru iOS și una macOS) definite în `project.yml`, ale cărui teste de logică le-am rulat azi: 160 din 160 trec. O a doua aplicație iOS, în alt proiect, cu 40 de fișiere Swift și HealthKit. Și o a treia direcție, cu un singur cod pentru iOS, Android și web, a cărei variantă web răspunde astăzi. Rezerva care schimbă răspunsul la întrebarea pe care o pune orice cumpărător înainte de toate: niciuna dintre aplicațiile noastre nu este publicată în App Store sau Google Play. Motivul e unul singur și are nume — `DEVELOPMENT_TEAM` este gol în configurația de proiect, adică lipsește identificatorul de echipă din Apple Developer Program. Mașina are o identitate de semnare validă, suficientă pentru instalare pe dispozitiv propriu, insuficientă pentru distribuție în magazin. E o problemă de cont, nu de cod, dar rămâne o problemă și o scriem aici, nu la subsol.

Bir mobil uygulamanın farklı şekilde bozulan iki parçası vardır. Sensörleri okuyan ve bir açı, bir skor, bir durum gibi bir şey hesaplayan parça ile ekranları çizen parça. Onları ayrı tutuyoruz ve bu estetik nedenlerle değil: ana iOS depomuzda çekirdek dosyalar arayüzü içe aktarmaz, bu yüzden doğrudan Mac üzerinde `swiftc` ile derlenebilir ve sıradan bir program gibi, simülatör olmadan ve telefon olmadan çalıştırılabilir. Paket 16 aşamada gruplandırılmış 160 doğrulamadan oluşur; bugün çalıştırdık ve eksiksiz geçiyor. Bu, bir algoritmanın tam olarak ne yaptığını söyleyebilmemizin, “iyi çalışıyor” demek yerine bunu söyleyebilmemizin nedenidir.

iOS’ta Swift 6 ile, asgari hedef olarak iOS 17 kullanıyoruz. Aynı depo, beş uygulamayı ayrı hedefler olarak tanımlar: dördü iPhone için ve biri macOS için; macOS sürümü, iOS çekirdeğinin on beş dosyasını kopyalamadan yeniden kullanır. Sensörler kaynağında okunur: kulaklıklardaki sensörler için Apple arayüzü baş yönelimini sunar ve uygulama mevcut açıyı, kullanıcının oturumun başında kalibre ettiği bir konumla karşılaştırır. Eşikler “iç ayarlar” değildir: 7° altında düz, 7° ile 13° arasında kayma, 13° üstünde üç saniye tutulursa alarmı tetikler ve yumuşatma, 0,15 katsayılı üstel ortalama kullanır. Dört değerin tümü art arda dört kod satırında yer alır ve gösterilebilir.

Proje sensörlere ihtiyaç duymadığında, yerel çözümü önermiyoruz. Portföydeki üçüncü yön, iPhone, Android ve tarayıcı için derlenen tek bir koddur — React Native with Expo — ve web sürümü de yayınlanmış ve bugün yanıt veriyor. Müşteri için pratik fark şudur: bir anket, bir hesaplayıcı veya bir kontrol paneli iki ekibi ve iki depoyu haklı çıkarmaz; saniyede yirmi örnekle bir sensörü dinleyen bir uygulama ise, evet.

Henüz yapamadıklarımız. Uygulamalarımızın hiçbiri App Store veya Google Play’de değil. Bunun nedeni derlenmemeleri değil — derleniyorlar, simulator’a kuruluyorlar ve testleri geçiyorlar — ama proje yapılandırmasında Apple ekip kimliği boş; yani bu build’lere bağlı bir Apple Developer Program kaydı yok. Mac’te geçerli, geliştirme türünde bir imza kimliği vardır; bu, kendi cihazına kurulum için yeterlidir, mağaza için yetmez. Bir müşteri projesinde geliştirici hesabı müşteri şirketi adına açılır ve onun olarak kalır — başta konuşulması gereken konu budur, sonda değil.

Neleri kapsıyor

Çalışma, bileşenlerine ayrılmış hâliyle

Sensörü aracı bir kütüphane üzerinden değil, kaynağından okuyoruz

iOS’ta doğrudan Apple arayüzlerini kullanıyoruz: kulaklıktaki baş yönelimi için `CMHeadphoneMotionManager`, bağlanma ve bağlantı kesme için delegat ve akışı başlatmadan önce yetkilendirme durumunun açık kontrolü. Sensör kullanılabilir değilse, durum sessiz hata yerine `waiting`’e geçer.

Mantık çekirdeği bir ekranın varlığını bilmez

Analiz, kalibrasyon, geçmiş ve politikalar dosyaları sade Swift’tir. Bunlar, test dosyasıyla birlikte `swiftc` ile derlenir ve komut satırı ikilisi olarak çalıştırılır. Bugünün sonucu: 160 doğrulama, 16 aşama x 10, hepsi geçti. Mac’te iki saniyede çalışan bir test her değişiklikte çalıştırılır; simulator isteyen bir test ise hayır.

Arayüz, çekirdeğin üzerine hem iOS’ta hem macOS’ta aynı anda kurulur

İkisi için de SwiftUI. Aynı depodaki macOS hedefi, iOS çekirdeğindeki on beş dosyayı kopyalanmış dosyalar olarak değil, ortak kaynaklar olarak içerir; dolayısıyla algoritmadaki bir düzeltme aynı anda iki uygulamaya da ulaşır.

Doğru seçim buysa, iOS, Android ve web için tek bir kod

Tarayıcı sürümü için `react-native-web` ile Expo, paketten yüklenen fontlar ve Android için sistemin istediği monokrom sürüm dâhil ayrı uygulama simgeleri. Aynı uygulama telefonda ve sayfada, tek bir depodan çalışır.

Sağlık verileri: her veri türü için beyan edilmiş bir politika

HealthKit’i “okumuyoruz”; kodda bir tablo kullanıyoruz: on bir veri türü (postür açıları, kulaklıklardan kaba hareket, nabız ve değişkenlik, uyku, yürüme, ses maruziyeti, yönlendirilmiş oturumlar ve diğerleri) ve beş olası rejim (yalnızca yerel, HealthKit’ten okuma, antrenman yazma, gevşeme oturumu yazma, rota yazma). Her tür açıkça rejimlerden birini alır. Portföydeki ikinci iOS uygulaması, özel bir projede, aynı yaklaşımı 40 Swift dosyasında kullanır.

Apple’ın istediği gizlilik dosyaları, en baştan mevcut

Dört hedefte `PrivacyInfo.xcprivacy`, ilk reddedilişte aceleyle eklenmiş değil, derleme kaynağı olarak dahil edilmiştir. Hareket, kamera, mikrofon, HealthKit ve bildirimler için kullanım açıklamaları, otomatik üretilmiş değil, proje yapılandırmasında Rumence yazılmıştır.

Telefondan çıkan: referans iOS uygulaması durumunda, hiçbir şey

iOS hedefinin kaynaklarında `URLSession` araması sıfır sonuç döndürür. Geçmiş, cihazda `FileManager` ve `UserDefaults` ile, dosyayı silme seçeneğiyle yazılır. Depodaki tek ağ kodu, macOS uygulamasının ayrı bir dosyadaki bir fonksiyonundadır. Bir uygulamanın sunucuya ihtiyacı yoksa, ona bir tane eklemeyiz.

Başlangıç süreci, ekran olarak değil durum olarak test edildi

Onboarding 24 adımdan oluşur; bunların benzersiz ve sıralı tanımlayıcıları vardır ve bazı adımlar açık bir onay ister (sensör sınırı, ön planda çalışma, gizlilik, hazırlık); bunlar olmadan devam düğmesi kilitli kalır. Durum kodlanır ve yeniden alınır. 160 testin on tanesi tam olarak bunu doğrular.

İmza ve dağıtım, en başta söylenmiş

Hangi geliştirici hesabının mevcut olduğunu, hangi şirkette olduğunu, onu kimin yönettiğini ve mağaza için build’in imzalanabilmesi için neyin eksik olduğunu kontrol ediyoruz. Kısa ve sıkıcı bir listedir, ama telefonumuzda çalışan bir uygulama ile kullanıcılara ulaşan bir uygulama arasındaki fark budur.

Nasıl görünüyor

Süreç, adım adım.

01

Yerel mi yoksa ortak kod mu olacağına sensörlere göre karar veririz

Soru zevk meselesi değil, donanım meselesidir: uygulamanın harekete, sağlığa, Bluetooth’a, gerçek zamanlı kameraya, arka plana ihtiyacı var mı? Eğer evet ise, yerel. Formlar, hesaplamalar, listeler ve bir gösterge panelinden söz ediyorsak, iOS, Android ve web için tek bir kod aynı işi yarı bakım maliyetiyle yapar. Kararı, gerekçesiyle birlikte yazılı olarak teslim ediyoruz.

02

Ekranlardan önce çekirdeği inşa ediyoruz ve onu telefonsuz çalışan testlerle kapsıyoruz

Algoritma, eşikler, durumlar ve kalıcılık. Testler doğrudan Mac üzerinde derlenir ve birkaç saniyede çalıştırılır. Kalite vaadini değil, paketi ve sonucunu teslim ediyoruz.

03

Arayüzü çekirdeğin üzerine yerleştirip simülatörde ve cihazda çalıştırıyoruz

iOS ve macOS’ta SwiftUI, ya da ortak kodu seçtiğimizde React Native. Başlangıç sürecini, izinleri ve sensör eksik olduğunda ya da oturumun ortasında bağlantı koptuğunda davranışı kontrol ediyoruz — pratikte sık bozulan durum.

04

Dağıtımı, müşteri hesabıyla hazırlıyoruz

Paket tanımlayıcısı, sürüm, simgeler, gizlilik dosyası, izin açıklamaları, Apple Developer Program’daki ekip tanımlayıcısı. Hesabı en başta konuşmamış projeler burada takılır — bizimkiler de dahil; bu da tam olarak bu adımı kâğıda dökmemizin nedenidir.

Ce vede utilizatorulAplicațiaRețea și securitateGăzduire și dateFIECARE STRAT, ALES ȘI EXPLICAT
Patru straturi, de jos în sus: senzorii platformei (mișcare din căști, HealthKit, notificări); nucleul de logică în Swift simplu, care nu importă interfața și de aceea poate fi rulat pe Mac fără telefon; interfața SwiftUI, aceeași pentru iPhone și macOS; și stratul de distribuție — fișier de confidențialitate, permisiuni declarate, semnare. Ultimul strat e singurul pe care nu l-am parcurs până la capăt, și de aceea e desenat deschis.

Veriler

Neye dokunuyoruz, nerede duruyorlar ve ne kadar kalıyorlar

Veri koruma sorumlusu olan herkesin soracağı sorular — o sormadan önce burada sorulmuş hâliyle.

Uygulamanın sunucusu yoksa veriler nerede durur
Cihazda. Postür geçmişi, `FileManager` aracılığıyla kendi dosyasına serileştirilir; tercihler ise uygulama önekli anahtarlarla `UserDefaults` içine kaydedilir. Geçmiş dosyasını silme komutu vardır. Uygulamada ağ kodu bulunmadığı için hiçbir şey bir sunucuya gönderilmez.
Sağlık verileri yalnızca onayla ve yalnızca beyan edilenler okunur
HealthKit, kullanıcı onayını veri türü düzeyinde ister ve uygulama bunları neden istediğini yapılandırmada belirtir. Kod içindeki politika, Sağlık’a neyin okunduğunu ve neyin geri yazıldığını açıkça ayırır. Teşhis yapılmaz ve bize hiçbir şey aktarılmaz.
Apple’ın, verilerle ne yaparsanız yapın, neyi beyan etmenizi istediği
Uygulamanın gizlilik dosyası ve her izin için kullanım açıklamaları (hareket, kamera, mikrofon, sağlık, bildirimler). Bunlar mağazada kabul edilme koşuludur, seçenek değildir ve kullanıcının konuştuğu dilde yazılır.
Ne kadar saklandığı
Veriler telefonda durduğunda, kullanıcı ne karar verirse o kadar: uygulamanın kaldırılması verileri de götürür, uygulama içinden silme ise açık bir işlemdir. Bir projede yine de sunucu varsa, saklama süresi ilk kod satırından önce sözleşmeye yazılır; çünkü neyin yapılabileceğini ve neyin yapılamayacağını belirler.
Geliştirici hesabı ve imzalama anahtarları
Müşterinin şirketinde, müşterinin şirketine ait kalır. Biz devredilmiş erişimle çalışırız. Nedeni ilkesel değil, pratiktir: sağlayıcının hesabında yayınlanan bir uygulama, sağlayıcı değiştiği gün taşınamaz hale gelir.

Bir vaka

Tek bir şeyi ölçen ve bunu doğrulanabilir biçimde ölçen bir iPhone uygulaması

Durum

Bir müşteri projesi değil, bize ait bir proje: kullanıcının oturum başında kalibre ettiği bir konuma göre başının ne kadar eğildiğini izleyen bir odak kronometresi. Algoritma hakkındaki iddiaların anlatılmak yerine gösterilebildiği bir vaka gerekiyordu.

Ne kurduk

Çekirdeği arayüzden ayırdım ve eşikleri dokümantasyonda değil kodda yazdım: 7° altı dik, 7° ile 13° arası kayma, 13° üstü üç saniye tutulduğunda haptik uyarıyı tetikler; 0,15 katsayısıyla üstel yumuşatma kullanılır. Veriler, Apple’ın kulaklıklardaki sensörler için olan arayüzünden gelir ve bağlantı kesilmesi açık biçimde ele alınır. Onboarding 24 adımdır; bunlardan dördü, kullanıcının devam etmesine izin vermeden önce sınırların onaylanmasını ister. Aynı çekirdekle bir macOS sürümü de oluşturdum.

Ne çıktı

Mantık paketi `swiftc` ile derlenir ve Mac’te birkaç saniyede çalışır: 16 aşamada 160 doğrulama, son çalıştırmada hepsi geçti. Uygulama simülatöre yüklenir ve başlar. Yukarıdaki paragraftaki herhangi bir ifade, dört satır kod açılarak doğrulanabilir.

Vakanın söylemedikleri

App Store’da değildir. Proje yapılandırmasında Apple ekip kimliği alanı boştur; bu yüzden build dağıtım için imzalanamaz — Apple programına kayıt olmama durumu, işlev eksikliği değil. Ve ürünün, kodun değil, bir diğer sınırı: baş eğimini ölçer, omurga sağlığını değil; Apple arayüzü üzerinden hareket sensörlerini sunan kulaklıklarla çalışır.

Sorular

İnsanların aramadan önce bize sordukları

App Store’da yayınlanmış bir uygulamanız var mı, görebileyim diye?

Hayır. Uygulamalarımızın hiçbiri App Store’da ya da Google Play’de değil ve bunu ilk önce sormanız doğru. Gösterebileceğimiz şey: aynı projede tanımlı beş uygulama hedefi; bunların dördü iPhone için, biri macOS için; bunlar derlenir ve simülatöre yüklenir; ayrıca isteğiniz üzerine karşınızda çalıştırılan 160 doğrulamalı mantık paketi. Yayınlama engeli, proje yapılandırmasında `DEVELOPMENT_TEAM` alanının boş olmasıdır; yani Apple Developer Program içinde bir ekip kimliğinin olmaması. Mac’te geçerli bir geliştirme imzalama kimliği vardır — kendi cihazınıza kurulum için yeterlidir, mağaza için değil.

O halde bir uygulamayı mağazaya kadar götürebildiğinizi nereden bileyim?

Bir yayınlama kanıtı istiyorsanız, hiçbir yerden — böyle bir kanıtımız yok ve uydurmuyoruz. Doğrulayabileceğiniz şey zincirin geri kalanıdır: derlenen kod, geçen testler, mevcut gizlilik dosyaları, beyan edilmiş izinler, yapılandırılmış simgeler ve sürümler. Eksik olan adım, uygulamanın sahibi şirket adına yapılmış ücretli bir Apple programı kaydıdır. Bir müşteri projesinde bu hesap müşterinindir ve en başta açılır; tam da sonunda birini şaşırtan adım olmasın diye.

iOS ve Android için yerel mi yoksa tek uygulama mı?

Sensörlere bağlı. Uygulama hareketi, sağlığı, Bluetooth’u veya kamerayı gerçek zamanlı okuyorsa, yerel — o arayüzler platforma aittir ve herhangi bir ara katman gecikme ile yeni arıza yolları ekler. Uygulama esasen formlar, hesaplamalar ve sonuç ekranlarından oluşuyorsa, tek bir kod iOS, Android ve tarayıcıyı tek bir depodan kapsar. Portföyümüzde her iki seçenek de var ve bunları varsayılan olarak değil, yazılı gerekçeyle seçiyoruz.

Android uygulamaları da yapıyor musunuz?

Ortak kodla, evet: aynı Expo projesi Android için build üretir; sistemin istediği uyarlanabilir ikon ve tek renkli sürüm önceden yapılandırılmıştır. Kotlin ile yerel Android, portföyümüzde yok — bir proje bunu gerektiriyorsa, imzadan sonra değil, önce söylüyoruz.

Telefonum olmadan mantığın doğru olduğunu nasıl doğruluyorsunuz?

Çünkü çekirdek ekrana bağlı değildir. Analiz dosyaları ayrı derlenir, Swift derleyicisiyle derlenir ve Mac üzerinde program olarak çalıştırılır. Mevcut paket 16 aşamada 160 doğrulamaya sahiptir ve birkaç saniye içinde çalışır. Böyle doğrulanamayan şeyler — bir titreşimin nasıl hissettirdiği, belirli bir telefonda bir ekranın nasıl göründüğü, bir kulaktan çıktığında kulaklığın nasıl davrandığı — cihaz üzerinde test edilir ve hangisinin hangisi olduğu söylenir.

Uygulama Sağlık’tan verilerimi okuyabilir mi?

Yalnızca Apple ekranında tip tip onaylarsanız ve yalnızca beyan edilenleri. Kodda politika her veri türü için açıkça tanımlıdır: bazıları yalnızca telefonda kalır, bazıları HealthKit’ten okunur, bazıları ise antrenman ya da gevşeme oturumu olarak geri yazılabilir. Teşhis yapılmaz ve veriler bize ulaşmaz.

Uygulamanın sunucusu yoksa veriler ne olur?

Telefonda kalır. Portföyümüzdeki referans iOS uygulamasında hiçbir ağ çağrısı yok — o hedefin kaynaklarında `URLSession` araması sıfır sonuç döndürür. Geçmiş yerel bir dosyaya yazılır ve uygulamadan silinebilir. Bir proje sunucu gerektiriyorsa, onu kurarız, ama bunu refleks olarak koymayız.

Başka biri tarafından yapılmış mevcut bir uygulamayı devralabilir miyiz?

Teklifle değil, uyumluluk kontrolüyle başlar: hangi platform sürümünü hedeflediği, hangi bağımlılıkları olduğu ve hangilerinin hâlâ bakımda olduğu, build’in temiz bir makinede yeniden üretilebilip üretilemediği, geliştirici hesabını ve anahtarları kimin tuttuğu. Bazı projelerde dürüst cevap, çekirdeği yeniden yazmanın onu sürdürmekten daha az maliyetli olduğudur.

Masaüstü uygulamaları da yapıyor musunuz?

macOS için evet ve aynı çekirdekten: ana depomuzda macOS hedefi, iPhone uygulamasındaki mantık dosyalarının on beşini ortak kaynaklar olarak yeniden kullanır. Windows portföyde yoktur.

Yukarıdaki iddialar neye dayanıyor (11 kaynak)
  1. Varianta web a aplicației cu cod comun răspunde azihttps://longevita-alpha.vercel.app/ · 2026-09-06

Bunlardan 10 tanesi depolarımızdaki kod ve dosyalardır. Adlarını ya da satırlarını yayımlamıyoruz: hepsi bir arada, tek bir sayfada, yalnızca bize ait olmayan sistemlerin nasıl kurulduğunu fazla net anlatırdı. İstek üzerine, depoda sizinle birlikte gözden geçiriyoruz — doğrulama hâlâ mümkün, sadece bir görüşme içinde yapılıyor.

Neyin daha iyi çalışmasını isterdiniz?

Bize sürecinizi anlatın. Neyin kurulmaya değer olduğuna, neyi bağlayabileceğimize ve sonucu nasıl doğrulayacağımıza birlikte karar verelim.

Hadi konuşalım