最近项目在升级百度地图SDK的时候遇到了openssl冲突,起因是项目中集成了一个定制SDK,定制SDK中也使用了openssl库,百度地图SDK从6.3.0版本升级了openssl库,升级后两个SDK中openssl库版本不一致导致冲突。
为了解决冲突,把定制第三方SDK从静态库更换成了动态库。更换之后冲突解决,真机联调也正常运行,但是在打包上传App Store的时候遇到了如下问题。
CFBundleIdentifier Collision. There is more than one bundle with the CFBundleIdentifier value 'xxx' under the iOS application 'xxx.app'.
Invalid Bundle. The bundle at 'xxx.app/xxx/iOSTunnel.appex' contains disallowed nested bundles.
Invalid Bundle. The bundle at 'xxx.app/xxx/iOSTunnel.appex' contains disallowed file 'Frameworks'.
根据描述可知在App中存在bundleid冲突,在iOSTunnel扩展中有嵌套的bundle,有问题的id都指向新引入的动态库。
原因分析
主App和iOSTunnel扩展中都用到了定制SDK,扩展依赖于主App,动态库的嵌入方式都选择了Embed & Sign
,在打包时动态库会进入ipa文件,打包后在扩展中嵌套了动态库,打包信息如下图:
解决方案
方案1:
iOSTunnel扩展中动态库的嵌入方式修改成Do not Embed
,这样扩展中的动态库不会嵌套进入ipa中。
方案2:
iOSTunnel扩展中动态库嵌入方式仍为Embed & Sign
,在iOSTunnel的target下配置以下脚本:
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then
rm -fr Frameworks
fi
首先选择扩展target,在Build Phases下 New Run Script Phase
配置脚本
亲测以上两种解决方案都好用,在配置完之后重新打包上传即可成功。成功时打包信息如下: