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:

今天準(zhǔn)備打一個(gè)企業(yè)ipa的時(shí)候,報(bào)了一個(gè)錯(cuò),嚇出了一身冷汗:IPA processing failed
看到了 Show Logs,就抱著試試看的態(tài)度,點(diǎn)開了,畢竟試試又不會(huì)懷孕~~~

IPA processing failed

Show Logs 我們會(huì)看到下面四個(gè)日志文件,就是我們本次Archive~Package過程中的日志,然后我們著重看一下第二個(gè)選中的log


log

搜索一下error或者 failed 總會(huì)發(fā)現(xiàn)什么的,喏,我們發(fā)現(xiàn)了就包含一個(gè)failed,注意上下文劃線的幾句話,應(yīng)該是提示的那個(gè)framework包含了模擬器架構(gòu),上架肯定是要移除的,所以我們需要忽略它,換句話說,它太胖了,我們需要給它瘦個(gè)身??♂???♂???♂???♂???♂?

模擬器32位處理器測(cè)試需要i386架構(gòu),(iphone5,iphone5s以下的模擬器)
模擬器64位處理器測(cè)試需要x86_64架構(gòu),(iphone6以上的模擬器)
真機(jī)32位處理器需要armv7,或者armv7s架構(gòu),(iphone4真機(jī)/armv7, ipnone5,iphone5s真機(jī)/armv7s)
真機(jī)64位處理器需要arm64架構(gòu),(iphone6,iphone6p以上的真機(jī))

尋找恐懼

Framework 瘦身大法

本段內(nèi)容來自于:xcode11打包失敗 IPA processing failed 問題解決

  • 1、 進(jìn)入framework所在的目錄(以下的框架名稱換成自己的即可)
cd [your framework path]
  • 2、查看SDK的二進(jìn)制文件支持的CPU架構(gòu),如果只顯示armv7 arm64,那么就沒問題,如果有模擬器的架構(gòu)x86_64, i386那就是有問題
lipo -info OAChatClient.framework/OAChatClient
  • 3、移除支持x86_64,i386的二進(jìn)制文件
    ps:移除自己對(duì)應(yīng)的類型就可以,這里只是舉個(gè)例子。
lipo OAChatClient.framework/OAChatClient -remove x86_64 -remove i386 -output OAChatClient
  • 4、用第3步生成的新的可執(zhí)行文件 替換framwork內(nèi)部的可執(zhí)行文件[記得備份]
mv OAChatClient OAChatClient.framework/OAChatClient
  • 5、查看我們瘦身后的可執(zhí)行文件是否正確,顯示armv7或arm64,就完成剝離,再打包應(yīng)該就可以了,啊哈哈哈
lipo -info OAChatClient.framework/OAChatClient
  • 如果你覺得以上操作比較麻煩,每次模擬器調(diào)試和打包還要替換對(duì)應(yīng)的SDK,那么以下方式將更加簡(jiǎn)便的解決你的問題:
    buildPhases->New Run Script Phase添加以下內(nèi)容
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:發(fā)現(xiàn)這個(gè)問題,是因?yàn)橄胧褂萌思乙盎鸬腎M demo,自己打個(gè)包,結(jié)果就報(bào)了上面的問題,按照上面的步驟改完一個(gè)framework后,發(fā)現(xiàn),其實(shí)野火的工程里,已經(jīng)寫好了腳本(文件:removex86.sh,是不是看名字就知道是干嘛的了),哈哈哈,只需要運(yùn)行一下就ok了????????????????????

這是人家的shell,如果有和我一樣的人,一定要注意哦:

cd Frameworks

echo "朋友圈的庫(kù)如果不存在,腳本會(huì)報(bào)錯(cuò)誤,可以忽略掉!"

#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 "朋友圈的庫(kù)如果不存在,腳本會(huì)報(bào)錯(cuò)誤,可以忽略掉!"
echo "執(zhí)行這個(gè)腳本后,打包時(shí)一定不要打開ios-chat這個(gè)項(xiàng)目空間進(jìn)行打包,因?yàn)闀?huì)重新生成這些被瘦身的庫(kù)。要打開wfchat這個(gè)項(xiàng)目進(jìn)行打包!"

PPS:運(yùn)行腳本的命令就是sh ***.sh

“就是這么不要臉”專用圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容