问题:
warning: Configuration issue: platform iPhoneSimulator.platform doesn't have any non-simulator SDKs; ignoring it
Assertion failed: Expected 2 archs in otool output:
今天准备打一个企业ipa的时候,报了一个错,吓出了一身冷汗:IPA processing failed
看到了 Show Logs,就抱着试试看的态度,点开了,毕竟试试又不会怀孕~~~
Show Logs 我们会看到下面四个日志文件,就是我们本次Archive~Package过程中的日志,然后我们着重看一下第二个选中的log
搜索一下error
或者 failed
总会发现什么的,喏,我们发现了就包含一个failed,注意上下文划线的几句话,应该是提示的那个framework包含了模拟器架构,上架肯定是要移除的,所以我们需要忽略它,换句话说,它太胖了,我们需要给它瘦个身♂️♂️♂️♂️♂️
模拟器32位处理器测试需要i386架构,(iphone5,iphone5s以下的模拟器)
模拟器64位处理器测试需要x86_64架构,(iphone6以上的模拟器)
真机32位处理器需要armv7,或者armv7s架构,(iphone4真机/armv7, ipnone5,iphone5s真机/armv7s)
真机64位处理器需要arm64架构,(iphone6,iphone6p以上的真机)
Framework 瘦身大法
本段内容来自于:xcode11打包失败 IPA processing failed 问题解决
- 1、 进入framework所在的目录(以下的框架名称换成自己的即可)
cd [your framework path]
- 2、查看SDK的二进制文件支持的CPU架构,如果只显示armv7 arm64,那么就没问题,如果有模拟器的架构x86_64, i386那就是有问题
lipo -info OAChatClient.framework/OAChatClient
- 3、移除支持x86_64,i386的二进制文件
ps:移除自己对应的类型就可以,这里只是举个例子。
lipo OAChatClient.framework/OAChatClient -remove x86_64 -remove i386 -output OAChatClient
- 4、用第3步生成的新的可执行文件 替换framwork内部的可执行文件[记得备份]
mv OAChatClient OAChatClient.framework/OAChatClient
- 5、查看我们瘦身后的可执行文件是否正确,显示armv7或arm64,就完成剥离,再打包应该就可以了,啊哈哈哈
lipo -info OAChatClient.framework/OAChatClient
- 如果你觉得以上操作比较麻烦,每次模拟器调试和打包还要替换对应的SDK,那么以下方式将更加简便的解决你的问题:
buildPhases->New Run Script Phase添加以下内容
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
小乌龙
PS:发现这个问题,是因为想使用人家野火的IM demo,自己打个包,结果就报了上面的问题,按照上面的步骤改完一个framework后,发现,其实野火的工程里,已经写好了脚本(文件:removex86.sh,是不是看名字就知道是干嘛的了),哈哈哈,只需要运行一下就ok了
这是人家的shell,如果有和我一样的人,一定要注意哦:
cd Frameworks
echo "朋友圈的库如果不存在,脚本会报错误,可以忽略掉!"
#lipo WFChatUIKit.framework/WFChatUIKit -thin armv7 -output XXXX_armv7
lipo WFChatUIKit.framework/WFChatUIKit -thin arm64 -output XXXX_arm64
#lipo -create XXXX_armv7 XXXX_arm64 -output XXXX
mv XXXX_arm64 WFChatUIKit.framework/WFChatUIKit
rm -rf XXXX*
# lipo WFAVEngineKit.framework/WFAVEngineKit -thin armv7 -output XXXX_armv7
lipo WFAVEngineKit.framework/WFAVEngineKit -thin arm64 -output XXXX_arm64
# lipo -create XXXX_armv7 XXXX_arm64 -output XXXX
mv XXXX_arm64 WFAVEngineKit.framework/WFAVEngineKit
rm -rf XXXX*
# lipo WFChatClient.framework/WFChatClient -thin armv7 -output XXXX_armv7
lipo WFChatClient.framework/WFChatClient -thin arm64 -output XXXX_arm64
# lipo -create XXXX_armv7 XXXX_arm64 -output XXXX
mv XXXX_arm64 WFChatClient.framework/WFChatClient
rm -rf XXXX*
cd ../WildFireChat/Moments
#lipo WFMomentClient.framework/WFMomentClient -thin armv7 -output XXXX_armv7
lipo WFMomentClient.framework/WFMomentClient -thin arm64 -output XXXX_arm64
#lipo -create XXXX_armv7 XXXX_arm64 -output XXXX
mv XXXX_arm64 WFMomentClient.framework/WFMomentClient
rm -rf XXXX*
# lipo WFMomentUIKit.framework/WFMomentUIKit -thin armv7 -output XXXX_armv7
lipo WFMomentUIKit.framework/WFMomentUIKit -thin arm64 -output XXXX_arm64
# lipo -create XXXX_armv7 XXXX_arm64 -output XXXX
mv XXXX_arm64 WFMomentUIKit.framework/WFMomentUIKit
rm -rf XXXX*
cd ../../Frameworks
#lipo GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC -thin armv7 -output XXXX_armv7
lipo GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC -thin arm64 -output XXXX_arm64
#lipo -create XXXX_armv7 XXXX_arm64 -output XXXX
mv XXXX_arm64 GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC
rm -rf XXXX*
echo "朋友圈的库如果不存在,脚本会报错误,可以忽略掉!"
echo "执行这个脚本后,打包时一定不要打开ios-chat这个项目空间进行打包,因为会重新生成这些被瘦身的库。要打开wfchat这个项目进行打包!"
PPS:运行脚本的命令就是sh ***.sh