use*_*037 35 xcode app-store ios
在将应用程序提交到App Store时,会报告以下错误:
Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]
如何解决上述错误?
如何检查存档或IPA使用的体系结构?
如何确保Release存档不包含x86_64和i386(模拟器体系结构).
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/
对于自定义创建的动态框架
开放终端
打开各个框架的项目拖动路径到终端
例如, cd /Users/mahipal/Desktop/masterTest/Alamofire.framework
在下面的命令中设置您的框架名称并运行
lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire
对于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)
使用 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 -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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29044 次 |
| 最近记录: |