犹落

不雨花犹落,无风絮自飞。

0%

Ensure that app executables and bundled frameworks use consistent architectures

最近遇到一个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使用一致的架构。

而实际上,我们的可执行文件是包括armv7arm64的。这次引入了新的动态库,这个动态库本来也是同时支持armv7arm64的,但我们只在arm64的设备上使用,所以用了宏来包着调用代码。

1
2
3
#if defined(__arm64__)

#endif

如此一来,打包的ipa里的framework就只有arm64,而可执行文件还是armv7arm64。导致了不一致。

出现问题后,开始尝试各种手段:

  1. 将app改为仅包含arm64最终上传通过
  2. 还原上述操作。使用脚本lipo --thin arm64,使得该动态库在打包前仅包含arm64最终上传同样问题
  3. 还原上述操作。去掉__arm64__的宏,使得该动态库在打包后包含armv7arm64最终上传通过,但最终ipa的通用大小较大。
  4. 还原上述操作。重新打包一个仅包含arm64的该动态库版本。最终上传通过,而且最终ipa的通用大小可以接受。

对比24,这就有意思了。为什么重新打包有效,后期处理没无效?

分析4的ipa,发现Payload/xxx.app/Frameworks/abc.framework/Info.plist里多了这个属性:

1
2
3
4
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>

难怪!

编译和运行都没有问题,说明不是二进制文件的问题!

就是AppStore分析ipa的时候会读取这个Info.plist

知道问题所在了,处理就简单了。在pod update时直接脚本进行架构瘦身和plist的修改,如下

1
2
3
4
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"