Deci, eu sunt încercarea de a utiliza shopify API. Când am arhiva aplicația și de a valida, atunci nu sunt probleme, dar când am să-l prezinte la app store, apoi îmi oferă următoarele probleme.
Problema este că Buy-cadru conține o acumulare atât pentru simulator (x86_64) și pe dispozitive reale (ARM).
Desigur, nu't-a permis să prezinte App Store un binar pentru un neacceptat arhitectura, deci, soluția este de a "manual" eliminați nu sunt necesare arhitecturi de finală binar, înainte de prezentarea acestuia.
Daniel Kennett a venit cu o soluție frumos și oferă acest script]1 pentru a adăuga la faza de construcție:
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
L-am folosit si a functionat perfect.
EDIT: asigurați-vă că te uiți la modificat script-ul postat de Varrry, ca acesta are unele probleme minore.
Raspuns dat de pAkY88 funcționează, dar m-am confruntat cu aceeasi problema ca Mario O Guzman în https://stackoverflow.com/a/35240555/5272316: odata ce am tăiat neutilizate arhitecturi putem't a rula script-ul de mai când se încearcă pentru a elimina existente felii, pentru că xcode nu't re-încorpora binar de fiecare dată. Ideea a fost - doar elimina i386 și x86_64 felii de când clădirea pentru arhivă, așa că am modificat script-ul:
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
Acest script pur și simplu elimină i386 și x86_64 felii de grăsime binare (dacă acestea există) dacă executarea nu pentru simulator (care înseamnă folder de destinație e't ca "Debug-iphonesimulator").
Scuze, am'm nu sunt familiarizați cu shell script-uri, asa ca poate fi cineva ar putea scrie mai elegant mod. Dar functioneaza)
Daca're folosind Cartagina, atunci această problemă poate apărea deoarece proiectul este:
cartagina copy-cadre de
a construi fază.Această acțiune filtre de cadre la o listă de valabil arhitecturi (code).
De Cartagina clădire pentru iOS pași:
La cerere obiective "Construi Faze" fila setări, faceți clic pe pictograma "+" și selectați "New Rula Script-ul de Fază". A crea o Rula Script-ul în pe care le specificați shell (ex: bin/sh), se adaugă următorul cuprins pentru a script-ul zona de sub coajă:
/usr/local/bin/cartagina copy-cadre
și se adaugă căi pentru cadrele doriți să utilizați secțiunea "Fișiere de Intrare", de exemplu:
$(SRCROOT)/Carthage/Construi/iOS/Cutie.cadru
$(SRCROOT)/Carthage/Construi/iOS/Rezultat.cadru `$(SRCROOT)/Carthage/Construi/iOS/ReactiveCocoa.cadruAcest script funcționează în jurul valorii de un Magazin de Aplicații prezentarea bug declanșată de universal binare și se asigură că este necesar bitcode legate de fișiere și dSYMs sunt copiate atunci când arhivare.
Dacă utilizați "Cartagina" asigurați-vă că Încorpora Cadre
Construi Pas
este înainte de "Cartagina" copy-cadre
În unele cazuri neobișnuite (de exemplu: Lottie-iOS-cadru):
va trebui pur și simplu în "Link Library" ca de obicei.
Cu toate acestea trebuie să de asemenea în mod explicit adăugați-l în "Încorpora Cadre" (chiar dacă pare lipsită de sens, deoarece acesta funcționează perfect atunci când aveți o numai în "Încorpora Cadre"),
și a pus în copie-cadre
și asigurați-copie-cadre este după "Încorpora Cadre"
A elimina [x86_64, i386] din cadrul utilizarea de mai jos pas. [x86_64, i386] este utilizat pentru simulator.
Deschide "Terminal"
deschide-ți proiect drag calea de cadru respective la Terminal
exemplu: cd /Users/MAC/Desktop/MyProject/Alamofire.cadru
lipo-elimina i386 Alamofire -o Alamofire && lipo-elimina x86_64 Alamofire -o Alamofire
Voi adăuga mei 2 centi aici (într-o mai puțin înspăimântător :-). Am întâlnit un număr destul de mare de grăsime biblioteci de la Furnizori care (din anumite motive) nu funcționează în mod normal, prin adăugarea lor la Cadre
director ca și documentate de către Apple. Singura modalitate de am fost în stare pentru a le face de lucru este de a trage .framekwork chiar în directorul de proiect și care leagă
Încorporat Cadre " și " Link-ul Binar cu Bibliotecilor manual în Setări Construi. Acest lucru pare să fi funcționat fără probleme, cu toate acestea, ca și cu orice grăsime bibliotecă au venit cu cele străine Simulator Arhitecturi i386 " și "x86_64
împreună cu" arm " arhitecturi.
O modalitate rapidă de a verifica arhitecturi pe grăsime library este
$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`
Care ar trebui să scuipe o ieșire ceva de genul asta
Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64
Aceasta confirmă faptul că va trebui să "tăiați de grăsime" (și anume i386
& x86_64
) din cadru înainte de a iTunesConnect de Arhivă incarca, care nu't permite aceste arhitecturi (deoarece acestea sunt de neacceptat pentru iOS).
Acum, toate răspunsurile (sau cel putin unele dintre răspunsuri) aici a oferi aceste minunate Rula Script-uri care sunt sigur că funcționează foarte bine, dar numai dacă-Cadru constă în Cadre
director. Acum, dacă sunteți un script de shell drogat, aceste script-uri fără modificări, a câștigat't de lucru pentru scenariul am explicat mai sus. Cu toate acestea, există o modalitate foarte simplă de a scăpa de i386
& x86_64
arhitecturi din cadru.
.framekwork
, ca`cd YourProjectDir/YourProject/YourLibrary.cadru
$ mv YourLibrary YourLibrary_all_archs
$ lipo-elimina x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo-elimina i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs
Câteva lucruri de reținut aici - lipo -scoateți
are să fi făcut o singură dată pentru fiecare arhitectură pentru a elimina. lipo
nu modifică fișierul de intrare, se produce doar un fișier, astfel încât să aveți pentru a rula lipo-elimina o dată pentru x86_64 " și " i386
. Comenzile de mai sus este pur și simplu fac asta de prima redenumirea executabilului și apoi în cele din urmă eliminarea dorit archs, și apoi curățarea fișiere rămase. Și că's a, ar trebui să vedeți acum o bifă verde în Aplicare Încărcător de Arhivă incarca să iTunesConnect.
Lucruri pentru a păstra în minte : pașii De mai sus ar trebui să fie făcut în timp ce producția a construi, deoarece .cadru va fi dezbrăcat simulator arhitecturi, se bazează pe simulatoare se va opri de lucru (ceea ce este de așteptat). În mediul de dezvoltare, nu ar trebui să fie nevoie să se dezbrace arhitecturi pe
.cadru fișierul din care doriți să fie capabil de a testa pe ambele Simulator și un dispozitiv fizic. Dacă grăsime de bibliotecă constă în "Instrucțiuni" folder în proiect, atunci vă rugăm să uita-te la răspunsul acceptat.
Am avut aceeași problemă, chiar și după adăugarea de script-ul și actualizarea cadrului de câteva ori.
Asigurați-vă că în xCode scenariul este adăugat la sfârșitul anului, după încorpora. Cred că din greșeală m-am mutat scenariul înainte de a încorporat-cadru.
Notă: am xCode 9.1
Această problemă a fost rezolvată pentru mine printr-o ușoară modificare a rula script-ul de la pAky88's a răspunde și de executare după încorporarea cadre. Asemenea asigurați-vă că să debifați caseta pentru "Rula Script-ul doar atunci când instalați".
/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
Am scos arhitecturi i386 & x64_86 de a Construi Setări - Valabil Arhitecturi de Eliberare, și totul a mers bine.
Acum singura problemă ar fi că poate't rula un PRESĂ construi pentru scopuri de testare pe un SIMULATOR. Dar la fel de ușor ca ai scos archs, le puteți adăuga înapoi, dacă doriți să.
Vă mulțumim pentru toate răspunsurile de mai sus. Aici este scriptul de lucru cu swift 4.2 si 5
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
Am avut aceeași problemă. Chiar daca nu a fost de lucru după adăugarea dat Rula Script-ul. A fost Xcode problemă conexă. Am fost folosind Xcode versiunea 9.0 dar ultima versiune a fost 9.2.
Deci am instalat ultima versiune de Xcode (9.2) și a funcționat.
Această eroare (ITMS-90240) poate fi, de asemenea, cauzată de un statice (.a) bibliotecă. iata un script pentru benzi excesul de arhitecturi. În Xcode adăuga acest la Țintă > BuildPhases > faceți Clic pe + și selectați Run Script. Apoi inserați codul în script cutie.
Scriptul caută .un fișiere, controale pentru a vedea dacă acesta conține o ofensa arhitectura, apoi, dacă aceasta nu face o noi .un fișier fără arhitectură.
Pentru 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
Pentru 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
Ți-cadru conține atât " ARM " și x86
cod, care vă permite să-l folosească pe un dispozitiv sau în simulator. Dacă intenționați să trimiteți aplicația în App Store, executați următorul script pentru benzi inactive cod din binar.
1.Selectați țintă în cadrul Proiectului Navigator, și faceți clic pe Construi Faze, la partea de sus a proiectului editor.
2.Din meniul de Editor, selectați Adăugați Construi Faza, apoi se Adauga Rula Script Construi Fază (sau faceți clic pe butonul " + " în colțul din stânga sus a Construi Faze editor).
3.Extinde pe triunghiul de dezvăluire de lângă noi a Rula Script construi faza care tocmai a fost adăugat. În script editor cutie, inserați următorul text: bash
${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/"YourframeworkName.framework"/strip-frameworks.sh
Aici este un script am folosit special pentru a elimina doar un singur cadru's arhitectură din fișierul executabil.
``bash
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 "Executa următoarea comandă pentru a elimina x86_64 arc de YourApp cadru executabil" echo "lipo-elimina x86_64 \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"${FRAMEWORK_EXECUTABLE_PATH}_X86_64\""
lipo-elimina x86_64 "${FRAMEWORK_EXECUTABLE_PATH}_X86_64" -o "$FRAMEWORK_EXECUTABLE_PATH"
rm "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"
``
Adauga acest script pentru proiectele dvs. "a Construi Faze" de proiectul dumneavoastră țintă. Fi sigur că pentru a verifica caseta: "Rula script-ul doar atunci când instalați"