所以我尝试使用Shopify API。当我存档并验证应用程序时,就没有问题了,但当我将其提交到应用程序商店时,它就会给我以下问题。

ERROR ITMS-90087: "Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]'." ERROR ITMS-90209: "Invalid segment Alignment. The App Binary at SJAPP.app/Frameworks/Buy.framework/Buy does not have proper segment alignment. Try rebuilding the app with the latest Xcode version." (I am already using the latest version.) ERROR ITMS-90125: "The Binary is invalid. The encryption info in the LC_ENCRYPTION_INFO load command is either missing or invalid, or the binary is already encrypted. This binary does not seem to have been built with Apple's Linker." WARNING ITMS-90080: "The Executable Payload/..../Buy.framework is not a Position Independent Executable. Please ensure that ur build settings are configured to create PIE executables."


当前回答

使用下面的步骤从框架中删除[x86_64, i386]。[x86_64, i386]用于模拟器。

打开终端 打开你的项目拖动路径各自的框架到终端 例如:cd /Users/MAC/Desktop/MyProject/Alamofire.framework 在下面的命令中设置你的框架名称并运行

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

现在再次打开您的项目,清洁,构建和运行,并创建存档…

其他回答

如果您正在使用Carthage,请确保您的嵌入框架构建步骤在Carthage复制框架之前


在一些不寻常的情况下(例如:Lottie-iOS框架):

你可以像往常一样在“链接库”中找到它。 然而,你还必须显式地在“嵌入框架”中添加它(即使这看起来毫无意义,因为当你只在“嵌入框架”中添加它时,它会完美地工作), 然后把它放到复制框架中 确保copy-frameworks在“Embed Frameworks”后面

pAkY88给出的答案是有效的,但我在https://stackoverflow.com/a/35240555/5272316:中遇到了马里奥·古兹曼(Mario A Guzman)一样的问题,一旦我们切断了未使用的架构,我们就不能再运行脚本了,因为它试图删除不存在的切片,因为xcode不会每次都重新嵌入二进制。 想法是-只是删除i386和x86_64切片时构建存档,所以我修改了脚本:

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

如果不是为模拟器(这意味着目标文件夹不像“debug - iphonessimulator”)运行,这个脚本只是从胖二进制文件(如果它们存在的话)中删除i386和x86_64切片。

对不起,我不熟悉shell脚本,所以可能有人可以用更优雅的方式编写它。但它确实有效)

此错误(ITMS-90240)也可能由静态(.a)库引起。这里有一个脚本来剥离多余的架构。在Xcode中将此添加到目标> BuildPhases >单击+并选择运行脚本。然后将其粘贴到脚本框中。

该脚本搜索.a文件,检查它是否包含有问题的体系结构,如果确实包含,则生成一个不包含该体系结构的新.a文件。

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

对于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

我也有同样的问题。 即使在添加给定的运行脚本后,它也不能工作。 这是与Xcode相关的问题。 我使用的是Xcode 9.0版本,但最新版本是9.2。

所以我安装了最新的Xcode(9.2),它工作。

即使在添加脚本和更新框架几次之后,我也遇到了同样的问题。

确保在xCode中脚本被添加在嵌入之后的末尾。我想我不小心在嵌入框架之前移动了脚本。

注意:我有xCode 9.1