最近遇到一个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可执行文件是包括
armv7
和arm64
的。这次引入了新的动态库,这个动态库本来也是同时支持armv7
和arm64
的,但我们只在arm64
的设备上使用,所以用了宏来包着调用代码。#if defined(__arm64__) #endif
如此一来,打包的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
里多了这个属性:<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...