Kirim ke masalah App Store: Arsitektur Tidak Didukung x86

253

Jadi saya mencoba menggunakan API Shopify. Ketika saya mengarsipkan aplikasi dan memvalidasinya maka tidak ada masalah tetapi ketika saya mengirimkannya ke app store maka itu memberi saya masalah berikut.

  1. ERROR ITMS-90087: "Arsitektur Tidak Didukung. Eksekusi Anda mengandung arsitektur yang tidak didukung '[x86_64, i386]'."
  2. ERROR ITMS-90209: "Alignment segmen tidak valid. App Binary di SJAPP.app/Frameworks/Buy.framework/Buy tidak memiliki keselarasan segmen yang tepat. Cobalah membangun kembali aplikasi dengan versi Xcode terbaru." (Saya sudah menggunakan versi terbaru.)
  3. GALAT ITMS-90125: "Biner tidak valid. Info enkripsi di perintah load LC_ENCRYPTION_INFO hilang atau tidak valid, atau biner sudah dienkripsi. Biner ini sepertinya tidak dibuat dengan Apple's Linker."
  4. PERINGATAN ITMS-90080: "Payload yang Dapat Dieksekusi / ........../ Buy.framework bukanlah Posisi yang Dapat Dieksekusi Independen. Harap pastikan bahwa pengaturan build Anda dikonfigurasikan untuk membuat executable PIE."
Saurabh Jain
sumber
4
Pesan pertama terdengar seolah-olah itu adalah simulator build.
Phillip Mills
Ketika saya membuat arsip untuk pengiriman saya memilih perangkat iOS di opsi perangkat kemudian membuat arsip, jika itu yang Anda tanyakan
Saurabh Jain
2
Saya setuju dengan @PhillipMills. Berkonsentrasi pada kesalahan pertama Anda. Mengapa Anda memiliki biner x86_64 di aplikasi iOS Anda? Entah Anda telah melakukan sesuatu yang aneh dengan pengaturan build Anda ... atau Anda mengunggah build Simulator.
Stephen Darlington
@ pAkY88. Saya tidak dapat untuk. Baru-baru ini saya memposting di forum API Shopify dan sedang menunggu tanggapan. Pasti akan memposting sesuatu jika saya menemukan satu
Saurabh Jain
Saya memiliki perilaku ini ketika saya mengunggah menggunakan Application Loader 3.5
SudoPlz

Jawaban:

395

Masalahnya adalah bahwa kerangka kerja Beli berisi build untuk simulator (x86_64) dan perangkat yang sebenarnya (ARM).

Tentu saja, Anda tidak diperbolehkan mengirimkan binari untuk App Store ke arsitektur yang tidak didukung, jadi solusinya adalah "secara manual" menghapus arsitektur yang tidak dibutuhkan dari biner terakhir, sebelum mengirimkannya.

Daniel Kennett menghasilkan solusi yang bagus dan menyediakan skrip ini untuk ditambahkan ke tahap pembuatan:

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

Saya menggunakannya dan itu bekerja dengan sempurna.

EDIT: pastikan Anda melihat skrip yang dimodifikasi diposting oleh Varrry, karena ini memiliki beberapa masalah kecil.

pAkY88
sumber
6
@ pAkY88 Saya telah menggunakan skrip ini dalam proyek Xcode saya untuk memperbaiki Masalah App Store yang disebutkan di atas, tetapi sekarang ketika saya pergi ke Build, saya memiliki banyak kesalahan fatal -> kesalahan fatal: lipo: input file (/ ... Frameworks / Bolts.framework / Bolts) harus berupa file gemuk ketika opsi -extract ditentukan. Ada ide bagaimana cara memperbaikinya?
SamoanProgrammer
52
Saya pikir itu cukup bodoh: Anda harus menggabungkan lengan + x86 untuk memungkinkan aplikasi Anda berjalan pada kedua simulator dan perangkat, dan harus menghapus x86 untuk mengirim ke app store. Mengapa Apple tidak melakukan strip di ujung mereka selama x86 terdeteksi? Mereka dapat membantu banyak alasan teknis untuk mempertahankan ini, tetapi tidak ada alasan bisnis karena tidak ramah sama sekali.
superarts.org
5
@ Skoua Pilih target yang relevan, lalu "Bangun Fase" dan letakkan setelah aksi "Embed Frameworks"
Piotr Tobolski
6
Script di atas sangat membantu tetapi tidak disebutkan tentang langkah-langkah untuk menjalankan script di Xcode. Untuk menjalankan skrip ini, TARGET -> pilih Build Phases lalu tajuk atas di Xcode, ketuk Editor -> Tambahkan build fase -> Tambahkan run script, buat fase dan Anda akan mendapatkan kolom di bagian Build Phase dari TARGET. Di sini Anda dapat menyalin skrip tempel di atas dan mengunggahnya ke Appstore dengan sukses.
shashi Gupta
5
Tidak bekerja di Xcode 11.2 - ada yang menemukan solusi?
JMIT
180

