Google-Mobile-Ads-SDK在iOS主App和Framework同时使用初始化报错
问题原因
- 你当前的Podfile配置会使
Google-Mobile-Ads-SDK被独立编译并打包进MyFramework和MainApp两个二进制产物中,App运行时存在两份完全相同的SDK代码副本。 - Objective-C的Runtime在加载同名类时,后加载的类会覆盖先加载的类实现。主App启动后先加载自身打包的SDK实例,你在主App触发广告请求时,SDK刚开始初始化,随后内嵌Framework加载时,Framework包里的SDK类被Runtime加载,直接覆盖了之前已经半初始化的SDK类状态,就会抛出「SDK未完成初始化就执行网络请求」的错误。
- 你之前尝试的两种方案还是没有避免重复依赖的问题,两个target各自独立引入SDK还是会产生两份副本。
解决方案
方案1(推荐):调整依赖规则,仅主App打包SDK
修改Podfile如下,让Framework仅在编译阶段引用SDK,不将SDK打包进自身二进制,运行时统一使用主App内的SDK实例:
platform :ios, '10.0' target 'MainApp' do use_frameworks! pod 'Google-Mobile-Ads-SDK', '~> 7.67.0' pod 'CocoaLumberjack/Swift', '~> 3.5.3' ... end target 'MyFramework' do use_frameworks! pod 'FLAnimatedImage', '~> 1.0' # 仅编译阶段依赖,不打包进Framework产物 pod 'Google-Mobile-Ads-SDK', '~> 7.67.0', :configurations => ['Debug', 'Release'] ... end
修改完成后进入MyFramework的编译配置,在Build Phases->Embed Frameworks阶段确认没有Google-Mobile-Ads-SDK,链接方式改为Do Not Embed即可。
方案2:使用抽象target统一管理公共依赖
如果需要多target共享依赖且保证仅打包一次,可以用CocoaPods的抽象target特性:
platform :ios, '10.0' abstract_target 'CommonDeps' do use_frameworks! pod 'Google-Mobile-Ads-SDK', '~> 7.67.0' target 'MyFramework' do pod 'FLAnimatedImage', '~> 1.0' end target 'MainApp' do pod 'CocoaLumberjack/Swift', '~> 3.5.3' end end
执行pod install后CocoaPods会自动处理依赖逻辑,仅将广告SDK打包进最终的主App产物,不会出现重复打包问题。
内容的提问来源于stack exchange,提问作者D4ttatraya
相关产品推荐
相关产品推荐

