Beim Programmieren einer Swift-Anwendung für iOS kann es vorkommen, dass man beim Upload zu Apple auf folgenden Fehler stößt
ERROR ITMS-90087: "Unsupported Architectures. The executable for XXXXX/Frameworks/SomeFramework.framework contains unsupported architectures '[x86_64, i386]’."
Dies passiert, wenn man eine Objective-C-Library in sein Projekt einbaut. Diese wird von XCode als x86_64, i386 und ARM kompiliert. Für den Emulator und dem direkten Ausführen auf dem iPhone ist dies kein Problem. Wenn man jedoch seinen Build über das Menü Build→Archive zusammenpackt und dann über XCode→Open Developer Tool→Application Loader zu Apple überträgt, kommt obige Fehlermeldung.
Die Lösung für das Problem ist, ein Script1) in seinen Buildprozess einzubauen, was die überflüssigen Binarys löscht. So landen diese dann auch nicht im Archiv und Apple meckert nicht mehr.
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
Das obige Skript wird über folgenden Klickpfad in XCode eingebunden:2)
Select Project in left panel→Mid Panel click Build Phases→+→New Run Script Phase