当我尝试使用Distribute APP选项创建IPA文件时。它给出了“ IPA处理失败”错误。
我已经检查了日志文件:IDEDistribution.standard.log
文件。
2019-08-06 18:36:52 +0000警告:配置问题:平台 iPhoneSimulator.platform没有任何非模拟器SDK;忽略 它正在扫描IPA ... 2019-08-06 18:36:52 +0000断言失败: otool输出中预期有4个弓: /var/folders/4t/rpjk7pd55t16jfrd32y98gf0lb2t68/T/IDEDistributionOptionThinning.~~~a4cZJc/Payload/demo.app/Frameworks/AppAuth.framework/AppAuth: 马赫头 魔术cputype cpusubtype caps文件类型ncmds sizeofcmds标志MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 23
3680 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS加载命令0
答案 0 :(得分:49)
我遇到了同样的问题。我已使用此脚本修复了此问题。
请遵循相同的步骤。
构建阶段->加号按钮->创建新的运行脚本阶段
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
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"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
echo "No need to remove archs"
;;
*)
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
echo "i386 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
echo "x86_64 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
;;
esac
echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
done
答案 1 :(得分:24)
答案 2 :(得分:12)
为解决类似的问题,我使用了以下方法:
Build Phases
Embed Frameworks
和Embed App Extensions
部分中,我用以下脚本添加了Run script
: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
我从这里获取的脚本:https://medium.com/@maximbilan/ios-submission-unsupported-architectures-issues-733917a98cc3,感谢Daniel Kennet!
此外,请注意,此脚本还可能导致编译错误。在这种情况下,以下是解决方法:Errors building Xcode Project after adding in Run Script fatal error: lipo: input file
最后,我还注意到在本地(在开发设备/模拟器上)编译应用程序时必须关闭此脚本
希望有帮助!
答案 3 :(得分:8)
您应该在Embed Frameworks
阶段下检查Xcode > build
。
如果在这里介绍了您的框架,则不能在框架中使用i386\x86_64
。因为Embed Frameworks
已复制到应用程序。为了控制应用程序的大小,Embed Frameworks
中的框架必须最简化。
您可以使用Link Binary With Libraries
来介绍您的框架,如下所述:https://github.com/Carthage/Carthage/issues/1046
答案 4 :(得分:4)
在Xcode 11中存档时,似乎不允许使用具有i386或x86_64体系结构的动态库。我通过从提到的框架中删除那些体系结构来解决了该问题
答案 5 :(得分:2)
答案 6 :(得分:1)
我们已通过在应用程序中使用的所有框架中将Always Embed Swift Standard Libraries
设置为NO
来解决此问题。
答案 7 :(得分:1)
我不得不取消选中“从位码重建”
答案 8 :(得分:1)
在我的情况下,应用程序稀疏失败,原因是我的内部框架依赖Alamofire,并且二进制文件是嵌入和签名的。从嵌入和签名-> 请勿嵌入更改嵌入选项可以立即解决我的问题。
在我看来,此问题背后的所有逻辑是使应用程序包的大小尽可能地降低,但苹果公司嵌入框架会增加此大小。我认为这就是App Thinning所抱怨的全部。因此,对于此问题的一般解决方案,请检查可以增加应用程序捆绑包的所有外部框架。特别是如果您使用的是迦太基。
答案 9 :(得分:1)
启用 Bitcode 导致了我的问题。前往
Build Settings
-> Enable Bitcode
并将其设置为 NO
。
再次尝试存档,它应该可以工作。
答案 10 :(得分:0)
我发现SDWebImageMapKit
可用的SDWebImage
框架存在问题。我刚刚将其删除并获得成功。
答案 11 :(得分:0)
我必须在Frameworks中选择“不嵌入”以解决此问题
答案 12 :(得分:0)
我的问题是我只有一个嵌入式二进制框架。
我从项目中删除了它以进行更新。导致Xcode删除了嵌入框架的构建阶段(因为没有更多的框架可嵌入)。
在添加了新版本的框架之后,embed Binaries阶段处于构建阶段顺序的底部。最终成为失败的原因。
在运行脚本之前,我必须重新排序嵌入框架以解决该问题。
答案 13 :(得分:0)
我有一段时间没有更新我的 cocoapods,通过更新和重新安装 pods 来修复它。
sudo gem install cocoapods
pod update
pod deintegrate
pod install
答案 14 :(得分:-1)
打开终端
打开相应框架的项目拖动路径到Terminal例如。
cd /Users/xxxxx/Desktop/MyProject/ABC.framework
在以下命令中设置您的框架名称并运行
lipo-remove i386 ABC -o ABC && lipo-remove x86_64 ABC -o ABC