在IPA/Archive中检查并删除不支持的体系结构[x86_64,i386]

use*_*037 35 xcode app-store ios

问题:

在将应用程序提交到App Store时,会报告以下错误:

Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]

问题:

  1. 如何解决上述错误?

  2. 如何检查存档或IPA使用的体系结构?

  3. 如何确保Release存档不包含x86_64i386(模拟器体系结构).

    • 它是否只能通过脚本或是否有设置Build Settings或在哪里?

nik*_*_me 92

如果应用程序在发行期间包含模拟器架构,Apple已开始抱怨.

如何解决上述错误?

方案:

在Project target的运行脚本中添加以下代码,这将在构建过程中从您的应用程序中删除模拟器体系结构(x86_64和i386):

贝壳 :

/bin/sh
Run Code Online (Sandbox Code Playgroud)

代码:

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
Run Code Online (Sandbox Code Playgroud)

方案:

还有一个解决方案,如果你只想做一次.但要小心,但在执行以下步骤后,您将无法在模拟器上运行应用程序.在Testflight/App-store上部署应用程序之前做到这一点.

从终端进入项目的ProjectFramework.framework文件夹.运行以下命令:

lipo -remove i386 ProjectFramework_SDK -o ProjectFramework_SDK 
lipo -remove x86_64 ProjectFramework_SDK -o ProjectFramework_SDK
Run Code Online (Sandbox Code Playgroud)

从框架检查架构?

$ lipo -info PathToProject/ProjectName.framework/ProjectName
Run Code Online (Sandbox Code Playgroud)

输出将是: →胖文件中的架构:ProjectName是:i386 x86_64 armv7 arm64

参考.doc:http: //ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/

  • 必须将运行脚本放置在嵌入框架的步骤之后,这一点非常重要 (4认同)
  • 谢谢,注意到http://stackoverflow.com/questions/30547283/submit-to-app-store-issues中有相同的解决方案 (2认同)

MAh*_*ngh 8

对于自定义创建的动态框架

  1. 开放终端

  2. 打开各个框架的项目拖动路径到终端

    例如, cd /Users/mahipal/Desktop/masterTest/Alamofire.framework

  3. 在下面的命令中设置您的框架名称并运行

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


Alp*_*ana 7

对于Build Phases下的Run Script,将以下步骤添加到 Run Script 以删除x86_64和/或i386

cd "${ARTIFACTS_FOLDER}"/FrameworkName.framework

lipo -remove x86_64 FrameworkName -o FrameworkName
lipo -remove i386 FrameworkName -o FrameworkName
Run Code Online (Sandbox Code Playgroud)

可以组合以删除多个架构:

lipo -remove x86_64 FrameworkName -o FrameworkName && lipo -remove i386 FrameworkName -o FrameworkName
Run Code Online (Sandbox Code Playgroud)


Hen*_*olm 5

使用 nikdange_me 的脚本时,我得到:

error: exportArchive: ipatool failed with an exception: #<CmdSpec::NonZeroExcitException: ... >
error: Framework not found in dylib search path
Run Code Online (Sandbox Code Playgroud)

所以,我改变了它,并使用lipo -remove的,而不是lipo -extractlipo -create它解决了我的问题:

# This script loops through the frameworks embedded in the application 
# and removes unused architectures.

find "${TARGET_BUILD_DIR}/${WRAPPER_NAME}" -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"
    for arch in $(lipo -archs $FRAMEWORK_EXECUTABLE_PATH); do
        if ! printf '%s\n' ${ARCHS[@]} | egrep -q "^$arch$"; then
            lipo -remove $arch "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH" 
        fi
    done
done
Run Code Online (Sandbox Code Playgroud)