iOS için Oyun Geliştirmeye Nereden Başlamalısınız
Bir sysadmin olarak iOS oyun geliştirmeyle ilgilenmeye başladığımda, aklımdaki ilk soru şuydu: “Bu işi macOS olmadan yapabilir miyim?” Cevap kısa: Hayır. Ama bu yazıda sizi o acı gerçekle baş başa bırakmak yerine, işin her boyutunu, altyapısından deployment süreçlerine kadar ele alacağız. Çünkü iOS geliştirme, sadece kod yazmaktan ibaret değil; sertifika yönetimi, provisioning profile karmaşası, Xcode’un kaprisli davranışları ve App Store gönderim süreci derken ciddi bir sistem yönetimi bilgisi de gerektiriyor.
Geliştirme Ortamının Kurulması
Her şey bir Mac ile başlıyor. Bu konuda Apple’ın duvarlarını aşmanın resmi bir yolu yok. Sanal makine üzerinde macOS çalıştırmak teknik olarak mümkün ama Apple’ın lisans sözleşmesine aykırı ve prodüksiyon için kesinlikle önerilmez. O yüzden elimizde şunlar var:
- Fiziksel bir Mac (MacBook Air M serisi başlangıç için yeterli)
- Mac mini (masaüstü build sunucusu olarak mükemmel)
- Hackintosh (yasal gri alan, production’da kullanmayın)
Xcode kurulumu App Store üzerinden yapılıyor ama dikkatli olun; Xcode’un son sürümü her zaman en son macOS’u gerektiriyor. Bunu sysadmin gözüyle düşündüğünüzde, build makinenizi her OS güncellemesinde yükseltmek zorunda kalabileceğiniz anlamına geliyor.
# Xcode Command Line Tools kurulumu (CI/CD ortamları için)
xcode-select --install
# Mevcut Xcode sürümünü kontrol et
xcodebuild -version
# Kurulu simulatörleri listele
xcrun simctl list devices
# Belirli bir iOS versiyonu için simulator ekle
xcrun simctl create "iPhone15Pro-Test" "iPhone 15 Pro" "iOS-17-0"
Homebrew olmadan macOS’ta ciddi bir geliştirme ortamı kurmak zorlaşıyor. iOS oyun geliştirmede de işimize yarayacak araçları şöyle kurabiliriz:
# Homebrew kurulumu
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Gerekli araçları kur
brew install cocoapods
brew install fastlane
brew install swiftlint
brew install xcbeautify
# Node.js (React Native veya Capacitor kullanacaksanız)
brew install node
# Unity için gerekli olabilecek araçlar
brew install git-lfs
git lfs install
Oyun Motoru Seçimi: Hangi Motor, Hangi Senaryo?
Burada deneyimden konuşmak gerekiyor. Yanlış motor seçimi, aylar sonra sizi başa sardırabilir. iOS için oyun geliştirmede üç ana yol var:
SpriteKit ve SceneKit (Native Apple)
Apple’ın kendi framework’leri. Dışa bağımlılık sıfır, App Store onay süreci daha az sorunlu, Metal ile doğrudan entegrasyon var. 2D oyunlar için SpriteKit gerçekten güçlü bir seçenek. Ama şunu söyleyeyim: Android’e de çıkmak istiyorsanız, bu yatırımınız orada işe yaramaz.
Unity
Endüstri standardı, geniş asset mağazası, iOS ve Android arasında %80-90 oranında kod paylaşımı. Ama Unity’nin iOS için ürettiği Xcode projesi bir kara kutu gibi hissettiriyor başta. CI/CD pipeline’a entegre ettiğinizde güzel çalışıyor ama build süreleri uzun.
Godot
Açık kaynak, hafif, son sürümlerde iOS desteği oldukça iyi. Indie projeler için bütçe dostu. GDScript’i Python benzeri yapısıyla öğrenmesi kolay.
Apple Geliştirici Hesabı ve Sertifika Yönetimi
İşte gerçek sysadmin işi burada başlıyor. Apple’ın sertifika ve provisioning sistemi, ilk kez karşılaştığınızda kafanızı karıştırabilir. Yıllık 99 dolar ödeyerek Apple Developer Program’a katılıyorsunuz. Sonra şu kavramlarla boğuşmak zorunda kalıyorsunuz:
- Development Certificate: Cihazınızda test için
- Distribution Certificate: App Store’a göndermek için
- Provisioning Profile: Sertifika + App ID + Cihaz listesini birleştiren dosya
- App ID: Uygulamanızın benzersiz tanımlayıcısı (com.sirketadi.oyunadi)
Fastlane’in match komutu bu karmaşayı çözmek için geliştirilmiş. Takım ortamında sertifikaları Git reposunda şifrelenmiş olarak tutmanızı sağlıyor:
# Fastlane kurulumu ve başlatma
gem install fastlane
cd /proje/dizini
fastlane init
# Match ile sertifika yönetimi başlatma
fastlane match init
# Development sertifikası oluştur/senkronize et
fastlane match development
# App Store dağıtımı için sertifika
fastlane match appstore
# Sertifikaları yenile (expire olduğunda)
fastlane match nuke distribution
fastlane match appstore
Takımda birden fazla geliştirici varsa, bu sertifikaları paylaşmanın en temiz yolu match’tir. Alternatif olarak Apple’ın kendi portali üzerinden manuel yönetim yapabilirsiniz ama bu ölçeklenmiyor.
Simulator ve Gerçek Cihaz Testleri
Geliştirme sürecinde iki farklı test ortamı kullanıyorsunuz: iOS Simulator ve gerçek cihazlar. Simulator, donanım özelliklerini (kamera, GPS, accelerometer gibi sensörler) tam simüle etmez. Oyun geliştirmede frame rate testleri için mutlaka gerçek cihazda test etmeniz gerekiyor.
# Çalışan simulatorleri listele
xcrun simctl list devices | grep Booted
# Belirli bir uygulamayı simulatorde calistir
xcrun simctl install booted /path/to/YourApp.app
xcrun simctl launch booted com.sirketadi.oyunadi
# Simulator'de log takibi
xcrun simctl spawn booted log stream --predicate 'processImagePath endswith "YourApp"'
# Gerçek cihazda uygulama yükleme (geliştirme profiliyle)
ios-deploy --bundle YourApp.app --debug
# Cihaz loglarını izle
idevicesyslog | grep "YourApp"
Performans profili çıkarmak için Instruments aracını kullanıyorsunuz. Komut satırından da çalıştırabilirsiniz:
# Metal GPU performansını komut satırından profilele
xctrace record --template "Metal System Trace"
--device-id <UDID>
--launch -- com.sirketadi.oyunadi
--output oyun_profil.trace
# Trace dosyasını aç
open oyun_profil.trace
CI/CD Pipeline Kurulumu
Takım olarak çalışıyorsanız veya düzenli build almanız gerekiyorsa, CI/CD olmadan verimli çalışamazsınız. GitHub Actions, GitLab CI veya Jenkins kullanabilirsiniz. Ben burada GitHub Actions örneği vereceğim çünkü Apple Silicon Mac’ler artık GitHub’ın self-hosted runner’larında kullanılabiliyor.
# Self-hosted runner kurulumu için macOS hazırlığı
# Önce gerekli bağımlılıkları kur
brew install libimobiledevice
brew install ios-deploy
# Fastlane Appfile konfigürasyonu
cat > fastlane/Appfile << 'EOF'
app_identifier "com.sirketadi.oyunadi"
apple_id "[email protected]"
team_id "TAKIM_ID_BURAYA"
EOF
# Fastlane Fastfile - temel lane tanımları
cat > fastlane/Fastfile << 'EOF'
default_platform(:ios)
platform :ios do
desc "Test build"
lane :test do
run_tests(
scheme: "OyunAdi",
devices: ["iPhone 15 Pro"],
clean: true
)
end
desc "App Store build ve gönderimi"
lane :release do
match(type: "appstore")
build_app(
scheme: "OyunAdi",
export_method: "app-store"
)
upload_to_app_store(
skip_metadata: false,
skip_screenshots: true
)
end
end
EOF
GitHub Actions workflow dosyası için .github/workflows/ios_build.yml oluşturun:
# Workflow dosyasını oluştur
mkdir -p .github/workflows
cat > .github/workflows/ios_build.yml << 'EOF'
name: iOS Build ve Test
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
with:
lfs: true
- name: Ruby ve Fastlane kur
run: |
gem install bundler
bundle install
- name: Bağımlılıkları yükle
run: pod install
- name: Test çalıştır
run: bundle exec fastlane test
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APP_STORE_CONNECT_API_KEY: ${{ secrets.ASC_API_KEY }}
- name: Build artifact yükle
uses: actions/upload-artifact@v4
with:
name: ios-build
path: "*.ipa"
EOF
Unity ile iOS Build Süreci
Unity kullanıyorsanız, build süreci biraz daha katmanlı. Unity önce bir Xcode projesi üretiyor, sonra Xcode bu projeyi derliyor. Bu iki aşamalı süreci otomatize etmek önemli.
# Unity komut satırından iOS build al
/Applications/Unity/Hub/Editor/2022.3.0f1/Unity.app/Contents/MacOS/Unity
-quit
-batchmode
-projectPath /proje/yolu
-buildTarget iOS
-executeMethod BuildScript.BuildiOS
-logFile /tmp/unity_build.log
# Unity build logunu takip et
tail -f /tmp/unity_build.log | grep -E "(error|warning|Exception)"
# Unity'nin ürettiği Xcode projesini derle
cd /proje/yolu/Builds/iOS
xcodebuild
-workspace Unity-iPhone.xcworkspace
-scheme Unity-iPhone
-configuration Release
-archivePath build/OyunAdi.xcarchive
archive
CODE_SIGN_IDENTITY="Apple Distribution"
PROVISIONING_PROFILE_SPECIFIER="OyunAdi_AppStore"
# Archive'dan IPA oluştur
xcodebuild
-exportArchive
-archivePath build/OyunAdi.xcarchive
-exportPath build/ipa
-exportOptionsPlist ExportOptions.plist
App Store Connect API ve Otomatik Gönderim
App Store’a her seferinde elle girmek hem vakit alır hem de hata riski yaratır. App Store Connect API’yi kullanarak bu süreci tamamen otomatize edebilirsiniz.
# API anahtarı ile App Store Connect'e bağlan
# Önce .p8 dosyasını güvenli bir yere koy
export ASC_KEY_ID="ANAHTAR_ID"
export ASC_ISSUER_ID="ISSUER_ID"
export ASC_PRIVATE_KEY_PATH="/secure/AuthKey_ANAHTAR_ID.p8"
# Fastlane ile API key kullanımı
cat > fastlane/Appfile << 'EOF'
app_store_connect_api_key(
key_id: ENV["ASC_KEY_ID"],
issuer_id: ENV["ASC_ISSUER_ID"],
key_filepath: ENV["ASC_PRIVATE_KEY_PATH"],
duration: 1200,
in_house: false
)
EOF
# TestFlight'a otomatik gönderim
fastlane pilot upload
--ipa "build/ipa/OyunAdi.ipa"
--changelog "Bu sürümde yeni seviyeler ve hata düzeltmeleri mevcut."
--distribute_external false
--notify_external_testers false
# Uygulama metadatası güncelle
fastlane deliver
--skip_binary_upload true
--force
Yaygın Sorunlar ve Çözümleri
Gerçek dünyada karşılaştığım sorunlardan bahsedelim:
Provisioning Profile uyuşmazlığı: Build alırken “No matching provisioning profiles found” hatası almanın birkaç nedeni var. Sertifika expire olmuş olabilir, Bundle ID yanlış olabilir veya cihazın UDID eklenmemiş olabilir.
# Sisteme yüklü provisioning profilleri listele
ls ~/Library/MobileDevice/Provisioning Profiles/ | head -20
# Profil içeriğini oku
security cms -D -i ~/Library/MobileDevice/Provisioning Profiles/xxxx.mobileprovision
# Expire olmuş profilleri temizle
find ~/Library/MobileDevice/Provisioning Profiles/
-name "*.mobileprovision"
-exec security cms -D -i {} ; 2>/dev/null |
grep -A2 "ExpirationDate"
# Xcode derived data temizle (build sorunlarının %40'ını çözer)
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# Keychain sertifika durumunu kontrol et
security find-identity -v -p codesigning
Büyük asset dosyaları ile Git LFS: Oyun geliştirmede texture, ses dosyası ve 3D model gibi büyük binary dosyalar kaçınılmaz. Git LFS olmadan repo boyutu kontrolden çıkar.
# Git LFS kurulumu ve konfigürasyonu
git lfs install
# Oyun geliştirmede yaygın büyük dosya uzantıları için LFS ayarla
cat > .gitattributes << 'EOF'
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.unity filter=lfs diff=lfs merge=lfs -text
*.asset filter=lfs diff=lfs merge=lfs -text
EOF
git add .gitattributes
git commit -m "Git LFS konfigurasyonu eklendi"
# Mevcut büyük dosyaları LFS'e taşı
git lfs migrate import --include="*.png,*.jpg,*.mp3,*.wav"
TestFlight ile Beta Dağıtımı
App Store’a çıkmadan önce TestFlight üzerinden beta testleri yapmak zorundasınız desem yanlış olmaz. Internal testers (takım üyeleri, 25 kişiye kadar) ile external testers (gerçek kullanıcılar, 10.000 kişiye kadar) arasında ayrım yapmanız gerekiyor. External testler Apple incelemesinden geçmek zorunda, internal testler geçmiyor.
# TestFlight grubu yönetimi fastlane ile
fastlane pilot manage_groups
# Belirli bir gruba build dağıt
fastlane pilot distribute
--build_number 42
--groups "Ic Testciler,Dis Beta"
--notify_external_testers true
# Test notları ekleyerek yükle
fastlane pilot upload
--ipa build/OyunAdi.ipa
--changelog "Seviye 3 boss dövüşü dengelendi, GPU kullanımı optimize edildi."
--beta_app_feedback_email "[email protected]"
Monitoring ve Crash Raporlama
Oyununuzu yayına aldıktan sonra işiniz bitmedi. Üretim ortamında crash takibi ve performans monitoring şart.
Firebase Crashlytics veya Sentry gibi araçlar kullanıyorsanız, bunları CI/CD pipeline’ınıza entegre etmeniz gerekiyor. Her build için dSYM dosyalarını (debug sembol dosyaları) otomatik yüklemek, crash raporlarının okunabilir olması için kritik.
# Firebase Crashlytics için dSYM yükle
# GoogleService-Info.plist projenizde mevcut olmalı
find . -name "*.dSYM" -exec
~/oyun_projesi/Pods/FirebaseCrashlytics/upload-symbols
-gsp GoogleService-Info.plist
-p ios {} ;
# Sentry CLI ile dSYM yükle
sentry-cli upload-dif
--org sirket-adi
--project oyun-adi
build/OyunAdi.xcarchive/dSYMs/
# App Store Connect'ten dSYM dosyalarını indir
fastlane download_dsyms
--app_identifier com.sirketadi.oyunadi
--version "1.2.0"
--output_directory /dsyms/
# İndirilen dSYM'leri Crashlytics'e yükle
find /dsyms/ -name "*.dSYM" | xargs -I {}
firebase crashlytics:symbols:upload
--app APP_ID {}
Sonuç
iOS oyun geliştirme, sysadmin perspektifinden bakıldığında aslında iyi tanıdığımız kavramların farklı bir manifestasyonu: sertifika yönetimi PKI’nın özel bir versiyonu, provisioning profilleri erişim kontrol politikaları, TestFlight staging ortamı, App Store Connect ise deployment pipeline’ınızın son adımı.
Başlangıç için öneri sıram şu olur: Önce Apple Developer hesabı açın ve sertifika sistemini anlayın. Ardından küçük bir SpriteKit projesiyle Xcode’u tanıyın, simulator yerine mümkün olan en kısa sürede gerçek cihaza geçin. Fastlane’i erken öğrenin; başta aşırı mühendislik gibi görünse de ilk App Store gönderiminizde size saatler kazandırır. Son olarak, Git LFS ve CI/CD’yi ihmal etmeyin; bunlar oyun büyüdükçe değil, projeden ilk günden kurulması gereken altyapılar.
Sistemleri iyi kurun, otomasyonu erkenden başlatın ve Apple’ın dönemsel API kırılmalarına karşı hazırlıklı olun. Xcode her major sürümde bir şeyleri değiştiriyor; bu değişikliklere tepkisel değil, proaktif yaklaşın.
