Ensure that app executables and bundled frameworks use consistent architectures
Tags
iOS
Date
Sep 8, 2020
最近遇到一个iOS的打包问题,就是编译和运行都没有问题,甚至上传AppStore过程也没报错,但就在苹果分析ipa的时候发来邮件报以下问题。
We identified one or more issues with a recent delivery for your app, "xxx" 7.0.0 (1). Please correct the following issues, then upload again.ITMS-90562: Invalid Bundle - Ensure that app executables and bundled frameworks use consistent architectures
大概翻译过来就是,上传的ipa无效,请确保app的可执行文件和打包的frameworks使用一致的架构。
而实际上,我们的App可执行文件是包括armv7arm64的。这次引入了新的动态库,这个动态库本来也是同时支持armv7arm64的,但我们只在arm64的设备上使用,所以用了宏来包着调用代码。
#if defined(__arm64__)
#endif
如此一来,打包的ipa里的framework就只有arm64,而可执行文件还是armv7arm64。导致了不一致。
出现问题后,开始尝试各种手段:
  1. 将app改为仅包含arm64最终上传通过
  1. 还原上述操作。使用脚本lipo --thin arm64,使得该动态库在打包前仅包含arm64最终上传同样问题
  1. 还原上述操作。去掉__arm64__的宏,使得该动态库在打包后包含armv7arm64最终上传通过,但最终ipa的通用大小较大。
  1. 还原上述操作。重新打包一个仅包含arm64的该动态库版本。最终上传通过,而且最终ipa的通用大小可以接受。
对比24,这就有意思了。为什么重新打包有效,后期处理没无效?
分析4的ipa,发现Payload/xxx.app/Frameworks/abc.framework/Info.plist里多了这个属性:
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
难怪!
编译和运行都没有问题,说明不是二进制文件的问题!
就是AppStore分析ipa的时候会读取这个Info.plist
知道问题所在了,处理就简单了。在pod update时直接脚本进行架构瘦身和plist的修改,如下
system "lipo #{binary} -thin arm64 -output #{binary}"
system "/usr/libexec/PlistBuddy -c \"Delete :UIRequiredDeviceCapabilities\" #{File.dirname(binary)}/Info.plist"
system "/usr/libexec/PlistBuddy -c \"Add :UIRequiredDeviceCapabilities array\" #{File.dirname(binary)}/Info.plist"
system "/usr/libexec/PlistBuddy -c \"Add :UIRequiredDeviceCapabilities:1 string arm64\" #{File.dirname(binary)}/Info.plist"
 
UIRequiredDeviceCapabilities 的官方文档

Loading Comments...