Enviar a los problemas de App Store: Arquitectura no admitida x86

Entonces bash usar la API shopify. Cuando archive la aplicación y la valide, entonces no hay problemas, pero cuando la envío a la tienda de aplicaciones, me da los siguientes problemas.

  1. ERROR ITMS-90087: "Arquitectura no admitida. Su ejecutable contiene una architecture no admitida" [x86_64, i386] '. "
  2. ERROR ITMS-90209: "Alineación de segmento no válida. La App Binary en SJAPP.app/Frameworks/Buy.framework/Buy no tiene una alignment de segmento adecuada. Intenta rebuild la aplicación con la última versión de xcode". (Ya estoy usando la última versión).
  3. ERROR ITMS-90125: "El binary no es válido. La información de encryption en el command de carga LC_ENCRYPTION_INFO no se encuentra o es inválida, o el binary ya está encriptado. Este binary no parece haberse construido con el Linker de Apple".
  4. ADVERTENCIA ITMS-90080: "La carga útil ejecutable /…./ Buy.framework no es un ejecutable independiente de la position. Asegúrese de que las configuraciones de compilation ur estén configuradas para crear ejecutables PIE".

Nota para 2017 si usa Carthage , simplemente olvidó hacer clic en copy-frameworks.

El problema es que el framework Buy contiene una compilation tanto para el simulador (x86_64) como para los dispositivos reales (ARM).

Por supuesto, no se le permite enviar a la App Store un binary para una architecture no admitida, por lo que la solución es "eliminar manualmente" las architectures innecesarias del binary final, antes de enviarlo.

Daniel Kennett se le ocurrió una buena solución y proporciona este script para agregar a la fase de compilation:

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 

Lo usé y funcionó perfectamente.

EDIT: asegúrate de mirar el script modificado publicado por Varry, ya que este tiene algunos problemas menores.

Si está usando Carthage , puede experimentar este problema porque el proyecto es:

  • Falta la fase de compilation de los carthage copy-frameworks .
  • O la fase de compilation no incluye todos los frameworks (list incompleta).

Esta acción filtra frameworks a una list de architectures válidas (código) .

Configurar la fase de compilation de frameworks de copy

Desde el edificio de Carthage para pasos de iOS :

En la pestaña de configuration de "Fases de compilation" de los objectives de su aplicación, click el icono "+" y select "Nueva fase de ejecución de guión". Cree un script de ejecución en el que especifique su shell (por ejemplo: bin / sh), agregue los siguientes contenidos al área de script debajo del shell:

/usr/local/bin/carthage copy-frameworks

y agregue las routes a los frameworks que desea usar en "Archivos de input", por ejemplo:

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

Este script funciona en torno a un error de envío de App Store activado por binarys universales y garantiza que se copien los files y los dSYM relacionados con el código de bits necesarios al archivar.

Resolví el error ITMS-90080 eliminando un marco (el excelente SVProgressHUD) de la sección de Binarios embeddeds (destino Xcode -> pestaña General).

introduzca la descripción de la imagen aquí

La respuesta dada por pAkY88 funciona, pero tuve el mismo problema que Mario A Guzman en https://stackoverflow.com/a/35240555/5272316 : una vez que cortamos las architectures no utilizadas, no podemos ejecutar secuencias de commands, ya que intenta eliminarlas no existen segmentos, porque xcode no reinserta el binary cada vez. Idea fue: simplemente elimine los cortes de i386 y x86_64 al build para el file, por lo que modifiqué el script:

 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 

Esta secuencia de commands simplemente elimina los cortes i386 y x86_64 del binary gordo (si existen) si no funciona para el simulador (eso significa que la carpeta de destino no es como "Debug-iphonesimulator").

Lo siento, no estoy familiarizado con los scripts de shell, así que puede ser que alguien pueda escribirlo de manera más elegante. Pero funciona)

Si está utilizando Carthage asegúrese de que el Build Step Embed Frameworks esté antes de los copy-frameworks Carthage copy-frameworks


En algunos casos inusuales (ejemplo: marco Lottie-iOS):

  • lo tendrás simplemente en "Biblioteca de enlaces" como siempre.

  • Sin embargo , también debe agregarlo explícitamente en "Embed Frameworks" (aunque parece inútil, ya que funciona perfectamente cuando lo tiene solo en "Embed Frameworks"),

  • y ponerlo en frameworks de copy

  • y asegúrese de que copy-frameworks sea después de "Embed Frameworks"

Este error (ITMS-90240) también puede ser causado por una biblioteca estática (.a). Heres un guion para eliminar las architectures en exceso. En Xcode, agregue esto a Target> BuildPhases> Haga clic en + y select Ejecutar secuencia de commands. A continuación, pegue esto en el cuadro de secuencia de commands.

La secuencia de commands busca files .a, comtesting si contiene una architecture infractora, y si lo hace crea un nuevo file .a sin esa architecture.

Para 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 

Para 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