TL; DR;
Yayın modu için bile kitaplıklarınız / uygulamalarınız için ONLY_ACTIVE_ARCH
" Yalnızca Aktif Mimari Oluştur ( )" seçeneğini Evet olarak ayarlayın.
Sorunun temel nedenini belirlemeye çalışırken Xcode 12 hakkında bazı eğlenceli gerçekleri fark ettim.
Xcode 12, Apple Silicon için maalesef henüz mevcut olmayan bir atlama taşıdır. Ancak bu platformla, simülatörlerin mevcut Intel tabanlı x86_64 mimarisinden farklı olarak arm64 mimarisi üzerinde de çalışacağı arm64 tabanlı macOS alacağız.
Xcode, kitaplıklarını / uygulamalarını oluşturmak için genellikle "Hedefi Çalıştır" a bağlıdır. Dolayısıyla, bir simülatör "Çalıştırma Hedefi" olarak seçildiğinde, mevcut simülatör mimarileri için uygulamayı oluşturur ve "Çalıştırma Hedefi" olarak bir cihaz seçildiğinde, cihazın desteklediği mimari için ( arm*
) oluşturur.
xcodebuild
, Xcode 12+ derleme sisteminde arm64
simülatör için geçerli bir mimari olarak kabul edilir. Bu nedenle, çalıştırma hedefi olarak bir simülatör seçildiğinde, kitaplıklarınızı / uygulamalarınızı arm64
temelli simülatörlere karşı da derlemeyi / bağlamayı deneyebilir (henüz mevcut değil). Bu nedenle , <architecture> - <os> - <sdk> - <platform> biçiminde olduğu clang(++)
gibi bir hedef bayrağı gönderir arm64-apple-ios13.0-simulator
ve clang, sonunda Intel tabanlı Mac'te başarısız olan arm64 tabanlı simülatöre karşı derleme / bağlantı kurmaya çalışır.
Ancak xcodebuild
bunu yalnızca Sürüm yapıları için dener . Neden? Çünkü, "Yalnızca Etkin Mimari Oluştur ( ONLY_ACTIVE_ARCH
)" derleme ayarları genellikle yalnızca "Yayın" yapılandırması için "Hayır" olarak ayarlanır. Ve bu xcodebuild
, sürüm yapıları için seçilen çalıştırma hedefi için kütüphanelerinizin / uygulamalarınızın tüm mimari varyantlarını oluşturmaya çalışacağı anlamına gelir . Ve Simülatör çalıştırmak hedef için, her iki kapsar olacak x86_64
ve arm64
bundan sonra, çünkü arm64
Xcode 12+ da simülatörleri için desteklenen bir mimaridir içinde Apple Silicon'u destekleyecek.
Basitçe söylemek gerekirse, Xcode, komut satırını her denediğinde xcodebuild
(varsayılan olarak derlemeyi yayınlar, proje ayarınızın genel sekmesine bakın) veya başka bir şekilde sürüm modunda uygulamanızı derleyemez. Bu nedenle, bu soruna basit bir çözüm , yayınlama modu için bile kitaplıklarınızda / uygulamalarınızda ONLY_ACTIVE_ARCH
" Yalnızca Etkin Mimari Oluştur ( )" seçeneğini Evet olarak ayarlamaktır .
Kitaplıklar Bölmeler olarak dahil edilmişse ve erişiminiz .podspec
varsa, basitçe şunları ayarlayabilirsiniz:
spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'EVET'}
spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'EVET'} # önerilmez
Ben şahsen ikinci satırı sevmiyorum çünkü bölmeler hedef projeyi kirletmemeli ve hedef ayarlarda geçersiz kılınabilir. Bu nedenle, ayarı bir şekilde geçersiz kılmak tüketici projesinin sorumluluğunda olmalıdır. Ancak, podspec'lerin başarılı bir şekilde lintlenmesi için bu gerekli olabilir.
Ancak, öğesine erişiminiz yoksa .podspec
, bölmelerin kurulumu sırasında ayarları her zaman güncelleyebilirsiniz:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
Kitaplıkları / uygulamaları gerçekten arşivlediğimizde bunun etkisinin ne olacağı konusunda endişelendiğim bir şey var. Arşivleme sırasında uygulamalar genellikle "Yayın" konfigürasyonunu alır ve bu, yalnızca geçerli çalışma hedefinin aktif mimarisini dikkate alan bir sürüm yapısı oluşturacağından, bu yaklaşımla, hedef derlemeden armv7, armv7, vb. Dilimlerini kaybedebiliriz. Ancak, herhangi bir özel mimari tanımlamadığından, çalışma hedefi olarak "Genel iOS Aygıtı / Herhangi Bir Aygıt" ı seçtiğimizde bu ayarın yok sayılacağını (ekteki resimde vurgulanmıştır) bildiren belgelerin farkına vardım. Bu yüzden, uygulamamızı bir çalışma hedefi olarak seçerek arşivlersek iyi olacağımızı düşünüyorum.