Xcode 11 IPA processing failed 初见
问题
⚠️ 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 瘦身大法
1、 进入framework所在的目录(以下的框架名称换成自己的即可)
1
cd [your framework path]
2、查看SDK的二进制文件支持的CPU架构,如果只显示armv7 arm64,那么就没问题,如果有模拟器的架构x86_64, i386那就是有问题
1
lipo -info OAChatClient.framework/OAChatClient
3、移除支持x86_64,i386的二进制文件
ps:移除自己对应的类型就可以,这里只是举个例子。1
lipo OAChatClient.framework/OAChatClient -remove x86_64 -remove i386 -output OAChatClient
4、用第3步生成的新的可执行文件 替换framwork内部的可执行文件[记得备份]
1
mv OAChatClient OAChatClient.framework/OAChatClient
5、查看我们瘦身后的可执行文件是否正确,显示armv7或arm64,就完成剥离,再打包应该就可以了,啊哈哈哈
1
lipo -info OAChatClient.framework/OAChatClient
如果你觉得以上操作比较麻烦,每次模拟器调试和打包还要替换对应的SDK,那么以下方式将更加简便的解决你的问题:
buildPhases->New Run Script Phase添加以下内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28APP_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,如果有和我一样的人,一定要注意哦:
1 | cd Frameworks |
PPS:运行脚本的命令就是sh ***.sh