Jawaban yang diberikan oleh pAkY88 berfungsi, tetapi saya menghadapi masalah yang sama dengan Mario A Guzman di https://stackoverflow.com/a/35240555/5272316 : setelah kami memotong arsitektur yang tidak digunakan, kami tidak dapat menjalankan skrip lagi karena mencoba menghapusnya tidak ada irisan, karena xcode tidak menanamkan kembali biner setiap saat. Gagasannya adalah - cukup hapus irisan i386 dan x86_64 saat membuat arsip, jadi saya memodifikasi skrip:

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

Skrip ini hanya menghapus irisan i386 dan x86_64 dari biner gemuk (jika ada) jika berjalan bukan untuk simulator (itu berarti folder tujuan tidak seperti "Debug-iphonesimulator").

Maaf, saya tidak terbiasa dengan skrip shell, jadi mungkin seseorang bisa menulisnya dengan cara yang lebih elegan. Tapi berhasil)

Varrry
sumber
1
Terima kasih atas idenya. Saya hanya menambahkan tanda centang pada kode dari jawaban yang diterima di dalam while loop case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacdan itu bekerja seperti pesona.
Michael Radionov
Saya menambahkan skrip ini TARGET -> Build Phases -> [CP] Embedded Pods Frameworkstetapi tidak berhasil dan saya masih mengunggah kesalahan iTunesConnect. Bagaimana cara menjalankan skrip ini?
PiterPan
2
PiterPan, tambahkan sebagai fase RunScript yang terpisah
Varrry
1
Saya baru saja memeriksa opsi "Jalankan skrip saja saat menginstal" dan itu akan dilewati kecuali kemudian pengarsipan.
Rivera
Apakah semua yang disarankan di sini, berhasil menghapus kesalahan Kartago; tetapi perlu mengunggahnya ke App Store tanpa validasi untuk mendapatkan beberapa informasi yang bermanfaat mengapa gagal. Berhasil memperbaikinya dan bergerak maju ...
user3069232
90

Jika Anda menggunakan Carthage maka Anda mungkin mengalami masalah ini karena proyeknya adalah:

  • Tidak ada carthage copy-frameworks fase pembuatan.
  • Atau fase build tidak termasuk semua framework (daftar tidak lengkap).

Tindakan ini menyaring kerangka kerja ke daftar arsitektur (kode) yang valid .

Menyiapkan fase pembuatan kerangka kerja salinan

Dari gedung Carthage untuk langkah-langkah iOS :

Pada tab pengaturan “Bangun Fase” target aplikasi Anda, klik ikon “+” dan pilih “Fase Skrip Run Baru”. Buat Skrip Jalankan di mana Anda menentukan shell Anda (mis: bin / sh), tambahkan konten berikut ke area skrip di bawah shell:

/usr/local/bin/carthage copy-frameworks

dan tambahkan path ke framework yang ingin Anda gunakan di bawah "File Input", misalnya:

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

Skrip ini berfungsi di sekitar bug pengiriman App Store yang dipicu oleh binari universal dan memastikan bahwa file terkait bitcode dan dSYM yang diperlukan disalin saat pengarsipan.

