ios - werden - verbindung zum app store nicht möglich




Probleme beim Senden an den App Store: Nicht unterstützte Architektur x86 (12)

Für Xcode 10.1 aktualisiert. Die folgende Lösung hat bei mir funktioniert:

Sie müssen lediglich das Framework aus den eingebetteten Binärdateien entfernen und es zu den verknüpften Frameworks und Bibliotheken hinzufügen.

Siehe unten Screenshot;

Also versuche ich die shopify API zu benutzen. Wenn ich die App archiviere und validiere, gibt es keine Probleme, aber wenn ich sie beim App Store einreiche, gibt es mir die folgenden Probleme.

  1. FEHLER ITMS-90087: "Nicht unterstützte Architektur. Ihre ausführbare Datei enthält nicht unterstützte Architektur '[x86_64, i386]'."
  2. FEHLER ITMS-90209: "Ungültige Segmentausrichtung. Die App-Binärdatei unter SJAPP.app/Frameworks/Buy.framework/Buy weist keine ordnungsgemäße Segmentausrichtung auf. Versuchen Sie, die App mit der neuesten Xcode-Version neu zu erstellen." (Ich verwende bereits die neueste Version.)
  3. FEHLER ITMS-90125: "Die Binärdatei ist ungültig. Die Verschlüsselungsinformationen im Ladebefehl LC_ENCRYPTION_INFO fehlen oder sind ungültig, oder die Binärdatei ist bereits verschlüsselt. Diese Binärdatei scheint nicht mit Apples Linker erstellt worden zu sein."
  4. WARNUNG ITMS-90080: "Die ausführbare Payload /..../ Buy.framework ist keine positionsunabhängige ausführbare Datei. Stellen Sie sicher, dass Ihre Build-Einstellungen so konfiguriert sind, dass ausführbare PIE-Dateien erstellt werden."

Das Problem ist, dass das Buy-Framework einen Build sowohl für den Simulator (x86_64) als auch für die tatsächlichen Geräte (ARM) enthält.

Natürlich dürfen Sie für eine nicht unterstützte Architektur keine Binärdatei an den App Store senden. Daher besteht die Lösung darin, die nicht benötigten Architekturen "manuell" aus der endgültigen Binärdatei zu entfernen, bevor Sie sie senden.

Daniel Kennett hat eine gute Lösung gefunden und stellt das folgende Skript zur Verfügung, um die Erstellungsphase zu ergänzen:

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

Ich habe es benutzt und es hat perfekt funktioniert.

BEARBEITEN: Stellen Sie sicher, dass Sie sich das von Varrry bereitgestellte geänderte Skript ansehen, da dieses einige kleinere Probleme aufweist.


Dieser Fehler (ITMS-90240) kann auch durch eine statische (.a) Bibliothek verursacht werden. Hier ist ein Skript, um die überschüssigen Architekturen zu entfernen. Fügen Sie dies in Xcode zu Target> BuildPhases hinzu. Klicken Sie auf das Pluszeichen (+) und wählen Sie Run Script (Skript ausführen). Fügen Sie dies dann in das Skriptfeld ein.

Das Skript sucht nach .a-Dateien, prüft, ob es eine fehlerhafte Architektur enthält, und erstellt eine neue .a-Datei ohne diese Architektur.

Für 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

Für 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

Dieses Problem wurde für mich behoben, indem das Ausführungsskript aus der Antwort von pAky88 leicht modifiziert und nach dem Einbetten von Frameworks ausgeführt wurde. Deaktivieren Sie außerdem das Kontrollkästchen "Skript nur bei der Installation ausführen".

/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

Hier ist ein Skript, mit dem ich speziell nur die Architektur eines Frameworks aus der ausführbaren Datei entfernt habe.

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

Fügen Sie dieses Skript zu Ihren Projekten "Build Phases" Ihres Projektziels hinzu. Stellen Sie sicher, dass das Kontrollkästchen "Skript nur bei der Installation ausführen" aktiviert ist.


Ich habe den Fehler ITMS-90080 behoben, indem ich ein Framework (das exzellente SVProgressHUD) aus dem Abschnitt Embedded Binaries (Xcode-Ziel -> Registerkarte General) entfernt habe.


Ich hatte das gleiche Problem, auch nachdem ich das Skript hinzugefügt und das Framework einige Male aktualisiert hatte.

Stellen Sie in xCode sicher, dass das Skript am Ende nach dem Einbetten hinzugefügt wird. Ich glaube, ich habe das Skript versehentlich vor das eingebettete Framework verschoben.

Hinweis: Ich habe xCode 9.1


Ich hatte das gleiche Problem. Auch nach dem Hinzufügen des angegebenen Run-Skripts funktionierte es nicht. Es handelte sich um ein Problem mit Xcode. Ich habe die Xcode-Version 9.0 verwendet, aber die neueste Version war 9.2.

Also habe ich den neuesten Xcode (9.2) installiert und es hat funktioniert.


Ihr Framework enthält sowohl ARM als auch x86 Code, mit dem Sie es auf einem Gerät oder im Simulator verwenden können. Wenn Sie Ihre App an den App Store senden möchten, führen Sie das folgende Skript aus, um den inaktiven Code aus der Binärdatei zu entfernen.

1.Wählen Sie Ihr Ziel im Projektnavigator aus und klicken Sie oben im Projekteditor auf Phasen erstellen.

2.Wählen Sie im Menü Editor die Option Build-Phase hinzufügen und dann Script-Build-Phase hinzufügen (oder klicken Sie auf die Schaltfläche + in der oberen linken Ecke des Build-Phasen-Editors).

3.Erweitern Sie das Dreiecksymbol neben der gerade hinzugefügten neuen Run Script-Erstellungsphase. Fügen Sie im Skripteditor Folgendes ein: bash

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


Vielen Dank an alle oben genannten Antworten. Hier ist ein Skript, das mit Swift 4.2 arbeitet

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

Wenn Sie Carthage stellen Sie sicher, dass Ihr Build Step Embed Frameworks vor den Carthage copy-frameworks

In einigen ungewöhnlichen Fällen (Beispiel: Lottie-iOS-Framework):

  • Sie haben es einfach in "Link Library" wie gewohnt.

  • Sie müssen es jedoch auch explizit in "Embed Frameworks" hinzufügen (auch wenn dies sinnlos erscheint, da es perfekt funktioniert, wenn Sie es nur in "Embed Frameworks" haben).

  • und legen Sie es in Kopie-Frameworks

  • und sicherstellen, dass Copy-Frameworks nach "Embed Frameworks" ist


Answer von pAkY88 funktioniert, aber ich hatte das gleiche Problem wie Mario A Guzman unter https://.com/a/35240555/5272316 : Sobald wir nicht verwendete Architekturen abgeschnitten haben, können wir kein Skript mehr ausführen, da es versucht, sie zu entfernen Nicht vorhandene Slices, da xcode nicht jedes Mal Binärdateien neu einbettet. Idee war - entferne einfach i386 und x86_64 Slices, wenn du für das Archiv erstellst, also habe ich das Skript modifiziert:

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

Dieses Skript entfernt einfach i386- und x86_64-Slices aus der Fat Binary (falls vorhanden), wenn sie nicht für den Simulator ausgeführt werden (dh der Zielordner entspricht nicht "Debug-iphonesimulator").

Tut mir leid, ich kenne mich mit Shell-Skripten nicht aus. Vielleicht könnte es jemand eleganter schreiben. Aber es funktioniert)