Mobil uygulama geliştirmenin zor kısmı sanıldığı gibi kod değil. Tek kod tabanından iki platform çıkarmak React Native ve Expo ile bugün oldukça rahat. Asıl sürprizi mağazalar yapıyor: hesaplar, gizlilik formları, test gereksinimleri ve red sebepleri.
Bu yazı o kısmı anlatıyor — kod yazmayı bitirdikten sonra uygulamanın gerçekten yayına girmesi için gerekenleri.
Önce maliyet
| Ücret | Biçim | |
|---|---|---|
| Apple Developer Program | 99 USD | Yıllık — ödemeyi bırakırsan uygulamaların mağazadan düşüyor |
| Google Play Console | 25 USD | Tek seferlik — hesap ömrü boyunca |
Aradaki fark önemli: Apple'da bu bir abonelik. Uygulamayı yayınlayıp unutamıyorsun, her yıl yenilemen gerekiyor.
Müşteri için uygulama yapıyorsan hesaplar müşterinin adına açılmalı. Uygulama senin hesabından yayınlanırsa, yollarınız ayrıldığında uygulamanın sahipliği sorun oluyor — Apple'da hesaplar arası transfer mümkün ama prosedürlü, bazı durumlarda hiç mümkün değil.
Google'ın 12 test kullanıcısı kuralı
Bu, hazırlıksız yakalananların takvimini en çok bozan şey ve Türkçe kaynaklarda neredeyse hiç geçmiyor.
13 Kasım 2023'ten sonra açılmış kişisel geliştirici hesapları için: bir uygulamayı üretime (production) alabilmek üzere önce kapalı test yürütmen gerekiyor — en az 12 test kullanıcısıyla, kesintisiz 14 gün boyunca. Ancak bunu tamamladıktan sonra Play Console'dan üretim erişimi başvurusu yapabiliyorsun.
Kural ilk çıktığında 20 kullanıcıydı; Aralık 2024'te 12'ye indirildi.
Ayrıntılar acıtıyor:
- 14 gün kesintisiz olmalı. Bir kullanıcı katılıp çıkarsa sayılmıyor; tekrar katılırsa sayaç sıfırdan başlıyor.
- 12 kullanıcı aynı anda kayıtlı olmalı. Farklı zamanlarda toplam 12 kişi test etmiş olması yetmiyor.
- Bu süre kod yazma süresine ek. Uygulama bittiğinde en az iki hafta daha var demek.
Müşteriye "üç haftada yayında olur" diye söz verdiysen ve hesap yeni açılmış bir kişisel hesapsa, bu sözü tutamıyorsun. Kurumsal (organizasyon) hesaplarda bu şart aranmıyor — takvimi belirleyen şey bu yüzden hesap tipi.
Ben bu yüzden zamanlamayı hesap açılışından değil, test kullanıcılarının toplandığı günden sayıyorum.
Apple'ın gizlilik bildirimi
1 Mayıs 2024'ten beri App Store'a gönderilen tüm yeni uygulamalar ve
güncellemeler, "required reason API" kullanan üçüncü parti SDK'lar için
gizlilik bildirimi (PrivacyInfo.xcprivacy) içermek zorunda. Bu bir plist
dosyası ve uygulamanın hangi veri türlerini topladığını, belirli API'leri hangi
gerekçeyle kullandığını beyan ediyor.
Bildirimi eksik olan uygulamalar inceleme aşamasında reddediliyor.
Expo tarafında bu yönetilebilir durumda: kütüphanelerin çoğu kendi bildirimini getiriyor, kendi ekleyeceklerini de yapılandırmadan tanımlıyorsun. Ama "kod bitti, gönderelim" dediğin gün ilk karşılaşacağın şey bu olabilir.
Formlar: ne topladığını beyan etmek
Her iki mağaza da veri toplama beyanı istiyor:
- Apple — App Privacy: Hangi veriyi topluyorsun, ne için kullanıyorsun, kullanıcıyla ilişkilendiriliyor mu? Mağaza sayfasındaki "gizlilik etiketleri" buradan üretiliyor.
- Google — Data Safety: Aynı soruların Google'daki karşılığı, artı verinin şifrelenip şifrelenmediği ve kullanıcının silme talebi yapıp yapamayacağı.
Beyanın uygulamanın gerçek davranışıyla uyuşması gerekiyor. Uyuşmazlık tespit edilirse uygulama kaldırılabiliyor.
BreakChain'i yazarken bilinçli bir karar verdim: hiç sunucu yok. Kullanıcı
sigarayı bıraktığı tarihi, günlük adedi ve fiyatı giriyor; hesaplamaların
tamamı cihazda yapılıyor ve veri AsyncStorage ile yalnız cihazda kalıyor.
Bildirimler de yerel.
Bunun mağaza tarafındaki karşılığı büyük: toplanan veri yok, dolayısıyla beyan edilecek veri de yok. Gizlilik metni kısa, formlar birkaç dakika, veri ihlali riski sıfır — çünkü elinde tutulan veri sıfır.
Uygulamanın gerçekten sunucuya ihtiyacı var mı sorusunu baştan sormak, yalnız altyapı maliyetini değil hukuki yükü de belirliyor.
Gizlilik metni bir URL olmalı
İki mağaza da gizlilik politikasının erişilebilir bir adreste yayınlanmasını istiyor. Uygulamanın içinde bir metin olması yetmiyor; kayıtta bir bağlantı vermen gerekiyor.
Uygulamanın kendi sitesi yoksa en pratik yol, mevcut bir siteye alt sayfa
açmak. Bu sitede /privacy-policy/breakchain böyle duruyor — mağaza kaydının
işaret ettiği adres o.
EAS ile derleme ve gönderme
Expo kullanıyorsan derleme için yerel bir Mac'e ihtiyacın yok; EAS Build imzalama sertifikalarını da yönetiyor.
# Kurulum
npm install -g eas-cli
eas login
eas build:configure
# Mağaza için derleme
eas build --platform ios
eas build --platform android
# Mağazaya gönderme
eas submit --platform ios
eas submit --platform androidSertifika ve profil yönetimi buradaki en büyük kolaylık: iOS imzalama geleneksel olarak sürecin en can sıkıcı kısmıydı, EAS bunu senin yerine yapıyor.
Her mağaza gönderiminde derleme numarasının (buildNumber / versionCode)
artmış olması gerekiyor. Aynı numarayla ikinci kez gönderemiyorsun ve
hata mesajı ilk bakışta anlaşılmıyor. EAS bunu otomatik artırabiliyor;
açmakta fayda var.
Mağaza listelemesi
Kod bittikten sonra hazırlanacaklar:
- Uygulama simgesi — köşeleri sen yuvarlamıyorsun, mağaza kendi maskesini uyguluyor. Kare ve dolu gönder.
- Ekran görüntüleri — belirli cihaz boyutlarında, belirli sayıda. Bu, çoğu kişinin son güne bıraktığı ve en çok vakit alan iş.
- Açıklama metni — mağaza içi aramada da kullanılıyor.
- Kategori, yaş sınırı, iletişim bilgisi.
- Test hesabı — uygulamada giriş varsa, inceleyene çalışan bir hesap vermen gerekiyor. Vermezsen reddediliyor.
Sık görülen red sebepleri
- Gizlilik metni URL'si çalışmıyor ya da boş sayfa
- Beyan edilen veri toplama, uygulamanın gerçek davranışıyla uyuşmuyor
- Giriş gerektiren uygulamada inceleyene test hesabı verilmemiş
- Uygulama "tamamlanmamış" görünüyor: boş ekranlar, çalışmayan düğmeler
- Ekran görüntüleri uygulamanın gerçek hâlini göstermiyor
- Gerekli izin isteniyor ama neden istendiği açıklanmamış
- iOS'ta gizlilik bildirimi eksik
Yayın işin sonu değil
Uygulama yayına girdikten sonra da bakım gerekiyor: platform sürümleri değişiyor, Apple ve Google zaman zaman yeni beyan zorunlulukları getiriyor, kütüphaneler eskiyor. "Bir kez yaz, unut" bir mobil uygulamada web'e göre daha az geçerli — çünkü altındaki iki platform da kendi takvimiyle ilerliyor.
Bu yüzden mobil işlerde sürüm güncellemesini baştan konuşuyorum: uygulamayı kim, hangi sıklıkla güncelleyecek?
React Native ile geliştirme ve mağaza yayın süreçlerinin yürütülmesi verdiğim hizmetlerden biri — kapsamı ve nasıl ilerlediğimizi mobil uygulama sayfasında yazdım. Yayında olan bir örnek için BreakChain'e bakabilirsin.
Google Play'in test gereksinimi Play Console Yardım sayfasına, Apple'ın gizlilik bildirimi zorunluluğu Expo dokümantasyonuna dayanıyor. Mağaza kuralları değişiyor; göndermeden önce güncel hâlini kontrol et.
