Native App — belirli bir platform için tasarlanmış dillerde ve SDK'lar kullanılarak yazılmış bir uygulama: iOS için Swift/Objective-C ve Android için Kotlin/Java. Çapraz platform çözümlerinin (Flutter, React Native) aksine, native uygulama ara katmanlar olmadan doğrudan işletim sistemiyle çalışır ve cihaz API'lerine — kamera, Bluetooth, NFC, sensörler, GPU — tam erişim sağlar. Bu, maksimum performans (animasyonlarda 60 fps), minimum başlatma süresi (0,2–0,5 saniye) ve en yeni platform özelliklerini yayınlandıkları gün kullanma imkanı sunar. Statista'ya (2026) göre, kullanıcıların %67'si bir uygulamadan anında yanıt bekliyor — karmaşık projeler için bu deneyimi garanti etmenin tek yolu native geliştirmedir.
Temel Noktalar
Native App — kendi programlama dili ve araçlarını kullanarak belirli bir platform için özel olarak geliştirilmiş mobil uygulama. iOS için bu, Xcode ile Swift veya Objective-C; Android için Android Studio ile Kotlin veya Java'dır. Kod, doğrudan platformun makine koduna derlenir (iOS için LLVM, Android için ART aracılığıyla), maksimum yürütme hızı sağlar.
Native uygulama mimarisi üç katman içerir. Sunum Katmanı — UI bileşenleri (iOS'ta UIKit/SwiftUI, Android'de Jetpack Compose/Android Views). Alan Katmanı — kullanım durumları ve depo arayüzleri ile iş mantığı. Veri Katmanı — veri kaynakları: ağ (iOS'ta URLSession/Alamofire, Android'de Retrofit/OkHttp), veritabanı (CoreData/SwiftData, Room), dosya sistemi. Her katman native SDK'lar kullanır — örneğin, bir iOS uygulaması konum için CoreLocation, BLE için CoreBluetooth, kamera için AVFoundation, 3D grafikler için Metal'i çağırabilir. Android benzer alternatifler sunar: konum için FusedLocationProvider, BLE için BluetoothAdapter, kamera için CameraX, grafikler için OpenGL ES/Vulkan.
Native uygulama yaşam döngüsü platformlara göre farklılık gösterir. iOS, AppDelegate ve SceneDelegate ile katı bir model kullanır: uygulama notRunning → foregroundInactive → foregroundActive → background → suspended durumlarından geçer. Android, Activity ve Fragment ile daha esnek bir model kullanır: onCreate → onStart → onResume → onPause → onStop → onDestroy, ayrıca bellek baskısı altında sistem işlemleri sonlandırabilir. Kesintisiz bir kullanıcı deneyimi için geliştiricinin durum kaydetmeyi (iOS: state restoration, Android: onSaveInstanceState) doğru şekilde yönetmesi gerekir.
iOS geliştirme yalnızca macOS'ta Xcode ortamında yapılır — Apple'ın kod düzenleyici, Interface Builder, iOS simülatörü ve profil oluşturma araçlarını (Instruments) içeren entegre geliştirme ortamı. Ana dil Swift'tir ve Apple tarafından 2014 yılında tanıtılmıştır. Swift, tip güvenliğini C'ye yakın performansla birleştirir ve OOP, fonksiyonel ve protokol odaklı programlama paradigmalarını destekler.
Temel iOS framework'leri:
Xcode araçları şunları içerir: görsel UI tasarımı için Interface Builder, kaynak yönetimi için Asset Catalog, bağımlılıklar için Swift Package Manager, birim ve UI testleri (XCTest) için Test Navigator, App Store yayınlama için Organizer. Instruments, CPU, bellek, ağ, grafik ve enerji tüketiminin profilini çıkarmaya olanak tanır. CI/CD için Xcode Cloud veya üçüncü taraf hizmetler (GitHub Actions, Bitrise, Fastlane) kullanılır.
Android geliştirme Android Studio'da yapılır — Google'ın IntelliJ IDEA tabanlı IDE'si. Ana dil Kotlin'dir ve 2017'de tercih edilen seçenek haline gelmiştir. Kotlin, Java ile tam uyumludur ancak daha kısa sözdizimi, Elvis operatörüyle null güvenliği, asenkron için coroutine'ler ve genişletme işlevleri sunar. Android Studio, görsel tasarım için Layout Editor, Google Play Services ile Android emülatörü, APK Analyzer ve Profiler içerir.
Temel Android bileşenleri:
Android mimari desenleri: Google, Depo katmanı ile MVVM'yi önerir. ViewModel durumu depolar (StateFlow), Repository veri kaynaklarını soyutlar, Use Cases iş mantığını kapsüller. Navigation Component, bir navigasyon grafiği aracılığıyla ekran geçişlerini yönetir. Test için JUnit, MockK, Compose UI Test ve Espresso kullanılır.
SwiftUI'de basit bir iOS uygulaması oluşturmayı ele alalım — SwiftData ile veri kaydetmeli bir görev listesi. Uygulama, temel native iOS geliştirme desenlerini gösterir: bildirimsel UI, reaktif güncellemeler, veri yönetimi.
import SwiftUI
import SwiftData
// 1. SwiftData ile Veri Modeli
@Model
final class TaskItem {
var title: String
var isCompleted: Bool
var createdAt: Date
init(title: String) {
self.title = title
self.isCompleted = false
self.createdAt = Date()
}
}
// 2. İş Mantığı ile ViewModel
@Observable
final class TaskViewModel {
var tasks: [TaskItem] = []
func addTask(title: String, context: ModelContext) {
let task = TaskItem(title: title)
context.insert(task)
tasks.append(task)
}
func toggleTask(task: TaskItem) {
task.isCompleted.toggle()
}
}
// 3. Ana Uygulama Ekranı
struct ContentView: View {
@Environment(\.modelContext) private var context
@State private var viewModel = TaskViewModel()
@State private var newTaskTitle = ""
@Query private var tasks: [TaskItem]
var body: some View {
NavigationStack {
List {
Section(header: Text("Yeni görev")) {
HStack {
TextField("Bir ad girin", text: $newTaskTitle)
Button("Ekle") {
addTask()
}
.disabled(newTaskTitle.isEmpty)
}
}
Section(header: Text("Görev listesi")) {
ForEach(tasks) { task in
HStack {
Image(systemName: task.isCompleted ? "checkmark.circle.fill" : "circle")
.onTapGesture { viewModel.toggleTask(task: task) }
Text(task.title)
.strikethrough(task.isCompleted)
Spacer()
Text(task.createdAt, style: .date)
.font(.caption)
.foregroundColor(.secondary)
}
}
.onDelete { indexSet in
for index in indexSet {
context.delete(tasks[index])
}
}
}
}
.navigationTitle("Görevlerim")
}
}
private func addTask() {
guard !newTaskTitle.isEmpty else { return }
viewModel.addTask(title: newTaskTitle, context: context)
newTaskTitle = ""
}
}
Koddaki temel desenler: @Model — otomatik kalıcı depolama oluşturma için SwiftData makrosu; @Observable — reaktif UI güncellemeleri için Observable makrosu; @Query — SwiftData'dan otomatik veri yükleme için özellik sarmalayıcısı. Uygulama, iş mantığını yöneten bir ViewModel ve görüntüleme için SwiftUI View ile MVVM mimarisini kullanır. SwiftData, model değiştiğinde otomatik olarak veri kaydeder — geliştiricinin SQL sorguları yazması gerekmez.
Jetpack Compose ve Room ile Kotlin'de benzer bir Android uygulaması. Platformlar arasındaki mimari ve yaklaşım farklılıklarını gösterir.
// 1. Entity Room — veri modeli
@Entity(tableName = "tasks")
data class TaskEntity(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val title: String,
val isCompleted: Boolean = false,
val createdAt: Long = System.currentTimeMillis()
)
// 2. DAO — veritabanı sorguları
@Dao
interface TaskDao {
@Query("SELECT * FROM tasks ORDER BY createdAt DESC")
fun getAllTasks(): Flow<List<TaskEntity>>
@Insert
suspend fun insertTask(task: TaskEntity)
@Delete
suspend fun deleteTask(task: TaskEntity)
}
// 3. İş Mantığı ile ViewModel
class TaskViewModel(private val dao: TaskDao) : ViewModel() {
val tasks: StateFlow<List<TaskEntity>> = dao
.getAllTasks()
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
fun addTask(title: String) {
viewModelScope.launch {
dao.insertTask(TaskEntity(title = title))
}
}
fun toggleTask(task: TaskEntity) {
viewModelScope.launch {
dao.insertTask(task.copy(isCompleted = !task.isCompleted))
}
}
}
// 4. Compose UI
@Composable
fun TaskScreen(viewModel: TaskViewModel = viewModel()) {
val tasks by viewModel.tasks.collectAsState()
var newTitle by remember { mutableStateOf("") }
Column(modifier = Modifier.padding(16.dp)) {
Text("Görevlerim", style = MaterialTheme.typography.headlineMedium)
Row(
modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp)
) {
OutlinedTextField(
value = newTitle,
onValueChange = { newTitle = it },
label = { Text("Yeni görev") },
modifier = Modifier.weight(1f)
)
Button(
onClick = { viewModel.addTask(newTitle); newTitle = "" },
enabled = newTitle.isNotBlank()
) {
Text("Ekle")
}
}
LazyColumn {
items(tasks, key = { it.id }) { task ->
Row(
modifier = Modifier
.fillMaxWidth()
.clickable { viewModel.toggleTask(task) }
.padding(vertical = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = task.isCompleted, onCheckedChange = { viewModel.toggleTask(task) })
Text(
text = task.title,
textDecoration = if (task.isCompleted) TextDecoration.LineThrough else TextDecoration.None
)
}
}
}
}
}
iOS'tan temel farklar: Room SQLite ile çalışmak için @Entity, @Dao ve @Query ek açıklamalarını kullanır; ViewModel coroutine'ler ile viewModelScope aracılığıyla yaşam döngüsünü yönetir; StateFlow collectAsState aracılığıyla reaktif Compose UI güncellemeleri sağlar. Android'de veriler Flow aracılığıyla iletilir — Combine Publisher'a benzer, ancak viewModelScope aracılığıyla ekran değiştiğinde iptal edilebilir.
Native uygulamanın avantajları çapraz platform çözümlerine göre birkaç temel yönü içerir. Performans: Metal (iOS) ve Vulkan (Android) aracılığıyla doğrudan GPU erişimi, karmaşık animasyonlarda 60 fps sağlar. API erişimi: iOS ve Android'in yeni özellikleri, framework desteği beklemeden yayınlandıkları gün kullanılabilir. Kullanıcı deneyimi: native UI bileşenleri (iOS'ta NavigationStack, TabView, Sheet; Android'de Scaffold, NavigationBar, BottomSheet) tanıdık davranış sağlar. Enerji verimliliği: native kod, arka plan görevlerinde %15–25 daha az pil tüketir.
Native uygulamanın dezavantajları: geliştirme maliyeti iki ayrı ekip gerektiğinden 1,5–2 kat daha yüksektir. Pazara çıkış süresi artar: iki paralel geliştirme koordinasyon gerektirir ve test hacmini ikiye katlar. Bakım: güncellemeler her iki platform için aynı anda yayınlanmalıdır, bu da CI/CD'yi karmaşıklaştırır. Basit uygulamalar (kataloglar, akışlar, formlar) için çapraz platform çözümleri daha ekonomik ve hızlı olabilir.
| Kriter | Native App | Çapraz Platform |
|---|---|---|
| Performans | Maksimum (60 fps) | Orta (55–60 fps) |
| API Erişimi | Tam, yayın günü | Eklentilerle, gecikmeli |
| Maliyet (2 platform) | 2 ekip × %100 | 1 ekip × %60–70 |
| Geliştirme Süresi | 4–6 ay | 2–4 ay |
| UI/UX | Native, HIG/Material Design | Birleşik tasarım, ödünler |
| Test | XCTest + Espresso | Flutter Test + Detox |
| CI/CD | Xcode Cloud + Fastlane | Codemagic + Fastlane |
| Bakım Karmaşıklığı | İki kod tabanı | Tek kod tabanı |
Native uygulama ne zaman seçilmeli: oyunlar ve yoğun grafikli uygulamalar (Metal, Vulkan, ARKit, ARCore); işletim sistemiyle derin entegrasyon gerektiren uygulamalar (Bluetooth LE, NFC, CoreBluetooth, HealthKit, Google Fit); güvenlik ve sertifika gereksinimleri olan finans, tıp ve kurumsal uygulamalar; her milisaniye gecikmenin kritik olduğu projeler (ticaret, akış, görüntülü görüşme). MVP'ler, startup'lar ve basit uygulamalar için çapraz platform geliştirme daha rasyonel bir seçim olabilir.
Sıkça Sorulan Sorular
Native App, platform dillerinde (Swift/Kotlin) yazılır ve native SDK'lar kullanır, bu da maksimum performans ve tüm cihaz API'lerine erişim sağlar. Çapraz platform uygulama (Flutter, React Native) performans ve platform özelliklerine erişimde ödünlerle paylaşılan kod kullanır.
iOS için — Swift ve Objective-C, Android için — Kotlin ve Java. Swift 2014'te iOS için ana dil haline gelmiş, Kotlin 2017'de Android için ana dil olmuştur. Objective-C ve Java esas olarak eski sürümleri destekleyen legacy projelerde kullanılır.
Maliyet karmaşıklığa bağlıdır: basit uygulama — $20.000 ila $50.000, orta karmaşıklık — $50.000 ila $120.000, karmaşık — $120.000'den itibaren. Native geliştirme çapraz platformdan %30–50 daha pahalıdır ancak daha iyi performans sunar.
Native App, yüksek performans gereksinimleri (oyunlar, AR/VR), platform API'lerinin derin kullanımı (kamera, Bluetooth, NFC), karmaşık 60 fps animasyonlar ve güvenlik gereksinimleri olan finans ve tıp uygulamaları için seçilir.
iOS için Xcode (yalnızca macOS'ta) iOS simülatörü ve Instruments hata ayıklama araçları ile kullanılır. Android için — Android Studio (Windows, macOS, Linux'ta) Android emülatörü, profil oluşturucu ve Layout Inspector ile kullanılır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun