Native (Swift/Kotlin) vs Cross-Platform (Flutter/RN) Karşılaştırması

Platform derin entegrasyon, maksimum performans ve en iyi UX

VS
Cross-Platform (Flutter/RN)

Tek kod tabanı, iki platform — hız ve maliyet avantajı

10 dk okumaCross-Platform

Puan Karşılaştırması

Grafik yükleniyor...

Detaylı Puanlama

Performans
Native (Swift/Kotlin)10/10
Cross-Platform (Flutter/RN)8/10
Öğrenme Kolaylığı
Native (Swift/Kotlin)6/10
Cross-Platform (Flutter/RN)8/10
Ekosistem
Native (Swift/Kotlin)10/10
Cross-Platform (Flutter/RN)8/10
Topluluk
Native (Swift/Kotlin)9/10
Cross-Platform (Flutter/RN)9/10
İş Pazarı
Native (Swift/Kotlin)9/10
Cross-Platform (Flutter/RN)8/10
Gelecek
Native (Swift/Kotlin)9/10
Cross-Platform (Flutter/RN)8/10

Artıları & Eksileri

Native (Swift/Kotlin)

Artıları

  • Maksimum performans — platforma doğrudan erişim, bridge yok
  • En güncel platform özellikleri — yeni API'ler ilk günden kullanılabilir
  • Derin platform entegrasyonu — HealthKit, ARKit, Siri, Widget vb.
  • Platform'a özgü tasarım dili (Human Interface Guidelines / Material)
  • App Store optimizasyon ve Apple/Google sertifikasyonları
  • Daha iyi hata ayıklama ve profiling araçları (Instruments)
  • Platform topluluğu ve kaynakların tam desteği

Eksileri

  • İki ayrı kod tabanı — iOS için Swift, Android için Kotlin
  • İki ayrı ekip veya geliştiricilerin iki dil bilmesi gerekiyor
  • İki kat geliştirme süresi ve maliyeti
  • Özellik paritesini korumak zorlaşabiliyor
  • İki platform arasında tutarlı iş mantığı sağlamak için ek koordinasyon

En Uygun

Yüksek performans kritik uygulamalar (oyun, AR/VR, video)Platform özelliklerine derin entegrasyon gerektirenlerBüyük bütçe ve ayrı iOS/Android ekipleri olan şirketlerUzun vadeli, kurumsal ürün yatırımlarıPlatform sertifikası gerektiren fintech/sağlık uygulamaları

Cross-Platform (Flutter/RN)

Artıları

  • Tek kod tabanı — aynı iş mantığı iOS ve Android'de çalışıyor
  • Daha az geliştirici ile iki platform kapsama imkânı
  • Hızlı iterasyon — bir değişiklik her iki platforma yansıyor
  • Web ve desktop için genişletilebilir (özellikle Flutter)
  • JavaScript/Dart bilgisi ile mobil geliştirme (daha düşük giriş eşiği)
  • Hot reload ile anında görsel geri bildirim
  • MVP ve startup'lar için maliyet avantajı büyük

Eksileri

  • Platform özelliklerine erişim sınırlı — plugin yazılması gerekebilir
  • Yeni platform özellikleri gecikmeli destekleniyor
  • Native 'hissini' tam yakalamak zor (özellikle platform UI dili)
  • Performans Native'den geride — özellikle animasyon ağırlıklı
  • Büyük app boyutları
  • Bridge/channel hataları debug etmek zor

En Uygun

Startup ve MVP'ler — hızlı pazara çıkmaSınırlı bütçe ile iki platform kapsamaİçerik ağırlıklı uygulamalar (blog, haber, e-ticaret)Ekip tek bir programlama dili biliyorWeb'e de genişleme planı olan ürünler

Kod Karşılaştırması

Native (Swift/Kotlin)
// Swift (iOS) - HealthKit entegrasyonu (yalnızca native'de mümkün)
import HealthKit
import SwiftUI

@Observable
class HealthViewModel {
    var stepCount: Int = 0
    var heartRate: Double = 0
    var activeCalories: Double = 0
    private let healthStore = HKHealthStore()

    func requestPermission() async throws {
        let readTypes: Set<HKObjectType> = [
            HKObjectType.quantityType(forIdentifier: .stepCount)!,
            HKObjectType.quantityType(forIdentifier: .heartRate)!,
            HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!
        ]
        try await healthStore.requestAuthorization(toShare: [], read: readTypes)
    }

