最近遇到一个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使用一致的架构。
而实际上,我们的可执行文件是包括armv7
和arm64
的。这次引入了新的动态库,这个动态库本来也是同时支持armv7
和arm64
的,但我们只在arm64
的设备上使用,所以用了宏来包着调用代码。
1 | #if defined(__arm64__) |
如此一来,打包的ipa里的framework就只有arm64
,而可执行文件还是armv7
和arm64
。导致了不一致。
出现问题后,开始尝试各种手段:
- 将app改为仅包含
arm64
。最终上传通过。 - 还原上述操作。使用脚本
lipo --thin arm64
,使得该动态库在打包前仅包含arm64
。最终上传同样问题。 - 还原上述操作。去掉
__arm64__
的宏,使得该动态库在打包后包含armv7
和arm64
。最终上传通过,但最终ipa的通用大小较大。 - 还原上述操作。重新打包一个仅包含
arm64
的该动态库版本。最终上传通过,而且最终ipa的通用大小可以接受。
对比2
和4
,这就有意思了。为什么重新打包有效,后期处理没无效?
分析4
的ipa,发现Payload/xxx.app/Frameworks/abc.framework/Info.plist
里多了这个属性:
1 | <key>UIRequiredDeviceCapabilities</key> |
难怪!
编译和运行都没有问题,说明不是二进制文件的问题!
就是AppStore分析ipa的时候会读取这个Info.plist
。
知道问题所在了,处理就简单了。在pod update
时直接脚本进行架构瘦身和plist的修改,如下
1 | system "lipo #{binary} -thin arm64 -output #{binary}" |