App Store sorunlarına gönderme: Desteklenmeyen Mimari x86


253

Bu yüzden Shopify API'sını kullanmaya çalışıyorum. Uygulamayı arşivlediğimde ve doğruladığımda hiçbir sorun yok, ancak uygulama mağazasına gönderdiğimde bana aşağıdaki sorunları veriyor.

  1. HATA ITMS-90087: "Desteklenmeyen Mimari. Yürütülebilir dosya desteklenmeyen '[x86_64, i386]' mimarisi içeriyor."
  2. HATA ITMS-90209: "Geçersiz segment Hizalama. SJAPP.app/Frameworks/Buy.framework/Buy adresindeki Uygulama İkili dosyası, uygun segment hizalamasına sahip değil. Uygulamayı en son Xcode sürümüyle yeniden oluşturmayı deneyin." (Zaten son sürümü kullanıyorum.)
  3. HATA ITMS-90125: "İkili geçersiz. LC_ENCRYPTION_INFO load komutundaki şifreleme bilgisi eksik veya geçersiz veya ikili zaten şifreli. Bu ikili Apple'ın Bağlayıcısı ile oluşturulmuş gibi görünmüyor."
  4. UYARI ITMS-90080: "Yürütülebilir Yük /..../ Buy.framework Bağımsız Bir Yürütülebilir Konum Değil. Lütfen ur derleme ayarlarının PIE yürütülebilir dosyaları oluşturmak üzere yapılandırıldığından emin olun."

4
İlk mesaj bir simülatör derlemesi gibi geliyor.
Phillip Mills

Sunum için bir arşiv oluşturduğumda, cihaz seçeneklerinde iOS cihazlarını seçiyorum, sonra da sorduğunuz şey varsa bir arşiv oluşturuyorum
Saurabh Jain

2
@PhillipMills ile hemfikirim. İlk hatanıza konsantre olun. İOS uygulamanızda neden bir x86_64 ikili dosyası var? Ya yapı ayarlarınızda garip bir şey yaptınız ... ya da bir Simülatör yapısı yüklediniz.
Stephen Darlington

@ pAkY88. Yapacak durumda değildim. Geçenlerde Shopify API forumunda yayınladım ve bir yanıt bekliyorum. Biriyle karşılaşırsam kesinlikle bir şeyler
yayınlayacağım

Bu davranış, Application Loader 3.5
SudoPlz

Yanıtlar:


395

Sorun, Buy çerçevesinin hem simülatör (x86_64) hem de gerçek cihazlar (ARM) için bir yapı içermesidir.

Tabii ki, desteklenmeyen bir mimari için App Store'a bir ikili dosya göndermenize izin verilmez, bu nedenle çözüm, gereksiz mimarileri göndermeden önce son ikili dosyadan "manuel olarak" kaldırmaktır.

Daniel Kennett güzel bir çözüm buldu ve bu senaryoyu yapım aşamasına eklemek için sağlar:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
    echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

    EXTRACTED_ARCHS=()

    for ARCH in $ARCHS
    do
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    done

    echo "Merging extracted architectures: ${ARCHS}"
    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
    rm "${EXTRACTED_ARCHS[@]}"

    echo "Replacing original executable with thinned version"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

Ben kullandım ve mükemmel çalıştı.

DÜZENLEME: Varrry tarafından yayınlanan değiştirilmiş komut dosyasına baktığınızdan emin olun, çünkü bunun bazı küçük sorunları vardır.


6
@ pAkY88 Bu komut dosyasını yukarıda belirtilen App Store Sorunlarını düzeltmek için Xcode projemde kullandım, ancak şimdi Build'a gittiğimde ölümcül hataların bir sürü var -> ölümcül hata: lipo: giriş dosyası (/ ... Frameworks / Bolts.framework / Bolts), -extract seçeneği belirtildiğinde yağ dosyası olmalıdır. Bunu nasıl düzeltebileceğine dair bir fikrin var mı?
SamoanProgrammer

