Xcode’u açmadan Mac ve iOS uygulamaları derleyip dağıtmak
(scottwillsey.com)- İlk Apple hesap ve sertifika kurulumunu tamamladıktan sonra, yalnızca Xcode.app içindeki CLI araçlarıyla Mac ve iOS uygulamalarının derleme, imzalama ve dağıtımını otomatikleştirmek mümkün
project.ymliçinde XcodeGen ile.xcodeprojyeniden oluşturuluyor;xcodebuild,notarytool,stapler,devicectlile proje oluşturmadan Mac notarizasyonuna ve iPhone kurulumuna kadar tüm süreç yürütülüyor- Mac dağıtımı,
scripts/release.shadlı tek bir betikle arşivleme, Developer ID ile imzalama, notarizasyon, ticket stapling, Gatekeeper doğrulaması ve/Applicationskurulumunu sırayla çalıştırıyor; hata olduğunda süreç anında duruyor - Hızlı derleme ve test için
CODE_SIGNING_ALLOWED=NOkullanılabilir; ancak bu geçici imzalı derleme Gatekeeper’ı geçemez ve iCloud KVS ile App Group yetkileri de gerçek ekip kimliğine bağlanmaz - İmzalama özel anahtarı ve notarizasyon parolası login keychain içinde saklanıyor; komutlar ve dağıtım kuralları
CLAUDE.mdveyaAGENTS.mdiçine yazılırsa Claude Code gibi ajanlar tüm iş akışını tekrar tekrar çalıştırabiliyor
Xcode GUI olmadan yapılabilecekler
- Xcode’un kendisinin kurulu olması gerekiyor, ancak çalıştırılması gerekmiyor;
xcodebuild,notarytool,stapler,devicectlaraçlarının tamamı Xcode.app içindeki kabuk araçları olarak bağımsız çalışıyor - Apple ID oturumu açma, Developer ID sertifikası oluşturma ve notarizasyon parolasını kaydetme gibi ilk kurulum adımları için GUI veya etkileşimli terminal gerekiyor
- İlk kurulum tamamlandıktan sonra proje oluşturma, derleme, arşivleme, imzalı uygulama dışa aktarma, notarizasyon, doğrulama, kurulum ve gerçek iPhone’a dağıtım işlemleri fare kullanmadan yapılabiliyor
- Ayar veya betik yazımı tıkandığında, Claude Code ya da başka bir LLM kodlama aracına iş gereksinimlerini ve projeye özel değerleri vererek iş akışı oluşturmak mümkün
Tam Xcode araç zincirini seçmek
- Önce
xcode-select -pçıktısının/Applications/Xcode.app/Contents/Developerolduğundan emin olmak gerekiyor - Bağımsız Command Line Tools seçiliyse, aşağıdaki komutla tam Xcode araç zinciri belirtiliyor
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcode-select --installile kurulan/Library/Developer/CommandLineToolsiçindeclangvegitbulunur, ancak iOS SDK,notarytool,devicectlgibi tam uygulama geliştirme araçları yer almaz- Xcode zaten kuruluysa ayrıca Command Line Tools paketine gerek yoktur
- Lisans kabulü ve ek bileşen kurulumu da CLI üzerinden yapılabilir
sudo xcodebuild -license accept
sudo xcodebuild -runFirstLaunch
XcodeGen ile projeyi yeniden üretmek
- XcodeGen, Xcode proje ayarlarını YAML ile yönetir ve her derleme öncesi
.xcodeprojdosyasını yeniden üretir - GitHub’dan indirilebilir veya Homebrew ile kurulabilir
brew install xcodegen
.xcodeproj, macOS’ta dosya gibi görünen bir klasördür; Xcode iç dosyaları ve referansları sürekli değiştirdiği için Git deposunda çakışmalar veya gereksiz değişiklikler oluşabilir- Yalnızca
project.ymldosyasını Git’e commit edip, üretilen.xcodeprojdosyasını yok saymak proje ayarlarını yeniden üretilebilir halde tutar
xcodegen generate
Apple geliştirici hesabı ve sertifika kurulumu
- Xcode’daki
Settings → Accountsbölümüne Apple ID eklemek gerekir - Uygulama dağıtımı ve notarizasyon için ücretli Apple Developer hesabı gerekir
Settings → Accounts → Apple ID → Manage Certificates… → + → Developer ID Applicationyoluyla dağıtım sertifikası oluşturulur- Apple Development ile Developer ID Application farklı amaçlara hizmet eder
- Apple Development, uygulamayı kendi cihazınızda çalıştırmak veya iPhone’a gönderip yerel hata ayıklama yapmak için kullanılır
- Developer ID Application ise başkalarının Mac’lerinde de Gatekeeper’ı geçen notarize edilmiş
.appdosyalarını dağıtmak için gerekir
- Developer ID Application sertifikası oluşturulduğunda, sertifika ve ona karşılık gelen özel anahtar login keychain içine kurulur
- Gerçek imzalama işleminde özel anahtar kullanılır ve bu anahtar yeniden indirilemez; bu yüzden silinmemeli ve keychain yedeği alınmalıdır
Notarizasyon kimlik bilgilerini keychain’e kaydetmek
- Mac uygulaması notarizasyonu, imzalı uygulamanın kötü amaçlı yazılım taraması için Apple’a yüklenmesi sürecidir
notarytool, keychain’de saklanan bir profil ile kimlik doğrular; profil ilk oluşturulurken uygulamaya özel parola etkileşimli biçimde girilmelidir
xcrun notarytool store-credentials App-Name \
--apple-id "you@example.com" \
--team-id YOUR-TEAM-ID
- Notarizasyon profilini başka bir uygulamadan ödünç almak yerine uygulama adına uygun şekilde oluşturmak, farklı ortamlarda sessizce başarısız olan durumları önler
- Uygulamaya özel parola, Apple ID parolasından farklıdır ve Apple ID sitesindeki
Sign-In & Security → App-Specific Passwordsbölümünden oluşturulur - Apple ID parolasını değiştirince uygulamaya özel parola ayrıca uyarı vermeden geçersiz hale gelebilir
- Notarizasyon sırasında
401 invalid credentialshatası görülürse, tüm yapılandırmadan önce uygulamaya özel parolanın süresinin dolup dolmadığı kontrol edilmelidir
- Notarizasyon sırasında
- Profilin kaydedildiği şu komutla doğrulanır
xcrun notarytool history --keychain-profile App-Name
- Uygulamaya özel parola, Claude Code’un erişebildiği bir 1Password kasasında tutulursa yeni uygulama için notarizasyon profili oluşturma işi de ajana bırakılabilir
--passwordile parola girişini de otomatikleştirmek mümkün olsa da kabuk geçmişinde parola kalabileceği için, bir kez elle girip sonra keychain veya 1Password’da saklama yöntemi tercih edilir
Yerel imzalama ayarları ve gizli bilgilerin ayrılması
- Gerçek imzalama için gereken ekip kimliği ve bundle öneki
Local.xcconfigiçinde tutulur
cp Local.xcconfig.example Local.xcconfig
BUNDLE_PREFIX = your.real.prefix
DEVELOPMENT_TEAM = YOUR-TEAM-ID
Local.xcconfig, projeye özel yerel ayarların depoya girmemesi için.gitignoreiçine eklenir- İmzalama özel anahtarı login keychain’de, notarizasyon için uygulamaya özel parola ise
notarytoolkeychain profilinde kaldığından gizli bilgiler Git’e yazılmaz
release.sh ile Mac dağıtımını otomatikleştirmek
- Depodaki
scripts/release.sh, Mac uygulamasının tüm dağıtım hattını tek komutla çalıştırır
./scripts/release.sh
-
Betik şu sırayla çalışır
xcodegenve notarizasyon profilinin varlığını önceden kontrol ederxcodegen generateile projeyi yeniden üretirxcodebuild archiveile Release arşivi oluştururExportOptions.plistvexcodebuild -exportArchiveile Developer ID imzalı uygulamayı dışa aktarır- Uygulamayı ZIP olarak paketleyip
notarytool submit --waitile Apple’a gönderir stapler stapleile notarizasyon ticket’ını eklerspctlile Gatekeeper iznini doğrular- Mevcut süreçleri sonlandırır ve uygulamayı
/Applicationsiçine kopyalar lsregisterile kurulu uygulamayı kaydeder- Kurulu bundle’ın ticket’ını ve Gatekeeper durumunu yeniden doğrular
-
Model genel dağıtım sürecini biliyor olsa bile scheme adı, ekip kimliği, notarizasyon profil adı, kurulum konumu gibi projeye özel bilgiler kullanıcı tarafından verilmelidir
-
İlk betik başarısız olursa, çıktıya bakarak düzeltme yapılan yinelemeli bir süreç gerekir; ancak iş akışı oturduktan sonra ek değişiklik olmadan yalnızca dağıtım komutu çalıştırılabilir
-
Hataları ve eksik dağıtımı önlemek
set -euo pipefail, tek bir komut bile başarısız olursa betiği anında durdurur; böylece eksik durumlar başarı sayılmazcd "$(dirname "$0")/..", betik hangi dizinden çağrılırsa çağrılsın depo köküne geçilmesini sağlar- Ön kontrol bloğu, zaman alan arşivleme başlamadan önce
xcodegenve notarizasyon profilini doğrular - Yalnızca dışa aktarılan uygulama değil,
/Applicationsiçine kopyalanan uygulama da yeniden denetlenir; böylece kopyalama sırasında bundle bozulmaları yakalanır - Farklı bir notarizasyon profili gerekirse ortam değişkeniyle üzerine yazılabilir
TZED_NOTARY_PROFILE=<name> ./scripts/release.sh
Dağıtım kurallarını ajana aktarmak
release.shtek komutla dağıtım yapıyorsa,CLAUDE.mdveyaAGENTS.md, ajanın her oturumda ek talimat almadan bu komutu kullanmasını sağlar- Belgede proje yeniden üretimi, birim testleri, hızlı macOS derlemesi ve gerçek dağıtım komutu yer almalıdır
xcodegen generate
swift test
xcodebuild -project YOUR-APP-NAME.xcodeproj \
-scheme YOUR-APP-NAME-macOS \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NO build
./scripts/release.sh
- İki derleme yolunun farkı da belgede açıkça belirtilmelidir
CODE_SIGNING_ALLOWED=NOderlemesi CI ve hızlı yerel kontroller için uygundur- Gerçek menü çubuğu uygulaması dağıtımı, quarantine niteliğini geçme ve iCloud senkronizasyonu için Developer ID imzalama ve notarizasyon yapan
release.shgerekir
- Bir uygulamada kurulan düzenin başka depolarda referans alınması belirtilirse Claude Code daha sonraki uygulamalara da aynı yapılandırmayı kopyalayabilir
Hızlı imzasız derleme ve test
- Swift Package Manager tabanlı birim testleri Xcode derlemesi olmadan çalıştırılabilir
swift test
- macOS uygulamasında hızlı derleme kontrolü imzalama kapalıyken yapılır
xcodebuild -project TZed.xcodeproj \
-scheme TZed-macOS \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NO build
- iOS uygulaması ve widget uzantılarının simülatör derlemeleri de aynı şekilde çalıştırılabilir
xcodebuild -project TZed.xcodeproj \
-scheme TZed-iOS \
-destination 'generic/platform=iOS Simulator' \
CODE_SIGNING_ALLOWED=NO build
CODE_SIGNING_ALLOWED=NOile üretilen geçici imzalı derleme, derleme ve simülatörde çalıştırma için kullanılabilir- Ancak bu derleme Gatekeeper tarafından reddedilir; ayrıca ekip öneki olmadığı için iCloud KVS ve App Group gibi yetkiler bağlanmaz, dolayısıyla dağıtım için kullanılamaz
Gerçek iPhone’a headless dağıtım
- iOS cihaz dağıtımında Mac uygulamalarındaki gibi notarizasyon adımı yoktur; bunun yerine
xcodebuildvedevicectlkullanılır - Gerçek cihaz için uygulama, Apple Development sertifikası ve geliştirme provisioning profile ile derlenip imzalanır
xcodebuild -project TZed.xcodeproj \
-scheme TZed-iOS \
-destination 'generic/platform=iOS' \
-allowProvisioningUpdates \
-derivedDataPath build/ios \
archive -archivePath build/TZed-iOS.xcarchive
- Üretilen
.app, bağlı cihazın UDID’si belirtilerek kurulur
xcrun devicectl device install app \
--device <DEVICE-UDID> build/ios/…/TZed.app
devicectl list devices, bağlı ve eşleştirilmiş cihazları UDID’leriyle gösterir-allowProvisioningUpdatesbelirtildiğinde gerekli geliştirme provisioning profile otomatik olarak alınır
GUI olmadan kod imzalamanın çalışma biçimi
-
Developer ID Application sertifikası oluşturulurken Apple sertifikayı verir, Mac ise karşılık gelen özel anahtarı üretip her ikisini de login keychain içinde saklar
-
xcodebuildtarafından çağrılancodesign, ikili dosyayı özel anahtarla imzalar ve imzalayanın doğrulanabilmesi için Apple kök sertifikasına uzanan sertifika zincirini uygulamaya ekler -
signingStyle: automatickullanıldığındaxcodebuild, ekip kimliğine uygun sertifikayı seçer ve gerekli provisioning profile’ları Apple’dan alır -
Bu nedenle provisioning profile dosyalarını depoya commit etmeye gerek yoktur
-
Yetkiler, notarizasyon ve stapling
- Her hedefin
.entitlementsdosyasında sandbox, ağ istemcisi, iCloud KVS, App Group gibi yetkiler bulunur - Yetkiler gerçek ekip kimliğiyle imzalama sırasında bağlandığı için geçici imzalı derlemelerde iCloud ve App Group düzgün çalışmaz
- İmzalama ile notarizasyon farklı aşamalardır
- İmzalama, uygulamayı kimin yaptığını kanıtlar
- Notarizasyon ise Apple’ın imzalı uygulamayı kötü amaçlı yazılım açısından tarayıp ticket vermesi sürecidir
- Stapling, bu ticket’ı uygulamaya ekleyerek Gatekeeper’ın çevrimdışı durumda da güvenmesini sağlar
- Gizli UI kullanan menü çubuğu uygulamalarında, yani
LSUIElementuygulamalarında notarizasyon XProtect tespitlerinden kaçınmak için gereklidir
- Her hedefin
-
Elle doğrulama komutları
codesign -dv --verbose=4 /Applications/TZed.app spctl -a -vvv -t exec /Applications/TZed.app stapler validate /Applications/TZed.appcodesign, imzalayanı ve sertifikayı kontrol ederspctl, Gatekeeper’ın çalıştırmaya izin verip vermeyeceğini denetlerstapler validate, notarizasyon ticket’ının eklenip eklenmediğini doğrular
Ajanın çalıştırdığı standart araçlar
- Ayrı bir derleme MCP sunucusu veya özel eklenti gerekmez; Claude Code etkileşimsiz kabuk içinde standart CLI araçlarını çalıştırır
- Kullanılan araçlar
xcodebuild,xcrun notarytool,xcrun stapler,spctl,codesign,devicectl,xcodegen,swiftaraçlarıdır CLAUDE.md, notarizasyon profil adlandırma kuralını, hızlı derleme ile gerçek dağıtım arasındaki farkı ve dağıtımdarelease.shkullanılması gerektiğini ajana aktarır- Yalnızca ilk
notarytool store-credentialsadımı etkileşimli kalır; sonraki sürecin tamamı otomatikleştirilebilir
Xcode GUI işlemlerini CLI ile değiştirmek
- Xcode’un yönettiği
.xcodeprojüretimi,project.ymlvexcodegen generateile değiştirilebilir ⌘Bveya Run düğmesi,xcodebuild … buildkarşılığıdırProduct → Archive,xcodebuild … archiveile yapılır- Organizer’daki uygulama dağıtımı,
xcodebuild -exportArchiveile değiştirilebilir - Organizer yüklemesi,
xcrun notarytool submit --waitile yapılır - Otomatik ticket eklemek için
xcrun stapler staplekullanılır /Applicationsiçine sürükle-bırak kurulum süreci,cp -Rvelsregisterile yürütülür- Gerçek iPhone’da Run işlemi,
xcodebuild archivevedevicectl device installile değiştirilir - Xcode ve XcodeGen kurulumu, ilk kimlik bilgisi ayarları,
release.shveCLAUDE.mdyazımı tamamlandıktan sonra yeni derleme dağıtımları artık tek bir cümle veya tek bir komutla çalıştırılabilir
1 yorum
Hacker News yorumları
Sandbox içinde çözülemeyen çok şey olduğu için yapay zeka ajanlarını doğrudan Mac üzerinde çalıştırıyorum; ancak xAI'ın SSH anahtarları da dahil home dizinini yüklediği olay, bu tercihi ciddi biçimde yeniden düşünmeme neden oldu
Makinenin kendisinin bozulması beni çok endişelendirmiyor. Çoğunu yedekliyorum ya da Git'e commit'liyorum; bu yüzden birkaç saat içinde geri yükleyebilirim. Ama
.sshdizininin yapay zeka ajanına gönderilmesini kesinlikle istemem; bunu prompt'larla engellemeye çalışmak yerine sistem seviyesinde engellemek gerekir. Ayrı bir kullanıcı oluşturup home dizinine700izni vermeyi düşünüyorum. Güvenlik sanki 1990'lara geri dönmüş gibi, ama karşılığında işleri eşi benzeri görülmemiş bir hızla bitirebilmenin iki taraflı bir durumu var. Ben de bu riskli yöntemi kullandığım için kimseyi suçlamaya çalışmıyorumPaketlenmiş çözüm olarak açık kaynak Tart https://tart.run/ veya VirtualBuddy https://github.com/insidegui/VirtualBuddy kullanılabilir; ya da OS API'sini https://developer.apple.com/documentation/virtualization saran bir aracı kendiniz vibe coding ile yazabilirsiniz. Son zamanlarda Apple container da çıktı https://github.com/apple/container
agentadlı ayrı bir kullanıcı olarak çalıştıran bir wrapper aracı yapıyorum. 1 yıl önce OAuth ve keychain yüzünden başarısız olmuştum, ama yakın zamanda Claude'unCLAUDE_CODE_OAUTH_TOKENkullanılabileceğini belirtmesiyle bunu hayata geçirmeyi başardımACL ile yetkileri ayarlayan yardımcı bir araca ihtiyaç var, ama şu an macOS'ta çalışıyor. Risk düzeyi, varsayılan Claude sandbox'ı ile tam container/makine izolasyonunun ortasında bir yerde. Claude'un kendi sandbox'ı iyileştikçe bu çift savunma projesinin yatırım/getiri oranından şüphe etmeye başlamıştım, ama home dizini sızıntısı ihtimalini görünce devam etmek için fazlasıyla neden var. Henüz açık kaynak olarak yayımlamadım, ama ilgilenenlerle konuşmaya hazırım
Eğlencesine yalnızca Linux kullanarak iOS uygulaması derleyip test ediyorum; şaşırtıcı derecede basit ve https://github.com/xtool-org/xtool son derece iyi çalışıyor
TestFlight veya App Store'a yüklemek gerekmiyorsa, Linux'tan da USB üzerinden doğrudan iPhone'a kurulum yapılabiliyor. Emin değilseniz, işe başlamak için coding agent'tan bir Hello World iOS uygulaması oluşturup yüklemesini istemek yeterli
Açık kaynak projem Axiom, coding execution araçlarının Apple işletim sistemlerine yönelik geliştirme işlerini etkili biçimde yapmasına yardımcı oluyor
Çeşitli teknolojiler ve ajanların yanı sıra, LLM araçları olan
xclog,xcprof,xcsym,xcuide içeriyor. Bunlar gerekli işlevleri token açısından verimli biçimde açığa çıkarıyor ve Axiom dışındaki teknolojiler ya da ajanlar için de faydalı. Axiom: https://charleswiltgen.github.io/Axiom/, CLI araçları: https://charleswiltgen.github.io/Axiom/tools/“Claude Code'a, Xcode'u açmadan arşivleme, Developer ID ile imzalama, notarization, stapling,
/Applicationskurulumunu yapan ve herhangi bir adım başarısız olursa net biçimde duran bir script yazdırdım” cümlesini okuyunca tuhaf hissettirdi. Çünkü şu anda okuduğum yazının kendisi de sanki Claude'un bize konuşması gibiYazının neredeyse her adımında “Claude Code'a ya da istediğiniz LLM coding aracına bu yazıyı gösterip halletmesini isteyin”, “Bilmiyorsanız LLM'e sorup ayarı yaptırın”, “LLM kullanmanın amacı istenmeyen manuel işi önlemek”, “Bir workflow oluşturmasını isteyin” gibi yeniden LLM'e sormayı öneren yönlendirmelerin tekrarlanması da garip geliyor
1 yıldan uzun süredir ajanlarla Mac ve iOS uygulamaları geliştiren biri olarak bunun iyi bir tavsiye olmadığını düşünüyorum. Özellikle de mükemmel Xcode MCP'nin çalışabilmesi için Xcode'un açık olması gerekir
MCP araçlarını kullanınca
xcodebuilde göre çok daha hızlı ve sade biçimde çeşitli özelliklere erişilebiliyor; ayrıca Xcode kapalıyken mümkün olmayan#Previewoluşturma ve render etme de yapılabiliyor. Xcode 27'nin MCP'si ve yerleşik ajanı, DeviceHub üzerinden simülatörleri de çok iyi kontrol ediyor. DeviceHub, Simulator.app'in yerini alıyor; ajanlarınaxegibi araçlarla erişilebilirlik API'lerini dolaylı yoldan kurcalamaya gerek kalmadan bunu anlayıp yönetebildiği görülüyorXcode MCP kusursuz değil. Ajanı her çalıştırdığımda yetki penceresinin açılması sorununu Keyboard Maestro ile otomatik onay verdirerek aştım. Yine de Xcode 27, Xcode vibe coding'in kullanılabilirliğini ciddi biçimde iyileştirdi. Artık MCP'yi ayrı yönetmek yerine doğrudan Xcode'un kendi ajan arayüzünde Codex çalıştırıyorum; bu çalışma ortamı modeli daha iyi yönlendirip kullanılabilir araçlardan yararlanmasını sağlıyor. Sonuçta en önemli iki şey olan daha hızlı geri bildirim ve daha sağlam doğrulama elde ediliyor
Xcode-mcp-proxyvar; Xcode MCP için proxy görevi görüyor. macOS uygulama testlerinde Peekaboo mu kullanıyorsunuz, yoksa normal ekran görüntüsü otomasyonunu mu, merak ettimiOS ve Android IDE'lerine mümkün olduğunca az dokunmak istiyorsanız React Native ve Expo da iyi bir seçimdir
Xcode ve Android Studio yalnızca cihaz simülatörlerini kurarken kullanılıyor; mağaza dağıtımına kadar geri kalan her şeyi Expo araç zinciri hallediyor. Xcode'un kurulamadığı Windows'ta bile Expo'nun yönetilen uygulama yapısıyla iOS uygulamalarını doğrudan iPhone'da çalıştırabilirsiniz. RN ve Expo tabanlı bir başlangıç noktası olarak bakımlı Ignite çok başarılı: https://github.com/infinitered/ignite
Teknik olarak hâlâ Xcode kullanıyorsunuz. Xcode, çoğunlukla kararlı çeşitli sistem düzeyi UNIX yardımcı araçlarını ve uygulamaları saran, ama kendisi oldukça hatalı bir GUI
Uygulamayı CLI ile yayımlamak eski bir pratik; en azından benim ilk Xcode uygulamamı yayımladığım 2012'den beri mümkündü
En azından bazı hata ayıklama işleri için herkesin Xcode kullanması kaçınılmaz
Derleme tarafını ajan zaten büyük ölçüde komut satırından halledebiliyor; duruma göre açık talimatlar verirseniz daha da hızlı derleyebilir. Xcode'un dosya sistemi senkronizasyon gruplarını kullanıyorsanız XcodeGen gereksiz ek iş olabilir
iOS'ta ajanlara eklenmesini en çok önereceğim şey App Store Connect işlevleri: https://github.com/rorkai/App-Store-Connect-CLI. Böylece yalnızca Xcode'u sürekli açık tutmak zorunda kalmazsınız; MacBook'un yakınında olmanız da gerekmez. iPhone'da Codex ile değişiklik yaptıktan sonra
ascile derleme ve TestFlight yüklemesini başlatır, yeni sürümü indirip çalıştırır ve bu döngüyü sürdürürsünüzBütçesi yetmediği için Mac alamayan geliştiricilerin fiilen iOS geliştirme dışında kalması beni hâlâ rahatsız ediyor. Apple ürünleri her zamlandığında geliştirme sürecine katılamayan insan sayısı artıyor
Uygulamayı vibe coding ile geliştirecekseniz, uzun vadede Expo daha iyi bir tercih olurdu. React tabanlı olduğu için LLM eğitim verilerinde React kodu Swift'ten çok daha fazla; bu da ortaya çıkan kodun kalitesini yükseltiyor
Her şeyi komut satırından yapabilirsiniz ve web view olduğu için hata ayıklaması da kolaydır. Native iOS uygulaması olarak derlendikten sonra diğer native uygulamalara oldukça benzer hissettirir. Expo ve Fastlane birlikte kullanıldığında iOS gönderim ve dağıtımını tamamen otomatikleştirebilir; tek bir komutla App Store'a yeni sürüm yükleyebilirsiniz