odlp
sumber
Sebagai catatan tambahan, saya baru-baru ini mengalami masalah ini setelah beralih dari menggunakan versi lama, yang sudah dikompilasi sebelumnya dari kerangka kerja pihak ketiga ke versi baru dari kerangka kerja yang sama yang diinstal menggunakan Carthage. Bahkan ketika Carthage sudah sepenuhnya siap saya terus mendapatkan kesalahan ini. Bagi saya, perbaikannya adalah sepenuhnya menghapus kerangka kerja dari proyek dan menambahkannya kembali. Jika Anda menggunakan Carthage dan jawaban ini tidak memperbaikinya untuk Anda, coba lakukan itu.
Ash
1
Memang, pos yang bagus. Catatan, sering kali taruhan terbaik Anda cukup menghapus semua kerangka kerja, dan mulai lagi menambahkan semua kerangka kerja Anda dari Carthage. Cheers
Fattie
Saya menggunakan Carthage dan Marshal dan menambahkan $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkberhasil
Ricardo Mutti
di iOS modern, 99% dari waktu inilah masalahnya - Anda hanya lupa kerangka kerja salinnya. (100% proyek sekarang menggunakan Carthage.)
Fattie
41

Saya menyelesaikan kesalahan ITMS-90080 dengan menghapus kerangka kerja (SVProgressHUD yang sangat baik) dari bagian Embedded Binaries (target Xcode -> tab General).

masukkan deskripsi gambar di sini

Bart van Kuik
sumber
5
Jawaban ini seharusnya memiliki lebih banyak upvotes. Saya menduga itu adalah penyebab utama bagi banyak orang yang menggunakan Kartago.
mm2001
15
Jika Anda mencoba menyematkan kerangka kerja dinamis, kemudian menghapusnya menghasilkan pesan kesalahan ini untuk saya: "Alasan: gambar tidak ditemukan"
electronix384128
1
Ini berhasil untuk saya. Anda harus menghapus framework dari Embedded Binaries dan cukup menambahkannya ke Linked Frameworks and Libraries. Juga, Anda harus melakukan hal-hal lain seperti menjalankan skrip yang Anda temukan di jawaban lain.
smileBot
33

Jika Anda menggunakan Carthagepastikan Anda Embed Frameworks Build StepsebelumCarthage copy-frameworks


Dalam beberapa kasus yang tidak biasa (contoh: Lottie-iOS framework):

  • Anda akan memilikinya hanya di "Link Library" seperti biasa.

  • Namun Anda juga harus menambahkannya secara eksplisit di "Kerangka Kerja Sematan" (meskipun tampaknya tidak ada gunanya, karena ia bekerja dengan sempurna saat Anda hanya memilikinya di "Kerangka Kerja Sematan"),

  • dan letakkan di copy-frameworks

  • dan memastikan copy-framework setelah "Embed Frameworks"

Maciej Swic
sumber
Dengan cara ini masalah saya. Terima kasih.
DookieMan
15

Hapus [x86_64, i386] dari framework menggunakan langkah di bawah ini. [x86_64, i386] digunakan untuk simulator.

  1. Buka Terminal

  2. buka jalur seret proyek Anda dari masing-masing kerangka kerja ke Terminal

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

  3. setel nama Kerangka Anda di bawah perintah dan jalankan

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

  1. Sekarang buka kembali proyek Anda, Bersihkan, Bangun & Jalankan dan Buat Arsip ...
MAhipal Singh
sumber
@ Mahipal Singh .. setelah menghapus menggunakan perintah lipo. aplikasi tidak berfungsi di simulator. mendapat kesalahan seperti x84_64 hilang untuk simulator iphone. tetapi bekerja dengan baik di perangkat nyata.
Hitarth
Itu karena simulator hanya mendukung kerangka debug
MAhipal Singh
14

Saya akan menambahkan 2 sen saya di sini (dengan cara yang kurang menakutkan :-). Saya telah menemukan cukup banyak perpustakaan gemuk dari Vendor yang (karena alasan tertentu) tidak berfungsi seperti biasa dengan menambahkannya ke Frameworksdirektori seperti yang didokumentasikan oleh Apple. Satu-satunya cara kita telah mampu membuat pekerjaan mereka adalah dengan menarik .framekworktepat ke direktori proyek dan menghubungkan Embedded Frameworksdan Link Binary with Librariesmanual di Settings Build. Ini tampaknya telah bekerja tanpa masalah, karena dengan perpustakaan gemuk mereka datang dengan Simulator Arsitektur asing i386 dan x86_64bersama denganarm arsitektur.