52
Bence çok aptalca: uygulamanızın hem simülatörde hem de cihazda çalışmasına izin vermek için kol + x86'yı birleştirmeniz ve uygulama mağazasına göndermek için x86'yı çıkarmanız gerekiyor. Apple, x86 algılandığı sürece şeridi neden yapmıyor? Bunu savunmak için birçok teknik nedene yardımcı olabilirler, ancak kullanıcı dostu olmadığı için hiçbir ticari neden yoktur.
superarts.org

5
@Skoua İlgili hedefi seçin, ardından "Aşama Oluştur" ve "Çerçeveleri Göm" işleminden sonra koyun
Piotr Tobolski

6
Yukarıdaki komut dosyası yararlıdır, ancak komut dosyasını Xcode'da çalıştırma adımları hakkında hiçbir yerde bahsedilmemiştir. Bu komut dosyasını çalıştırmak için HEDEFLER'e gidin -> Oluşturma Aşamaları'nı seçin, ardından Xcode'da üst üstbilgiyi düzenleyin -> Oluşturma aşamaları ekle -> Çalıştırılan komut dosyası oluşturma Aşamaları ekle ve TARGET'in Oluşturma Aşaması bölümünde bir sütun alacaksınız. Burada yukarıdaki komut dosyasını kopyalayabilir ve başarıyla Appstore'a yükleyebilirsiniz.
shashi Gupta

5
Xcode 11.2'de çalışmıyor - kimse bir çözüm buldu mu?
JMIT

180

PAkY88 tarafından verilen cevap işe yarıyor, ancak https://stackoverflow.com/a/35240555/5272316 adresinde Mario A Guzman ile aynı sorunla karşı karşıya kaldım : Kullanılmayan mimarileri kestikten sonra artık kaldırmaya çalıştığından komut dosyasını çalıştıramayız mevcut olmayan dilimler yoktur, çünkü xcode her seferinde ikili kodları yeniden gömmez. Fikir - sadece arşiv için inşa ederken i386 ve x86_64 dilimleri kaldırmak, bu yüzden komut dosyasını değiştirdim:

echo "Target architectures: $ARCHS"

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")

FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"

# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
    echo "No need to remove archs"
    ;;
*)
    if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
    lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
    echo "i386 architecture removed"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
    lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
    echo "x86_64 architecture removed"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    ;;
esac

echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")

done

Bu komut dosyası, simülatör için çalıştırılmazsa (varsa hedef klasör "Hata Ayıklama-iphonesimulator" gibi değildir), i386 ve x86_64 dilimleri yağ ikili dosyasından (varsa) kaldırır.

Maalesef, kabuk komut dosyalarına aşina değilim, bu yüzden birisi daha zarif bir şekilde yazabilir. Ama işe yarıyor)


1
Fikir için teşekkürler. Ben sadece while döngüsü içinde kabul edilen cevap koduna bir kontrol ekledim case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacve bir cazibe gibi çalıştı.
Michael Radionov

Bu komut dosyasını ekliyorum TARGET -> Build Phases -> [CP] Embedded Pods Frameworksama çalışmıyor ve iTunesConnect hatalarına hala yüklüyorum. Bu komut dosyası nasıl çalıştırılır?
PiterPan

2
PiterPan, ayrı bir RunScript aşaması olarak ekleyin
Varrry

1
Ben sadece "Sadece yükleme sırasında script çalıştır" seçeneğini işaretledim ve arşivleme hariç atlanır.
Rivera

Burada önerilen her şey, Carthage hatasını temizlemeyi başardı; ancak neden başarısız olduğuna ilişkin bazı yararlı bilgiler almak için doğrulama olmadan App Store'u yüklemeniz gerekiyordu. Bunu düzeltmek ve ilerlemek için yönetilen ...
user3069232

90

Carthage kullanıyorsanız , proje şöyle olduğundan bu sorunla karşılaşabilirsiniz:

  • İnşa carthage copy-frameworksaşaması eksik .
  • Ya da derleme aşaması tüm çerçeveleri içermez (eksik liste).

