Bölüm 11 — Konu 53: Store Yayınlama Süreci (İmzalama, Listing, Versiyonlama)
Dizi · 53/61 Flutter Türkçe Tutorial
- Bölüm 1 — Konu 1: Flutter Nedir, Mimarisi (Widget → Element → RenderObject, Skia/Impeller)
- Bölüm 1 — Konu 2: Ortam Kurulumu (Flutter SDK, Android Studio/VS Code, Emulator/Simulator, DevTools'a İlk Bakış)
- Bölüm 1 — Konu 3: İlk Proje Yapısı (`pubspec.yaml`, `lib/`, Klasör Mimarisi, `flutter create` Anatomisi)
- Bölüm 1 — Konu 4: Hot Reload / Hot Restart Ne Yapıyor, Neden Önemli
- Bölüm 2 — Konu 5: "Her Şey Widget'tır" Felsefesi, Widget Ağacı
- Bölüm 2 — Konu 6: StatelessWidget vs StatefulWidget + `setState()` Derinlemesine (Rebuild Mekanizması)
- Bölüm 2 — Konu 7: Temel Layout — Container, Row, Column, Stack, Padding, Align, Center
- Bölüm 2 — Konu 8: Constraint Sistemi — "Constraints Go Down, Sizes Go Up, Parent Sets Position"
- Bölüm 2 — Konu 9: `Expanded`, `Flexible`, `Spacer`, Intrinsic Widget'lar
- Bölüm 3 — Konu 10: MaterialApp/CupertinoApp, Scaffold, AppBar
- Bölüm 3 — Konu 11: `ListView`, `GridView`, `SingleChildScrollView` (+ Builder Pattern)
- Bölüm 3 — Konu 12: Text, TextStyle, Icon, Image, Asset Yönetimi
- Bölüm 3 — Konu 13: Custom Widget Yazma Prensipleri (Composition Over Inheritance)
- Bölüm 3 — Konu 14: Navigator 1.0 — Push/Pop, Named Routes
- Bölüm 4 — Konu 15: Form, TextField/TextFormField, GlobalKey<FormState>, Validasyon
- Bölüm 4 — Konu 16: Theme Sistemi (ThemeData, ColorScheme)
- Bölüm 4 — Konu 17: Responsive & Adaptive Tasarım (MediaQuery, LayoutBuilder, OrientationBuilder, Breakpoint Stratejileri)
- Bölüm 5 — Konu 18: Future/Async-Await Flutter Bağlamında, FutureBuilder
- Bölüm 5 — Konu 19: `Stream`, `StreamBuilder`
- Bölüm 5 — Konu 20: HTTP İstekleri (`http` / `dio` Paketleri)
- Bölüm 5 — Konu 21: JSON Serialization (Manuel → `json_serializable`/`freezed`)
- Bölüm 5 — Konu 22: Local Storage — `shared_preferences` → `Hive` → `sqflite`/Drift
- Bölüm 6 — Konu 23: InheritedWidget ve InheritedModel — "Neden setState Yetmiyor" Sorusunun Cevabı
- Bölüm 6 — Konu 24: Provider Paketi
- Bölüm 6 — Konu 25: Riverpod (Modern Yaklaşım, Provider'ın Halefi)
- Bölüm 6 — Konu 26: BLoC/Cubit Pattern (`flutter_bloc`)
- Bölüm 6 — Konu 27: GetX (Tartışmalı Ama Yaygın)
- Bölüm 6 — Konu 28: Karşılaştırma — Hangi Projede Hangisi?
- Bölüm 7 — Konu 29: Navigator 2.0 (Router, RouteInformationParser, RouterDelegate)
- Bölüm 7 — Konu 30: `go_router` Paketi (Pratik ve Modern Çözüm)
- Bölüm 7 — Konu 31: Deep Linking
- Bölüm 7 — Konu 32: Repository Pattern, Katmanlı Mimari (Data/Domain/Presentation)
- Bölüm 7 — Konu 33: Dependency Injection (`get_it`, `injectable`)
- Bölüm 7 — Konu 34: Clean Architecture Uyarlaması, SOLID Prensipleri
- Bölüm 8 — Konu 35: Implicit Animasyonlar
- Bölüm 8 — Konu 36: Explicit Animasyonlar (`AnimationController`, `Tween`, `Curve`)
- Bölüm 8 — Konu 37: Hero Animasyonları
- Bölüm 8 — Konu 38: `CustomPainter` / `Canvas`
- Bölüm 8 — Konu 39: Rive / Lottie Entegrasyonu
- Bölüm 9 — Konu 40: Platform Channels
- Bölüm 9 — Konu 41: Permission Yönetimi (`permission_handler`)
- Bölüm 9 — Konu 42: Kamera, Konum, Sensörler
- Bölüm 9 — Konu 43: Push Notification (Firebase Cloud Messaging)
- Bölüm 9 — Konu 44: Android/iOS Build Sistemleri
- Bölüm 10 — Konu 45: Test Yazımı (Unit, Widget, Integration, Golden)
- Bölüm 10 — Konu 46: CI/CD
- Bölüm 10 — Konu 47: Rebuild Optimizasyonu (`const`, `key` Kullanımı)
- Bölüm 10 — Konu 48: DevTools Profiling
- Bölüm 10 — Konu 49: Lazy Loading, Pagination, Büyük Liste Performansı
- Bölüm 11 — Konu 50: Firebase Ekosistemi (Auth, Firestore, Storage, Functions)
- Bölüm 11 — Konu 51: Supabase Alternatifi
- Bölüm 11 — Konu 52: GraphQL (Opsiyonel)
- Bölüm 11 — Konu 53: Store Yayınlama Süreci (İmzalama, Listing, Versiyonlama)
- Bölüm 11 — Konu 54: App Size, Obfuscation, Flavor Yönetimi
- Bölüm 12 — Konu 55: Flutter Web / Desktop
- Bölüm 12 — Konu 56: Custom `RenderObject` Yazımı
- Bölüm 12 — Konu 57: Engine Mimarisi Derinlemesine (Impeller vs Skia)
- Bölüm 12 — Konu 58: Plugin Geliştirme, pub.dev'e Paket Yayınlama
- Bölüm 12 — Konu 59: Monorepo Mimarisi (Melos)
- Bölüm 12 — Konu 60: Erişilebilirlik (Accessibility) Derinlemesine
- Bölüm 12 — Konu 61: Yerelleştirme (Localization / i18n)
İçindekiler 15 başlık
- Play Store — Google Play Console
- 1. Geliştirici Hesabı ve İlk Kurulum
- 2. İmzalama — Play App Signing
- 3. Test Aşamaları (Release Tracks)
- 4. Store Listing (Mağaza Sayfası)
- 5. Staged Rollout — Kademeli Yayın
- App Store — Apple App Store Connect
- 1. Apple Developer Hesabı
- 2. TestFlight — Apple'ın Test Sistemi
- 3. App Review — Apple'ın İnceleme Süreci
- 4. Metadata ve Ekran Görüntüleri
- Versiyonlama — İki Katmanlı Sistem
- Sürüm Notları (Release Notes) — Küçümsenmemesi Gereken Bir Detay
- 🎯 Bu Dersten Çıkarılması Gerekenler
- 📝 Ödevler
Bölüm 9 Konu 44'te build sistemlerinin mekaniğini (.apk/.aab/.ipa, imzalama temelleri) öğrenmiştik. Bu ders, o mekaniği gerçek bir yayınlama sürecine bağlıyor — Play Store'a ve App Store'a bir uygulamayı nasıl koyduğunu, adım adım.
Play Store — Google Play Console
1. Geliştirici Hesabı ve İlk Kurulum
Play Console'a erişim, bir kerelik $25 ücretle satın alınan bir geliştirici hesabı gerektirir (Bölüm 9 Konu 44'teki karşılaştırma tablosunu hatırla). Hesap oluşturduktan sonra, her uygulama için yeni bir "uygulama oluştur" girişi açılır — burada applicationId'nin (Konu 44) Play Console'daki karşılığı kaydedilir.
2. İmzalama — Play App Signing
flutter build appbundle --releaseKonu 44'te kendi keystore'unu (.jks) oluşturmayı öğrenmiştik. Google, artık "Play App Signing" adında bir sistemi zorunlu kılıyor: sen .aab dosyanı kendi keystore'unla imzalayıp yüklüyorsun, ama Google, kullanıcıya giden nihai APK'yı kendi sunucularında, kendi anahtarıyla yeniden imzalıyor. Bu, Konu 44'te bahsettiğimiz "keystore'unu kaybedersen güncelleyemezsin" riskini büyük ölçüde azaltır — keystore'unu kaybetsen bile, Google'ın kendi güvenlik sürecinden geçerek kimlik doğrulama yaparak yeni bir anahtar talep edebilirsin.
3. Test Aşamaları (Release Tracks)
İç Test (Internal Testing) → en hızlı, sadece belirlediğin kişiler (dakikalar içinde yayınlanır)
Kapalı Test (Closed Testing) → daha geniş bir grup (örn. 100-1000 kişi)
Açık Test (Open Testing) → Play Store'da HERKESİN katılabileceği bir beta
Üretim (Production) → gerçek, herkese açık yayınNeden bu aşamalar var? Bölüm 10 Konu 45-46'da testler ve CI ile kod hatalarını yakalamayı öğrenmiştik — ama gerçek kullanıcı davranışı (farklı cihazlar, farklı ağ koşulları, beklenmedik kullanım şekilleri), otomatik testlerin hiçbir zaman tam olarak yakalayamayacağı bir şeydir. Bu aşamalı sistem, hataları giderek büyüyen bir gruba göstererek, üretime çıkmadan önce yakalama şansı veriyor.
4. Store Listing (Mağaza Sayfası)
Uygulamanın Play Store'daki görünen yüzü:
- Başlık ve kısa açıklama — arama sonuçlarında görünen kısım.
- Tam açıklama — özellikler, kullanım senaryoları.
- Ekran görüntüleri — farklı cihaz boyutları için ayrı ayrı yüklenmesi gerekir (telefon, tablet).
- Gizlilik politikası URL'si — zorunludur, özellikle Bölüm 9'da öğrendiğimiz izinleri (kamera, konum) kullanan uygulamalar için Google titizlikle kontrol eder.
- İçerik derecelendirmesi (content rating) — bir anket doldurarak (şiddet, kullanıcı içeriği gibi sorular) otomatik belirlenir.
Pratik uyarı: Gizlilik politikası ve izin kullanım açıklamaları (Bölüm 9 Konu 41'de iOS için gördüğümüz UsageDescription metinlerine benzer bir mantık, Android tarafında da Play Console'un "Data Safety" formunda karşına çıkar), Google'ın inceleme sürecinde en sık reddetme sebeplerinden biridir — özellikle konum/kamera gibi hassas izinler kullanıyorsan, neden kullandığını açıkça beyan etmen gerekir.
5. Staged Rollout — Kademeli Yayın
%5 kullanıcıya yayınla → sorun yok → %20'ye çıkar → ... → %100Üretime çıkarken bile, doğrudan %100 yerine, Play Console kademeli yayın (staged rollout) sunar — yeni sürümü önce kullanıcıların küçük bir yüzdesine gösterir. Eğer çökme oranı (crash rate) artarsa, yayını durdurabilir ve sorunu düzeltip tekrar deneyebilirsin — bu, Bölüm 10 Konu 48'de öğrendiğimiz DevTools/profiling disiplinin, üretim ortamında devam eden hali gibi düşünebilirsin (artık senin cihazın değil, gerçek kullanıcıların verisiyle).
App Store — Apple App Store Connect
1. Apple Developer Hesabı
Konu 44'te bahsettiğimiz gibi, yıllık ~$99 ücretli bir Apple Developer hesabı gerekir. Play Store'dan farklı olarak, hesap bireysel ya da kurumsal olabilir — kurumsal hesap, bir DUNS numarası (şirket kimlik numarası) gerektirir.
2. TestFlight — Apple'ın Test Sistemi
flutter build ipa --releaseTestFlight, Play Console'un iç/kapalı/açık test aşamalarının Apple karşılığıdır — ama tek bir araçta birleşmiştir. Dahili test (kendi takımın, 100 kişiye kadar, App Review gerektirmez) ve harici test (dışarıdaki kullanıcılar, App Review'dan geçmesi gerekir, 10.000 kişiye kadar) olmak üzere iki modu var.
3. App Review — Apple'ın İnceleme Süreci
Bu, Play Store'a göre en büyük fark noktasıdır. Google Play, yeni bir sürümü genelde otomatik/hızlı bir incelemeden geçirirken, Apple'ın App Review'u insan gözden geçirmesi içerir ve genelde 1-3 gün sürer. Apple'ın App Store Review Guidelines'ı, uygulamanın:
- Çökmemesi gerektiğini (temel bir kalite barajı),
- Konu 41'deki izin açıklamalarının anlamlı ve doğru olması gerektiğini,
- Belirli kategorilerde (ödeme, kullanıcı içeriği, çocuklara yönelik uygulamalar) ek kurallara uyması gerektiğini belirtir.
Pratik tavsiye: İlk yayınlamadan önce App Review Guidelines'ı (Apple'ın resmi dokümantasyonu) en azından bir kez gözden geçirmek, reddedilme döngüsünü (düzelt → tekrar gönder → 1-3 gün bekle → tekrar reddedilme) önlemenin en etkili yoludur.
4. Metadata ve Ekran Görüntüleri
Play Store'a çok benzer bir süreç: başlık, açıklama, anahtar kelimeler (App Store'a özgü, arama sıralamasını etkiler), ekran görüntüleri (her cihaz boyutu için ayrı ayrı, App Store bunları otomatik ölçeklemez).
Versiyonlama — İki Katmanlı Sistem
# pubspec.yaml
version: 1.2.0+7Bu tek satır, aslında iki farklı sayı sistemini birleştiriyor:
1.2.0 — semantic versioning (anlamsal sürümleme), Dart Bölüm 12'de paket ekosistemini işlerken kısaca değindiğimiz bir kavram: BÜYÜK.KÜÇÜK.YAMA (MAJOR.MINOR.PATCH). Büyük sürüm, geriye uyumsuz bir değişikliği; küçük sürüm, geriye uyumlu yeni özellikleri; yama, hata düzeltmelerini işaret eder. Kullanıcının Store'da gördüğü sürüm numarası budur (Konu 44'teki versionName).
+7 — bu, Konu 44'te öğrendiğimiz versionCode'un (Android) ve iOS'taki karşılığı CFBundleVersion'ın kaynağıdır — flutter build, bu sayıyı otomatik olarak ilgili platform dosyalarına yansıtır. Kritik kural: her yayında (hatta her Store'a yükleme denemesinde), bu sayı kesinlikle önceki yüklemeden büyük olmalıdır — Store'lar, aynı ya da daha küçük bir build numarasıyla yükleme reddeder.
Pratik akış:
1.0.0+1 → ilk yayın
1.0.1+2 → küçük bir hata düzeltmesi (yama)
1.1.0+3 → yeni bir özellik eklendi (küçük sürüm)
2.0.0+4 → büyük bir mimari değişiklik / geriye uyumsuz (büyük sürüm)Sürüm Notları (Release Notes) — Küçümsenmemesi Gereken Bir Detay
Her yayında, kullanıcıya "bu sürümde ne değişti" açıklaması yazman gerekir (Store'ların ikisinde de). Bu, sadece formalite değildir — kullanıcıların güncellemeye güvenmesini sağlayan, ve destek talebi sayısını azaltan bir iletişim aracıdır. İyi bir alışkanlık: her sürümde, kullanıcının fark edeceği değişiklikleri (yeni özellik, düzeltilen bir sorun), teknik jargon olmadan, 2-3 madde ile özetlemek.
🎯 Bu Dersten Çıkarılması Gerekenler
- Play Store'da Play App Signing, kendi keystore'unu kaybetme riskini azaltır; iç/kapalı/açık test aşamaları, üretime çıkmadan önce kademeli geri bildirim toplamanı sağlar.
- Staged rollout, üretim yayınını bile kademeli yapar — çökme oranı artarsa yayın durdurulabilir.
- App Store'da TestFlight, test sürecini birleştirir; App Review, Play Store'a göre daha yavaş ve insan gözden geçirmeli bir süreçtir (1-3 gün).
- Gizlilik politikası ve izin açıklamaları, her iki mağazada da en sık reddetme sebeplerinden biridir.
- Versiyonlama iki katmanlıdır: semantic version (
1.2.0, kullanıcıya görünen) ve build number (+7, her yüklemede kesinlikle artması gereken, Konu 44'tekiversionCode/CFBundleVersion'ın kaynağı).
📝 Ödevler
- [ ] (Eğer bir hesabın varsa) Play Console'da bir uygulama oluştur, iç test track'ine
flutter build appbundleile üretilmiş bir.aabyükle. - [ ] Bir uygulamanın store listing metnini (başlık, kısa/uzun açıklama) yaz, en az 3 farklı boyutta ekran görüntüsü hazırla.
- [ ]
pubspec.yaml'dakiversion:satırını değiştirerek, semantic version ve build number'ı birlikte artırdığındaflutter build'in ürettiği dosyalardaki (AndroidversionCode, iOSCFBundleVersion) değişimi gözlemle. - [ ] Apple'ın App Store Review Guidelines'ından, izinlerle (kamera, konum) ilgili bölümü oku, kendi projendeki izin açıklamalarının (Bölüm 9 Konu 41) bu kurallara uygun olup olmadığını değerlendir.
- [ ] Kendi cümlelerinle, "neden staged rollout'un, tüm kullanıcılara aynı anda yayın yapmaktan daha güvenli olduğunu" açıkla.
Sıradaki konu: Bölüm 11 — Konu 54: App Size, Obfuscation, Flavor Yönetimi (Bölüm 11'in Son Konusu)