    func fetchTodayStats() async throws {
        let now = Date()
        let startOfDay = Calendar.current.startOfDay(for: now)
        let predicate = HKQuery.predicateForSamples(
            withStart: startOfDay, end: now, options: .strictStartDate
        )

        // Adım sayısı
        let stepType = HKQuantityType(.stepCount)
        let stepQuery = HKStatisticsQuery(
            quantityType: stepType,
            quantitySamplePredicate: predicate,
            options: .cumulativeSum
        ) { [weak self] _, result, _ in
            Task { @MainActor in
                self?.stepCount = Int(result?.sumQuantity()?.doubleValue(for: .count()) ?? 0)
            }
        }
        healthStore.execute(stepQuery)
    }
}

// ARKit entegrasyonu — native exclusive
import ARKit
import RealityKit

struct ARViewContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        let config = ARWorldTrackingConfiguration()
        config.planeDetection = [.horizontal, .vertical]
        arView.session.run(config)

        // 3D model yükleme ve yerleştirme
        let anchor = AnchorEntity(plane: .horizontal)
        let box = ModelEntity(mesh: .generateBox(size: 0.1))
        anchor.addChild(box)
        arView.scene.addAnchor(anchor)
        return arView
    }

    func updateUIView(_ uiView: ARView, context: Context) {}
}
Cross-Platform (Flutter/RN)
// Flutter - Platform özelliği erişimi (Method Channel)
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

// Platform kanalı tanımı
const platform = MethodChannel('com.myapp/native');

class NativeFeatureService {
  // iOS'ta HealthKit, Android'de Health Connect
  static Future<Map<String, dynamic>> getHealthData() async {
    try {
      final result = await platform.invokeMethod<Map>('getHealthData');
      return Map<String, dynamic>.from(result ?? {});
    } on PlatformException catch (e) {
      debugPrint('HealthKit/Health Connect hatası: ${e.message}');
      return {};
    }
  }

  // Cihaza özgü biyometrik kimlik doğrulama
  static Future<bool> authenticateWithBiometrics() async {
    try {
      return await platform.invokeMethod<bool>('biometricAuth') ?? false;
    } on PlatformException catch (e) {
      debugPrint('Biyometrik hata: ${e.message}');
      return false;
    }
  }
}

// Flutter UI (her iki platformda aynı)
class HealthDashboard extends StatefulWidget {
  const HealthDashboard({super.key});

  @override
  State<HealthDashboard> createState() => _HealthDashboardState();
}

class _HealthDashboardState extends State<HealthDashboard> {
  Map<String, dynamic> healthData = {};

  @override
  void initState() {
    super.initState();
    loadHealthData();
  }

  Future<void> loadHealthData() async {
    final data = await NativeFeatureService.getHealthData();
    setState(() => healthData = data);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Sağlık Özeti')),
      body: ListView(
        children: [
          _StatCard(label: 'Adım Sayısı', value: '${healthData["steps"] ?? 0}'),
          _StatCard(label: 'Kalori', value: '${healthData["calories"] ?? 0} kcal'),
        ],
      ),
    );
  }
}

Sonuç

Karar, ekip boyutu, bütçe ve uygulama karmaşıklığına göre değişir. Küçük ekip + sınırlı bütçe + içerik odaklı uygulama → Cross-platform mantıklı. Büyük ekip + platform derinliği + performans kritik → Native tercih edin. Kotlin Multiplatform, iş mantığını paylaşırken UI'ı native tutarak ikisi arasında güzel bir orta yol sunuyor.

Ücretsiz Danışmanlık Al

ALTIN İPUCU — Production Insight

Bu yazının en değerli bilgisi

Bu ipucu, yazının en önemli çıkarımını içeriyor.

Muhittin Çamdalı

Muhittin Çamdalı

iOS pixel perfection meets on-device AI craft — Swift, SwiftUI, visionOS, Core ML. 12+ yıl native iOS, 60+ App Store uygulaması, 1M+ kullanıcı. Bu karşılaştırma production deneyimine dayanmaktadır — teorik değil.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

SSS

Sıkça Sorulan Sorular

KMP hibrit bir yaklaşım: iş mantığı, ağ katmanı ve veri modelleri Kotlin ile paylaşılır; UI her platformda native olarak yazılır. Native performans + kod paylaşımı avantajını birleştiriyor.

İlgili Blog Yazıları

Tüm Yazıları Gör

İlgili Projeler

Tüm Projeleri Gör