Cara cepat untuk memeriksa arsitektur di perpustakaan gemuk adalah

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

Yang mana harus mengeluarkan output seperti ini

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

Ini menegaskan bahwa Anda perlu "memotong lemak" (yaitu i386&x86_64 ) dari kerangka kerja Anda sebelum mengunggah iTunesConnect Archival, yang tidak mengizinkan arsitektur ini (karena tidak didukung untuk iOS).

Sekarang, semua jawaban (atau paling tidak beberapa jawaban) di sini memberikan Run Script yang luar biasa yang saya yakin berfungsi dengan sangat baik, tetapi hanya jika Kerangka Anda berada di Frameworksdirektori. Sekarang kecuali Anda pecandu skrip shell, skrip tanpa modifikasi, tidak akan berfungsi untuk skenario yang saya jelaskan di atas. Namun, ada cara yang sangat sederhana untuk menyingkirkan i386& x86_64arsitektur dari framework.

  1. Buka terminal di direktori proyek Anda.

  2. Ubah direktori langsung menjadi .framekwork, seperti

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. Jalankan serangkaian perintah seperti yang ditunjukkan di bawah ini-

$ 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

Beberapa hal yang perlu diperhatikan di sini - lipo -removeharus dilakukan sekali agar setiap arsitektur dihapus. lipotidak memodifikasi file input, itu hanya menghasilkan file sehingga Anda harus menjalankan lipo -removesatu kali untuk x86_64dani386 . Perintah di atas hanya melakukan itu dengan terlebih dahulu mengubah nama executable dan kemudian akhirnya menghapus lengkungan yang diinginkan, dan kemudian membersihkan sisa file. Dan itu saja, Anda seharusnya sekarang melihat tanda centang hijau di unggah Application Loader Archival ke iTunesConnect.

Hal-hal yang perlu diingat : Langkah-langkah di atas hanya boleh dilakukan saat produksi membangun, karena .frameworkakan dilucuti dari arsitektur simulator, membangun di atas simulator akan berhenti bekerja (yang diharapkan). Dalam lingkungan pengembangan, seharusnya tidak perlu menghapus arsitektur dari .frameworkfile karena Anda ingin dapat menguji pada Simulator dan perangkat fisik. Jika pustaka Anda berada di Frameworksfolder dalam proyek maka silakan lihat jawaban yang diterima.

AnBisw
sumber
Solusi sederhana untuk mereka yang tidak ingin menulis.
jalankan saja perintah di atas, ukuran lengkung dikurangi menjadi setengah. semoga ada bedanya.
showmyroutes
Meskipun saya telah menggunakan skrip untuk membuat semuanya berfungsi seperti biasa tetapi ini harus menjadi deskripsi yang tepat tentang cara mengatasi masalah tersebut.
Sharkes Monken
cintai sifat jawaban ini. bersih dan ringkas
Hudi Ilfeld
10

Saya memiliki masalah yang sama bahkan setelah menambahkan skrip dan memperbarui kerangka kerja beberapa kali.

Pastikan di xCode, skrip ditambahkan di akhir, setelah embed. Saya pikir saya tidak sengaja memindahkan skrip sebelum kerangka kerja tertanam.

masukkan deskripsi gambar di sini

Catatan: Saya punya xCode 9.1

Florin Dobre
sumber
Ini berhasil untuk saya. Di mana hanya script @ pAkY88 sudah cukup terakhir kali saya melakukan rilis hampir setahun yang lalu.
RedHotPawn.com
Saya memiliki masalah yang sama dan ini berhasil untuk saya. Pastikan untuk memeriksa posisi skrip run setiap kali kerangka dihapus dan ditambahkan (hanya diperlukan bila hanya ada satu kerangka kerja yang dihapus).
Baran Emre
Anda menghemat hari saya. Hanya untuk menambahkan skrip setelah kerangka tertanam.
Mayuri R Talaviya
8

Diperbarui untuk Xcode 10.1, Solusi di bawah ini berfungsi untuk saya:

Hanya saja Anda harus menghapus framework dari Embedded Binaries dan cukup menambahkannya ke Linked Frameworks and Libraries.

Lihat tangkapan layar di bawah ini;

