问题:
在提交应用到App Store时,出现以下错误:
不支持的架构。 您的可执行文件包含不支持的架构 '[x86_64, i386]'
问题:
如何解决上述错误?
如何检查档案或IPA所使用的体系结构?
如何确保
Release
归档不包括模拟器架构x86_64
和i386
。- 是否仅通过脚本才能实现,还是在
Build Settings
或其他设置中有设置?
- 是否仅通过脚本才能实现,还是在
在提交应用到App Store时,出现以下错误:
不支持的架构。 您的可执行文件包含不支持的架构 '[x86_64, i386]'
如何解决上述错误?
如何检查档案或IPA所使用的体系结构?
如何确保 Release
归档不包括模拟器架构 x86_64
和 i386
。
Build Settings
或其他设置中有设置?苹果已开始在分发过程中抱怨应用是否包含模拟器架构。
如何解决上述错误?
解决方案:
将以下代码添加到项目目标的运行脚本中,在构建过程中从您的应用程序中删除模拟器架构(x86_64和i386):
Shell:
/bin/sh
代码:
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
解决方案:
还有一种解决方案,如果您只想执行一次操作。 但是请注意,在执行以下步骤后,您将无法在模拟器上运行应用程序。请在部署应用程序到Testflight/App-store之前执行此操作。
从终端进入您项目的ProjectFramework.framework文件夹。运行以下命令:
lipo -remove i386 ProjectFramework_SDK -o ProjectFramework_SDK
lipo -remove x86_64 ProjectFramework_SDK -o ProjectFramework_SDK
检查框架的架构?
$ lipo -info PathToProject/ProjectName.framework/ProjectName
输出结果将为: → fat文件中的架构:ProjectName为: i386 x86_64 armv7 arm64
参考文献: http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/
针对自定义的动态框架
打开终端
打开您的项目,并将相应框架的路径拖到终端中
例如,cd /Users/mahipal/Desktop/masterTest/Alamofire.framework
在下面的命令中设置您的框架名称并运行
lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire
cd "${ARTIFACTS_FOLDER}"/FrameworkName.framework
lipo -remove x86_64 FrameworkName -o FrameworkName
lipo -remove i386 FrameworkName -o FrameworkName
lipo -remove x86_64 FrameworkName -o FrameworkName && lipo -remove i386 FrameworkName -o FrameworkName
error: exportArchive: ipatool failed with an exception: #<CmdSpec::NonZeroExcitException: ... >
error: Framework not found in dylib search path
所以我修改了它,使用lipo -remove
代替lipo -extract
和lipo -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
arm64
armv7
armv7s
i386
x86_64
x86_64
和i386
用于模拟器。lipo -info [库文件.framework的位置]
示例用法 : lipo -info /Users/.../library.framework/LibrarySDK
示例输出 :Architectures in the fat file: /Users/.../library.framework/LibrarySDK are: i386 x86_64 armv7 arm64
lipo -remove [architecture] [location] -o [output_location]
例如:lipo -remove i386 /Users/.../SDK -o /Users/.../SDK_Output_Directory
转到您选择的输出目录以获取新生成的不含已删除体系结构的SDK,以验证您可以使用与上述相同的lipo-info命令。lipo -remove x86_64 ...
,这样您将获得仅适用于iOS设备的SDK。