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,就抱着试试看的态度,点开了,毕竟试试又不会怀孕~~~

IPA processing failed

Show Logs 我们会看到下面四个日志文件,就是我们本次Archive~Package过程中的日志,然后我们着重看一下第二个选中的log

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所在的目录(以下的框架名称换成自己的即可)

    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
    28
    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,如果有和我一样的人,一定要注意哦:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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