masukkan deskripsi gambar di sini

Kiran jadhav
sumber
1
Solusi yang bekerja untuk saya (y)
Alok
menghapus hal yang sama dari kerangka kerja dan perpustakaan yang tertaut
Ranu Dhurandhar
8

Terima kasih untuk semua jawaban di atas. Berikut ini skrip yang berfungsi dengan swift 4.2 dan 5 . Ganti string Your_Framework_Name dengan nama asli Framework Anda.

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
Gurjinder Singh
sumber
Terima kasih! Ini bekerja untuk saya, sedangkan jawaban yang diterima tidak.
besserwisser
5

Masalah ini diselesaikan untuk saya dengan sedikit memodifikasi skrip run dari jawaban pAky88 dan mengeksekusi setelah menyertakan kerangka kerja. Pastikan juga untuk tidak mencentang kotak "Jalankan Script saja saat menginstal".

/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
secara obyektif C
sumber
4

Saya menghapus arsitektur i386 & x64_86 dari Build Settings - Valid Architecture - Release, dan semuanya bekerja dengan baik.

masukkan deskripsi gambar di sini

Sekarang satu-satunya masalah adalah Anda tidak dapat menjalankan build RELEASE untuk tujuan pengujian pada SIMULATOR . Tetapi semudah Anda menghapus lengkungan, Anda dapat menambahkannya kembali jika Anda mau.

Mihai Er
sumber
1
YA, itu solusinya.
Ofir Maleakhi
3

solusi sederhana yang berhasil untuk saya adalah

1- hapus kerangka kerja dari kerangka kerja tertanam.

2- menambahkan kerangka kerja sebagai kerangka kerja terkait

selesai!

DeyaEldeen
sumber
1

Kesalahan ini (ITMS-90240) juga dapat disebabkan oleh pustaka statis (.a). inilah skrip untuk menghapus kelebihan arsitektur. Dalam Xcode tambahkan ini ke Target> BuildPhases> Klik tanda + dan pilih Run Script. Kemudian tempel ini ke dalam kotak skrip.

Script mencari file .a, memeriksa untuk melihat apakah itu berisi arsitektur yang menyinggung, kemudian jika itu membuat file .a baru tanpa arsitektur itu.

Untuk macOS:

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

Untuk iOS:

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
A.Badger
sumber
1

Saya memiliki masalah yang sama. Bahkan itu tidak berfungsi setelah menambahkan Run Script yang diberikan. Itu masalah terkait Xcode. Saya menggunakan Xcode versi 9.0 tetapi versi terbaru 9.2.

Jadi saya menginstal Xcode terbaru (9.2) dan berhasil.

Mahesh
sumber
0

Kerangka kerja Anda mengandung keduanya ARMdan x86kode, yang memungkinkan Anda untuk menggunakannya di perangkat atau di simulator. Jika Anda bermaksud untuk mengirimkan aplikasi ke App Store, jalankan skrip berikut untuk menghapus kode tidak aktif dari biner.

1. Pilih target Anda di Project Navigator, dan klik Build Phases di bagian atas editor proyek.

2. Dari menu Editor, pilih Tambahkan Fase Pembuatan, lalu Tambahkan Fase Pembuatan Skrip Jalankan (atau klik tombol + di sudut kiri atas editor Bangun Fase).

3.Perbesar segitiga pengungkapan di sebelah fase pembuatan Run Script baru yang baru saja ditambahkan. Di kotak editor skrip, rekatkan yang berikut ini: bash

$ {BUILT_PRODUCTS_DIR} / $ {FRAMEWORKS_FOLDER_PATH} / "YourframeworkName.framework" /strip-frameworks.sh

Georgekutty Joy
sumber
Ini mengasumsikan bahwa script strip-frameworks.sh kebetulan ada di sana ...
Codezy
0

Berikut ini adalah skrip yang saya gunakan untuk secara khusus menghapus arsitektur satu kerangka saja dari file yang dapat dieksekusi.

# 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"

Tambahkan skrip ini ke proyek Anda "Bangun Fase" dari target proyek Anda. Pastikan untuk mencentang kotak: "Jalankan skrip hanya saat menginstal"

Pratinjau tempat memasukkan skrip sampel

keaplogik
sumber