所以我尝试使用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."


当前回答

此错误(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

其他回答

问题是Buy框架包含模拟器(x86_64)和实际设备(ARM)的构建。

当然,你不允许向App Store提交不受支持的架构的二进制文件,所以解决方案是在提交之前“手动”从最终二进制文件中删除不需要的架构。

Daniel Kennett提出了一个很好的解决方案,并提供了这个脚本添加到构建阶段:

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

我用过,效果很好。

编辑:请务必查看Varrry发布的修改后的脚本,因为这个脚本有一些小问题。

您的框架包含ARM和x86代码,这允许您在设备或模拟器中使用它。如果你打算将你的应用程序提交到应用程序商店,运行以下脚本从二进制文件中剥离非活动代码。

1.在Project Navigator中选择您的目标,并单击项目编辑器顶部的Build Phases。

2.从“编辑器”菜单中选择“添加构建阶段”,然后选择“添加运行脚本构建阶段”(或单击“构建阶段”编辑器左上角的“+”按钮)。

3.展开刚刚添加的新Run Script构建阶段旁边的披露三角形。在脚本编辑器中,粘贴如下内容: bash

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

I will add my 2 cents here (in a less scary way :-). I have encountered quite a number of fat libraries from Vendors that (for some reason) do not work the normal way by adding them to the Frameworks directory as documented by Apple. The only way we have been able to make them work is by pulling the .framekwork right into the project directory and linking the Embedded Frameworks and Link Binary with Libraries manually in Build Settings. This seem to have worked without any issues, however, as with any fat library they come with the extraneous Simulator Architectures i386 and x86_64 along with the arm architectures.

检查fat库上的架构的一个快速方法是

$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`

哪个应该吐出这样的输出

Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64

这证实了你需要在iTunesConnect存档上传之前从你的框架中“修剪脂肪”(即i386和x86_64),这是不允许这些架构的(因为它们不支持iOS)。

现在,这里所有的答案(或者至少部分答案)提供了这些出色的运行脚本,我确信它们工作得非常好,但前提是你的框架位于Frameworks目录下。现在,除非您是一个shell脚本爱好者,否则这些没有修改的脚本将不适用于我上面解释的场景。然而,有一种非常简单的方法可以从框架中摆脱i386和x86_64架构。

在项目目录中打开终端。 将目录直接更改为. framework,例如 cd YourProjectDir /志愿者项目/ YourLibrary.framework 运行如下所示的命令-

$ mv YourLibrary YourLibrary_all_archs
$ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo -remove i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs

这里有几件事要注意-脂肪-去除必须做一次每个架构去除。Lipo不会修改输入文件,它只生成一个文件,因此您必须为x86_64和i386运行一次Lipo -remove。上面的命令只是通过首先重命名可执行文件,然后最终删除所需的arch,然后清理剩下的文件来实现这一点。就这样,你现在应该看到一个绿色的复选标记在应用加载存档上传到iTunesConnect。

Things to keep in mind : The above steps should only be done while production build, since the .framework will be stripped off the simulator architectures, builds on simulators will stop working (which is expected). In development environment, there should be no need to strip the architectures off of the .framework file since you want to be able to test on both Simulator and a physical device. If your fat library resides in the Frameworks folder in the project then please look at the accepted answer.

下面是我专门用来从可执行文件中删除一个框架架构的脚本。

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

将此脚本添加到项目目标的“构建阶段”中。请务必选中复选框:“仅在安装时运行脚本”

对我来说最简单的解决方法是

1-从嵌入式框架中移除框架。 2-添加框架作为链接框架

完成了!