Dentii için Apple Watch companion app’i ekledim. iPhone’daki brushing timer’ı Apple Watch’ta da çalışacak, kullanıcı hareket ederken de takip edecek. İşe başlamadan önce “birkaç gün sürer” diye tahmin etmiştim. Gerçekte 3 haftalık bir iş çıktı, çünkü watchOS + iOS companion architecture’ı kendine özgü kurallarla geliyor.
Bu yazıda 5 kritik karar noktasını anlatacağım.
1. Watch app’i standalone mu, companion mu olmalı?
Apple Watch uygulamaları iki modda çalışabiliyor:
Companion: iPhone app’i olmadan çalışmıyor. Data ve auth iPhone’a bağımlı.
Standalone: Independent app, iPhone olmadan da çalışabiliyor. App Store’dan doğrudan Apple Watch’a indirilebilir.
watchOS 7+ standalone default oldu. Ama “gerçekten standalone” olmak için:
– Authentication flow’u watch’ta çalışmalı
– Data storage watch’ta (CloudKit ile sync)
– App Store submission iki ayrı app gibi
Dentii için companion tercih ettim çünkü:
– User ilk olarak iPhone’da onboarding yapıyor
– Data zaten CloudKit’te, iPhone authenticate oluyor
– Watch bağımsız signup gerekmediği için UX daha sade
Karar kriteri: Kullanıcı iPhone olmadan Watch app’i değerli mi bulur? Evet ise standalone. Hayır ise companion.
2. Data sync: WatchConnectivity mi, CloudKit mi?
Watch ve iPhone arasında data sync iki ana yol:
WatchConnectivity framework:
– iOS + watchOS birbirine direkt mesaj gönderiyor
– Bluetooth üzerinden, ikisi de aynı network’te olmasına gerek yok
– Real-time, hızlı
– Ama: iki cihaz da açık ve yakın olmalı
CloudKit:
– Data cloud’a gidiyor, iki cihaz da cloud’dan okuyor
– Offline mümkün (local cache)
– Multiple device’a otomatik yayılıyor
– Ama: biraz gecikmeli, network gerekiyor
En iyi yaklaşım: ikisini karıştır.
Critical real-time data (aktif brushing session) → WatchConnectivity
Persistent data (history, settings) → CloudKit
Böylece kullanıcı watch’ta brushing başlatınca iPhone anında senkron oluyor, ama history iki cihazda da CloudKit üzerinden güncel kalıyor.
3. Watch UI stratejisi: ne kadar feature eklemeli?
Apple Watch ekranı 42mm ila 49mm. Kullanıcı 3-5 saniye bakıyor. iPhone app’indeki her feature’ı watch’a taşımak anti-pattern.
Dentii için watch UI’ı 3 ekrana indirdim:
Ekran 1 (varsayılan): Bugün brushing yapıldı mı? Büyük yeşil veya kırmızı indicator.
Ekran 2: Aktif brushing timer’ı. 2 dakika countdown, haptic feedback.
Ekran 3: Bu haftanın consistency’si. Basit dots grid.
Daha fazla feature iPhone’a bırakıyorum. Watch “quick glance + action” için, derin interaction için değil.
Ne zaman daha zengin watch UI gerekir:
– Fitness app’leri (run tracking, heart rate)
– Meditation (session yürütüyor)
– Payment (Apple Pay entegrasyonu)
– Navigation (hands-free)
Bu senaryolar dışında minimalist kal.
4. Complications ve Lock Screen widget’ları
Apple Watch’ta complications watch face’e entegre edilen mini widget’lar. iOS 16+ ile Lock Screen widget’ları aynı SwiftUI WidgetKit framework’üyle yazılıyor.
Complication tasarımında önemli:
Timeline refresh minimum: watchOS complication’ları günde 50 refresh limit. 30 dakikada bir güncelleme maximum.
Multiple complication style: Modular, circular, utilitarian… her watch face farklı style kullanıyor. En az 3 style support et.
Relevance score: Smart Stack’te hangi complication ne zaman öne çıkacak. Dentii complication’ı akşama doğru relevance artıyor (brushing time).
Benim deneyimimde complication çok az kullanıcı tarafından kuruluyor (watch face’e eklemek için 4-5 tıklama lazım). Ama kuranlar çok engage oluyor. Heavy user’lar için değer.
5. Haptic feedback kullanımı
Apple Watch’un en güçlü özelliği haptic (vibration) feedback. Kullanıcı cihaza bakmadan bilgi alabiliyor.
Dentii brushing timer’ında 30 saniyede bir haptic pulse. Kullanıcı dişini fırçalarken ekrana bakmasına gerek kalmıyor, vibrasyonla “doğru gidiyorum” diye biliyor.
Haptic tipleri (WKHaptic):
– .notification – standard bildirim
– .directionUp, .directionDown – yön
– .success, .failure – sonuç
– .retry – tekrar dene
– .start, .stop – timer akışları
– .click – buton feedback
İyi kullanıldığında screen-less UX mümkün. Yanlış kullanıldığında (çok sık, çok güçlü) irritating.
Kural: her 30 saniyede bir haptic maksimum. Kullanıcı cihazını takmayı istemez olur.
Development ipuçları
Apple Watch development’ı daha önce hiç yapmadıysan:
Simulator kullan. Watch simulator’u slow ama çoğu akış test edilebilir.
Gerçek cihazda test et. Haptic feedback, digital crown, force touch gibi input’ları simulator vermiyor.
Paired development. iPhone + Apple Watch’u birlikte debug et. Xcode’un dual debugger’ı harika.
Battery test et. Watch app battery drain yaratabilir. Background update sıklığı, network call’ları, animation kullanımı dikkatli.
Submission dikkati. Apple Watch app’i iPhone app’iyle aynı App Store submission’da gitse de ayrı review kriterleri var. Watch-only app ise ayrı submission.
Performance noktaları
Apple Watch CPU iPhone’dan çok zayıf:
– Network call’ları minimize et
– Large image’leri Apple Watch’ta load etme
– JSON parsing’i iPhone tarafında yap, watch’a parsed data gönder
– SwiftUI animation’larda 60fps değil, 30fps target
Custom chart veya complex drawing yapmaya kalkarsan watch donuyor. Apple’ın stock UI component’lerine yaslanmak en iyisi.
Sonuç
Apple Watch companion app yazmak iPhone app yazmakla aynı değil. Farklı constraint’ler (ekran, battery, CPU), farklı UX prensipleri (quick glance + action), farklı data sync mimarisi.
Dentii’de 3 haftalık bir iş oldu. Sonraki projelerim için pattern’ler hazır, 1 haftada yapabilirim. İlk defa yapıyorsanız süreyi geniş tutun, Apple’ın sample code’larını inceleyin, küçük başlayın.
Kritik soru: kullanıcı gerçekten Apple Watch app’i kullanacak mı, yoksa sadece “completeness” için mi ekliyoruz? Eğer ikincisiyse, zaman kaybı.