Bu eylem, çerçeveleri geçerli mimariler listesine (kod) filtreler .

Kopya çerçeve oluşturma aşamasını ayarlama

Gönderen iOS adımlar için Kartaca binasının :

Uygulama hedeflerinizin "Derleme Aşamaları" ayarları sekmesinde, "+" simgesini tıklayın ve "Yeni Çalışma Betiği Aşaması" nı seçin. Kabuğunuzu (ör: bin / sh) belirttiğiniz bir Çalıştırma Komut Dosyası oluşturun, kabuğun altındaki komut dosyası alanına aşağıdaki içerikleri ekleyin:

/usr/local/bin/carthage copy-frameworks

ve "Girdi Dosyaları" altında kullanmak istediğiniz çerçevelere yolları ekleyin, ör:

$(SRCROOT)/Carthage/Build/iOS/Box.framework $(SRCROOT)/Carthage/Build/iOS/Result.framework $(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework

Bu komut dosyası, evrensel ikili dosyalar tarafından tetiklenen bir App Store gönderme hatası etrafında çalışır ve arşivleme sırasında gerekli bit koduyla ilgili dosyaların ve dSYM'lerin kopyalanmasını sağlar.


Ek bir not olarak, son zamanlarda üçüncü bir çerçevenin eski, önceden derlenmiş bir sürümünü kullanmaktan Carthage kullanılarak yüklenen aynı çerçevenin yeni bir sürümüne geçerek bu sorunla karşılaştım. Carthage tamamen kurulduktan sonra bile bu hatayı almaya devam ettim. Benim için düzeltme, çerçeveyi projeden tamamen kaldırmak ve tekrar eklemekti. Carthage kullanıyorsanız ve bu cevap sizin için düzeltmiyorsa, bunu deneyin.
Ash

1
Gerçekten harika bir gönderi. Çoğu zaman en iyi bahsinizin tüm çerçeveleri kaldırmanız ve tüm çerçeveleri yeniden Carthage'dan eklemeye başlamanız gerektiğini unutmayın. Şerefe
Fattie

Ben Carthage ve Marshal kullanarak ve ekliyorum $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkyaptığı işi
Ricardo Mutti

Modern iOS'ta, sorunun% 99'u bu - kopya çerçevelerini unuttun. (Projelerin% 100'ü artık Carthage kullanıyor.)
Fattie

41

Gömülü İkilikler bölümünden (Xcode hedefi -> Genel sekmesi) bir çerçeveyi (mükemmel SVProgressHUD) kaldırarak ITMS-90080 hatasını çözdüm.

resim açıklamasını buraya girin


5
Bu cevabın daha fazla oyu olmalı. Carthage kullanan birçok insanın temel nedeni olduğundan şüpheleniyorum.
mm2001

15
Dinamik bir çerçeve yerleştirmeye çalışıyorsanız, bunu kaldırmak benim için şu hata iletisiyle sonuçlanır: "Neden: resim bulunamadı"
electronix384128

1
Bu benim için çalıştı. Çerçeveyi Gömülü İkililer'den kaldırmanız ve sadece Bağlı Çerçeveler ve Kütüphanelere eklemeniz gerekir. Ayrıca, diğer yanıtlarda bulduğunuz komut dosyasını çalıştırmak gibi diğer şeyleri de yapmanız gerekir.
smileBot

33

Eğer kullanıyorsanız Carthageemin olun Embed Frameworks Build StepöncedirCarthage copy-frameworks


Bazı olağandışı durumlarda (örnek: Lottie-iOS çerçevesi):

  • her zamanki gibi sadece "Link Library" de olacak.

  • Ancak bunu yapmak zorunda da açıkça "Yerleştir Çerçeveleri" olarak ekleyin, (yalnızca "Yerleştir Çerçeveler" içinde var zaman mükemmel çalışıyor beri bu anlamsız görünüyor olsa bile)

  • ve kopya çerçevelerine koy

  • ve kopya çerçevelerinin "Çerçeveleri Yerleştir" ardından


Bu şekilde benim sorunum. Teşekkür ederim.
DookieMan

15

Aşağıdaki adımı kullanarak [x86_64, i386] çerçevesinden kaldırın . [x86_64, i386] simülatör için kullanılmıştır.

  1. Açık Terminal

  2. ilgili çerçevenin proje sürükleme yolunuzu Terminal'e açın

    misal : cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. Framework adınızı aşağıdaki komutta ayarlayın ve çalıştırın

lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire

  1. Şimdi projenizi tekrar açın, Temizleyin, Oluşturun ve Çalıştırın ve Arşiv Oluşturun ...

@mahipal Singh .. lipo komutunu kullanarak kaldırdıktan sonra. uygulaması simülatörde çalışmıyor. iphone simülatörü eksik x84_64 gibi hata var. ama gerçek cihazda iyi çalışıyor.
Hitarth

Simülatörün sadece hata ayıklama çerçevesini desteklemesi
MAhipal Singh

14

Benim 2 sent buraya (daha az korkutucu bir şekilde :-) ekleyeceğim. FrameworksApple tarafından belgelendiği gibi dizine onları ekleyerek (bazı nedenlerden dolayı) normal şekilde çalışmaz satıcıları yağ şişeleri oldukça sayıda karşılaştım . Onlara işi yapmak mümkün olmuştur tek yolu çekerek olan .framekworkproje dizine sağ ve bağlama Embedded Frameworksve Link Binary with LibrariesYapı Ayarlar elle. Bu herhangi bir sorun olmadan işe yaramış gibi görünüyor, ancak herhangi bir yağ kütüphanesinde olduğu gibi yabancı Simülatör Mimarileri i386 ile x86_64birlikte geliyorlar vearm mimarileri .

Yağ kütüphanesindeki mimarileri kontrol etmenin hızlı bir yolu

$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`

Hangi çıktıyı böyle bir şey tükürmeli

Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64

Bu, "yağı azaltmanız" gerektiğini (yani i386&x86_64 , iTunesConnect Archival yüklemesinden önce bu mimarilere izin vermeyen (iOS için desteklenmediği için) ) çerçevenizden .

Şimdi, tüm cevaplar (veya cevapların en azından bir kısmı), bu harika Run Scriptlerini gerçekten iyi çalıştığından eminim, ancak sadece Çerçeveniz Frameworksdizinde bulunuyorsa. Eğer bir kabuk senaryosu bağımlısı değilseniz, modifikasyonları olmayan bu senaryolar, yukarıda açıkladığım senaryo için çalışmaz. Ancak, i386& x86_64mimarilerden çerçeveden kurtulmanın çok basit bir yolu var .

  1. Projenizin dizinindeki terminali açın.

  2. Doğrudan içine Değişim dizin .framekworkgibi

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. Komut serilerini aşağıda gösterildiği gibi çalıştırın.

$ mv YourLibrary YourLibrary_all_archs
$ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo -remove i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs

Burada dikkat edilmesi gereken birkaç şey - lipo -removeher mimarinin kaldırılması için bir kez yapılması gerekir. lipogirdi dosyasını değiştirmez, yalnızca bir dosya oluşturur, bu nedenle ve lipo -removeiçin bir kez çalıştırmanız gerekir . Yukarıdaki komutlar bunu önce çalıştırılabilir dosyayı yeniden adlandırarak ve ardından istenen kemerleri kaldırarak ve ardından soldaki dosyaları temizleyerek yapıyor. İşte bu kadar, şimdi iTunesConnect'e Uygulama Yükleyici Arşivi yüklemesinde yeşil bir onay işareti görmelisiniz.x86_64i386

Akılda tutulması gerekenler: Yukarıdaki adımlar sadece üretim inşa edilirken yapılmalıdır, çünkü .frameworksimülatör mimarilerinden arındırılacak, simülatörler üzerine inşalar çalışmayı durduracaktır (beklenen). Geliştirme ortamında, .frameworkhem Simülatörde hem de fiziksel bir cihazda test yapabilmek istediğiniz için mimarileri dosyadan ayırmaya gerek yoktur. Yağ kütüphaneniz Frameworksprojedeki klasörde bulunuyorsa, lütfen kabul edilen cevaba bakın.


Senaryo gibi hissetmeyenler için basit bir çözüm.

sadece yukarıdaki komutu çalıştırın, kemer boyutu yarıya düşürüldü. umarım biraz fark yaratır.
showmyroutes

Düz-se bile ben her şeyi normal çalışması için komut dosyası dağıttı ama bu sorunu çözmek için uygun bir açıklama olması gerekir.
Sharkes Monken

bu cevabın doğasını seviyorum. temiz ve özlü
Hudi Ilfeld

10

Komut dosyasını ekledikten ve çerçeveyi birkaç kez güncelledikten sonra bile aynı sorunu yaşadım.

XCode'da komut dosyasının gömme işleminden sonra sonuna eklendiğinden emin olun. Bence senaryoyu gömülü çerçeveden önce yanlışlıkla taşıdım.

resim açıklamasını buraya girin

Not: xCode 9.1 kullanıyorum


Bu benim için çalıştı. Sadece @ pAkY88'in senaryosu son kez yeterliydi, neredeyse bir yıl önce bir sürüm yaptım.
RedHotPawn.com

Aynı sorunu yaşadım ve bu benim için çalıştı. Bir çerçeve her kaldırıldığında ve eklendiğinde çalıştırma komut dosyasının konumunu kontrol ettiğinizden emin olun (yalnızca kaldırılan tek bir çerçeve olduğunda gereklidir).
Baran Emre

Sen benim günümü kurtar. Sadece gömülü çerçeveden sonra komut dosyası eklemek için.
Mayuri R Talaviya

8

Xcode 10.1 için güncellendi, Aşağıdaki çözüm benim için çalıştı:

Çerçeveyi Gömülü İkililer'den kaldırmanız ve Bağlantılı Çerçeveler ve Kütüphanelere eklemeniz yeterlidir.

Aşağıdaki ekran görüntüsüne bakın;

resim açıklamasını buraya girin


1
Benim için çalışma çözümü (y)
Alok

aynısını bağlantılı çerçevelerden ve kütüphanelerden kaldırır
Ranu Dhurandhar

8

Yukarıdaki tüm cevaplar için teşekkürler. İşte hızlı 4.2 ve 5 ile çalışan bir script . Çerçeveniz_Ad dizenizi Framework'ünüzün orijinal adıyla değiştirin.

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
FRAMEWORK_NAME="Your_Framework_Name.framework"
# Check if Framework is present.
FRAMEWORK_LOCATION=$(find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d)
if [ -z $FRAMEWORK_LOCATION ]; then
echo "Couldn't find Your_Framework_Name.framework in $APP_PATH. Make sure 'Embed Frameworks' build phase is listed before the 'Strip Unused Architectures' build phase."
exit 1
fi
# This script strips unused architectures
find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done

Teşekkür ederim! Bu benim için çalıştı, kabul edilen cevap olmadı.
besserwisser

5

Bu sorun, çalışma komut dosyasını pAky88'in cevabından biraz değiştirerek ve çerçeveleri katıştırdıktan sonra yürüterek benim için çözüldü. Ayrıca "Komut dosyasını yalnızca yüklerken çalıştır" kutusunun işaretini kaldırdığınızdan emin olun.

/usr/local/bin/carthage copy-frameworks

#!/usr/bin/env bash

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"

if [ ! -f "${FRAMEWORK_EXECUTABLE_PATH}" ]; then
continue
fi

if xcrun lipo -info "${FRAMEWORK_EXECUTABLE_PATH}" | grep --silent "Non-fat"; then
echo "Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME"
continue
fi

echo "Thinning framework $FRAMEWORK_EXECUTABLE_NAME"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
xcrun lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
xcrun lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done

4

İ386 ve x64_86 mimarilerini Build Settings - Valid Architectures - Release'den kaldırdım ve her şey yolunda gitti.

resim açıklamasını buraya girin

Şimdi tek sorun , bir SIMULATOR üzerinde test amacıyla bir RELEASE derlemesi çalıştıramayacağınızdır . Ancak kemerleri çıkardığınız kadar kolay, isterseniz geri ekleyebilirsiniz.


1
EVET, çözüm.
Ofir Malachi

3

benim için çalışan basit çözüm

1- çerçeveyi gömülü çerçevelerden çıkarın.

2- Çerçeveyi bağlantılı bir çerçeve olarak eklemek

bitmiş!


1

Bu hata (ITMS-90240) statik (.a) kitaplığından da kaynaklanabilir. fazla mimarileri soymak için bir senaryo var. Xcode'da bunu Hedef> Oluşturma Fazları> 'na ekleyin ve +' yı tıklayın ve Komut Dosyasını Çalıştır'ı seçin. Sonra bunu kod kutusuna yapıştırın.

Komut dosyası .a dosyalarını arar, soruna neden olan bir mimari içerip içermediğini denetler, daha sonra bu mimari olmadan yeni bir .a dosyası oluşturur.

MacOS için:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="armv7 armv7s arm64"
for t in $STRIPARCHS
do

if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
    find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi

done

exit 0

İOS için:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="x86_64 i386"
for t in $STRIPARCHS
do

if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
    find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi

done

exit 0

1

Ben de aynı sorunu yaşadım. Hatta verilen Run Script'i ekledikten sonra bile çalışmadı. Xcode ile ilgili bir sorundu. Xcode sürüm 9.0 kullanıyordum ama en son sürüm 9.2 idi.

Bu yüzden son Xcode'u (9.2) yükledim ve çalıştı.


0

Kişisel çerçeve içeren hem ARMvex86 bir cihazda veya simülatör kullanmak için izin verir kod. Uygulamanızı App Store'a göndermek istiyorsanız, etkin olmayan kodu ikili dosyadan çıkarmak için aşağıdaki komut dosyasını çalıştırın.

1.Proje Gezgini'nde hedefinizi seçin ve proje düzenleyicisinin üst kısmındaki Aşamaları Oluştur'u tıklayın.

Editör menüsünden Derleme Aşaması Ekle'yi, ardından Çalıştırma Betiği Derleme Aşaması Ekle'yi seçin (veya Derleme Aşamaları düzenleyicisinin sol üst köşesindeki + düğmesini tıklayın).

Az önce eklenen yeni Komut Dosyası Çalıştır derlemesi aşamasının yanındaki açıklama üçgenini genişletin. Komut dosyası düzenleyici kutusuna aşağıdakileri yapıştırın: bash

$ {BUILT_PRODUCTS_DIR} / $ {FRAMEWORKS_FOLDER_PATH} / "ÇerçevesizAdı. Çerçeve" /strip-frameworks.sh


Bu strip-frameworks.sh betiğinin orada olduğunu varsayar ...
Codezy

0

Burada, yalnızca bir çerçevenin mimarisini yürütülebilir dosyadan kaldırmak için kullandığım bir komut dosyası var.

# Remove unused Framework architecture from "YourApp" framework.

FRAMEWORK_EXECUTABLE_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Frameworks/YourApp.framework/YourApp"

echo "$FRAMEWORK_EXECUTABLE_PATH"

cp "$FRAMEWORK_EXECUTABLE_PATH" "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

echo "Executing following command to remove x86_64 arch from YourApp framework executable"
echo "lipo -remove x86_64 \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"${FRAMEWORK_EXECUTABLE_PATH}_X86_64\""

lipo -remove x86_64 "${FRAMEWORK_EXECUTABLE_PATH}_X86_64" -o "$FRAMEWORK_EXECUTABLE_PATH"

rm "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

Bu komut dosyasını, proje hedefinizin "Aşamaları Oluştur" projelerinize ekleyin. "Komut dosyasını yalnızca yüklerken çalıştır" kutusunu işaretlediğinizden emin olun.

Örnek komut dosyasının nereye ekleneceğinin önizlemesi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.