iOS集成动态库后打包上传“CFBundleIdentifier Collision”和“Invalid Bundle”错误

122 阅读1分钟

最近项目在升级百度地图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'.

Snip20230907_38.png

根据描述可知在App中存在bundleid冲突,在iOSTunnel扩展中有嵌套的bundle,有问题的id都指向新引入的动态库。

原因分析

主App和iOSTunnel扩展中都用到了定制SDK,扩展依赖于主App,动态库的嵌入方式都选择了Embed & Sign,在打包时动态库会进入ipa文件,打包后在扩展中嵌套了动态库,打包信息如下图:

Snip20230907_63.png

解决方案

方案1:

iOSTunnel扩展中动态库的嵌入方式修改成Do not Embed,这样扩展中的动态库不会嵌套进入ipa中。

Snip20230907_55.png

方案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

Snip20230907_57.png

配置脚本

Snip20230907_59.png

亲测以上两种解决方案都好用,在配置完之后重新打包上传即可成功。成功时打包信息如下:

Snip20230907_62.png