PureGym’in gayriresmî Apple Wallet geliştiricisi nasıl oldum
(drobinin.com)- PureGym uygulamasının yavaş kullanımını ve karmaşık giriş sürecinin yarattığı rahatsızlığı çözmek için, bunu kişisel olarak Apple Wallet için optimize etti
- Mevcut QR kodu, her seferinde uygulamayı açıp bilgileri yüklemeyi gerektiren ve yaklaşık 47 saniye süren verimsiz bir giriş yöntemi
- Çeşitli reverse engineering çalışmaları, mitmproxy kullanımı ve PassKit framework’ü gibi teknik süreçler üzerinden otomatik yenilenebilen bir Wallet geçiş kartı hayata geçirildi
- Bu süreçte PIN kodundaki güvenlik açıkları, API kimlik doğrulama yapısı ve şube konum bilgileri gibi PureGym’in internette görülebilen iç işleyişi ortaya çıkarıldı
- Sonuçta 3 saniyede giriş sağlayan bir kullanıcı deneyimi oluşturuldu ve bunun yalnızca kişisel bir deney olduğu, resmî bir hizmet olmadığı açıkça belirtildi
47 saniye: rahatsızlığın başlangıcı
- Hafta içi saat 11:15’te, PureGym girişinde uygulamayı açmak 47 saniye sürdü
- Sinyal zayıftı; Wi‑Fi’a bağlanma, uygulamayı başlatma, çeşitli push bildirimlerini ve özel indirim tekliflerini geçme gibi adımlardan sonra QR kodu göründü
- QR kodunun gerçekten görünmesi uzun sürüyor ve insan diğer üyelerin bakışlarından rahatsız oluyor
- Haftada 6 kez tekrarlandığında, bu verimsiz deneyim her hafta 282 saniye kaybettiriyor
- Amazon Fresh gibi sürtünmesiz deneyimlerle kıyaslandığında, PureGym’in giriş UX’i oldukça geride kalıyor
8 yıllık PIN gizemi
- Yazar, 8 haneli PIN kodunu 8 yıldır hiç değiştirmeden kullanıyor
- Bu PIN ne süresi doluyor ne de değişiyor
- Buna karşılık, uygulama içindeki QR kodu her 1 dakikada bir yeni bir değerle değişiyor
- Gerçek güvenlik seviyesi ile fiilî uygulama arasında büyük bir çelişki var
- PIN yöntemi aşırı uzun süre korunurken yalnızca QR kodunun sıkı biçimde korunması bir tür "güvenlik gösterisi" etkisi yaratıyor
mitmproxy ile PureGym’i anlamak
- İlk başta QR kodunun ekran görüntüsünü Apple Wallet’a koyup kullanmayı denedi, ancak bu hemen işe yaramadı
- PureGym’in QR kodu dinamik olarak üretiliyor, yaklaşık 1 hafta içinde süresi doluyor ama uygulamada her 1 dakikada bir yenileniyor
- GitHub’da "PureGym" ile ilgili depolar aranarak API kimlik doğrulama yapısı bulundu
- Giriş için kullanılan 8 haneli PIN, API parolası olarak da aynı şekilde kullanılıyor
- Base64 ile kodlanmış temel kimlik doğrulama bilgileri de zayıf güvenlik sunuyor
- Uygulama trafiğini analiz etmek için mitmproxy gibi proxy araçlarıyla istekler yakalandı
- QR kodunun JSON yapısı part1 (sabit id), part2 (timestamp), part3 (yenileme için salt) bölümlerinden oluşuyor
- API, yenileme zamanlamasından sona erme koşullarına kadar her şeyi bildiriyor
PassKit: Apple Wallet’ın potansiyeli
- Apple Wallet pass’leri statik kartlar değil; kendi kendini yenileyebilen, push bildirimi alabilen ve konuma tepki verebilen mini uygulama yapıları
- PassKit uygulaması için JSON spesifikasyonu, görsel kaynaklar, sertifika imzası ve gerçek zamanlı yenileme için web servisleri gerekiyor
- Apple geliştirici portalından Pass Type ID ve WWDR sertifikası alınması şart
- Sertifika imzalama ve yönetimi zahmetli olsa da, başarıldığında gerçek cihazda akıcı bir deneyim sağlanabiliyor
Swift backend kurulumu
- Genelde Node.js kullanılsa da, yazar PassKit web servislerini doğrudan Swift tabanlı Vapor ile geliştirdi
- Pass güncellenmesi gerektiğinde, silent push ile otomatik güncelleme sağlanıyor
- Kullanıcının fark etmediği doğal bir pass yenileme deneyimi gerçekleştiriliyor
Ülke çapındaki PureGym konumlarını otomatikleştirme
- Apple Wallet pass’leri belirlenen konumlarda otomatik olarak gösterilebiliyor
- PureGym’in resmî sitesinde ayrıntılı koordinatlar yoktu, ancak API üzerinden ülke genelindeki şubelerin koordinat listesi alındı
- Tüm şube koordinatları parse edilerek her pass için en yakın şube atandı
- Dezavantajı şu: PureGym bir alışveriş merkezinin içindeyse, sadece alışverişe gidildiğinde bile pass’in görünmesi gibi küçük bir rahatsızlık oluşabiliyor
Apple Watch entegrasyonu
- Apple Wallet pass’leri ek bir işlem olmadan Apple Watch ile otomatik senkronize oluyor
- Bilekten iki kez tıklayıp taratmak ve içeri girmek artık sadece 3 saniye sürüyor
- Zamanın %93’ünden fazlası tasarruf edilmiş oldu
Rakamlarla değişim
- Eski PureGym uygulamasıyla giriş süresi: 47 saniye
- Apple Wallet pass’iyle giriş süresi: 3 saniye
- Haftalık ortalama kazanılan zaman: 4,4 dakika (yılda 3,8 saat)
- Yakındaki üyeler 23 kez "Böyle bir uygulama mı var?" diye sordu; hepsine bunun gayriresmî olduğu açıklandı
- Talep olsa da telif ve hizmet politikaları nedeniyle dağıtma planı yok
Bonus: Home Assistant entegrasyonu
- PureGym API’sindeki içerideki kişi sayısı endpoint’i üzerinden IoT panosunda spor salonunun anlık yoğunluğu gösteriliyor
- Veriye dayanarak daha sakin saatlerde yeniden gitmeye karar verilebiliyor; bu da egzersiz verimliliğini ve motivasyonu artırıyor
Mühendislik gerçeği ve etik
- Bu, tamamen kişisel bir rahatsızlığı çözme girişimiydi; ancak PureGym içinde yıllardır iyileştirilmeyen bir alana dokunuyordu
- Kurum dışından geliştirilen bir prototip bazen resmî yol haritasından daha hızlı biçimde sorun çözebiliyor
- Bunun resmî açıdan kullanım koşullarını ihlal etmesi mümkün ve PureGym bunu istediği zaman engelleyebilir
- Kesinlikle otomasyona veya paylaşıma açılmadı; yalnızca kişisel deney amacıyla kullanıldı ve kararlılık için cache gibi ilkelere uyuldu
Sonraki adımlar ve kapanış
- İleride "utandırma push bildirimi" gibi genişletme fikirleri önerilebilir
- Pratik faydası küçük olsa da, yılda 3,8 saatlik "gereksiz hareket"in optimize edilmesi tatmin edici bulundu
- PureGym bunu resmî olarak uygularsa çok daha fazla kullanıcı kolaylığı sağlayabilir
- "Gayriresmî ama etkili bir deneyim" üretmenin bir örneği olarak kayda geçti
1 yorum
Hacker News görüşü
ABD'de 3 ay kaldığım sırada PureGym'e üye olup bir PIN almıştım, sonra üyeliğimi iptal ettim; ama daha sonra Chrome bana PureGym PIN'imin sızdırıldığını bildirdi.
2 yıl sonra tekrar ABD'ye gidince aynı PIN'i aldım ve bunun güvenlik açısından çok büyük bir sorun olduğunu düşündüm.
PureGym uygulaması ve token'ı da ilginçti; hidro masaj koltuğunu etkinleştiren sistemde de bir güvenlik açığı bulmuştum, çünkü herhangi bir PIN'i kabul edecek şekilde tasarlanmıştı.
Örneğin 87623103 gibi bir PIN, 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE hash'ine dönüşür ve HaveIBeenPwned hash aralığı içinde aratıldığında gerçekten birçok kez sızdırılmış kayıtlar bulunur.
API erişiminin hemen mümkün olup olmadığı sorusuna cevap: evet, doğru. Uygulamayı ve siteyi kullanırken gerçekten hiç rate limit'e takılmadım; başarısız denemelere karşı oldukça toleranslı.
Yazıda tanıttığım scope, resmi uygulamanın ve GitHub'daki gayriresmî istemcilerin kullandığıyla aynı.
Ek scope'lar olma ihtimali çok düşük; PureGym PHP Wrapper ve PureGym Attendance Python da bakmaya değer.
“Bu özelliği yaparsak bundan bizzat biz sorumlu oluruz” tarzı şeyler.
“Doğru, o zaman bunu 2028 roadmap'ine koyalım” diye yapılan şakaları da çok duydum.
Zaten yapılacak işler ve istek listesi çok uzun olduğu için yeni özellik eklemek kolay olmuyor.
Bence PureGym'in şu anda yapabileceği en iyi şey, bu uygulamayı yapan geliştiriciye birkaç bin sterlin ve ömür boyu ücretsiz üyelik vermek olurdu.
Apple Wallet pass'leri oluşturmak istiyorum ama geliştirici hesabı kurulumu ve ek maliyetler gözümü korkutuyor.
Batarya düşükken ya da güç tasarrufu modundayken hiç iletilmeyebilir; bu da batarya tüketimini en aza indirmek için tasarlanmış bir yapı.
Daha önemli bildirimlerde ise bir UI öğesinin mutlaka gösterilmesi gerekir ve bunlar güç tasarrufu durumundan bağımsız olarak ulaşır.