问题描述
最近我发现,花大约20秒的时间链接项目的原因是由于CocoaPods安装了“ FBAudienceNetwork” SDK,如下图所示:
您可以在此处克隆演示项目:
git@github.com:JohnnyTseng/FBDemoProject.git
这是一个干净的项目,仅包含CocoaPods安装的“ FBAudienceNetwork”,链接该项目大约需要20秒。
复制步骤:
- 使用CocoaPods安装“ FBAudienceNetwork”
- 构建应用
- 链接时间大约需要20秒(对于MBPR 16“,16G,8核)
有趣的是,即使使用CocoaPods安装了10多个库,链接时间仍然非常快,一旦安装了“ FBAudienceNetwork”,每个增量构建大约要花费20秒。
有人知道这是怎么回事吗?我很好奇,但没有足够的知识来探讨这个问题
谢谢!
解决方法
这个问题我也有一段时间了,很烦人。 我不知道解决链接时间问题的方法(也许使用框架的动态版本,而不是静态版本,但这意味着手动管理此依赖项,这对我来说是行不通的),我认为这取决于FB 团队来修复。
但有一个解决方法 - 完全避免链接 FBAudienceNetwork。
这将问题减少到仅与 FB 广告相关的开发,幸运的是这种情况并不常见。
- 在 XCode 和 Podfile 中创建一个单独的目标
- 不要在 Podfile 中指定 FBAudienceNetwork 依赖项
- 创建预处理器宏以从编译中排除 FBAudienceNetwork 相关代码
- 创建一个辅助类来封装所有与FB相关的逻辑
- 使用带有虚拟广告助手的工厂方法
一些细节:
- 目标
假设您的无 fb 目标是 FBDemoProject-no-fb
。然后在Podfile
:
target 'FBDemoProject' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for FBDemoProject
pod 'FBAudienceNetwork'
# any other libs
end
target 'FBDemoProject-no-fb' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# any other libs
end
- 预处理器:
用于 swift:其他 swift 标志 -> -D NO_FB_AD
用于 obj-c 或头文件:预处理器宏 -> NO_FB_AD=1
- 助手:
protocol FbAd {
func tryLoad()
func isLoaded() -> Bool
func tryShow(_ from: UIViewController?)
}
class FbAdFactory {
static func create(
_ placementId: String,_ didLoad: @escaping () -> (),//to be used in `FBInterstitialAdDelegate` methods - just to get an idea
_ didClose: @escaping () -> (),_ onError: @escaping () -> ()
) -> NvFbAd {
#if !NO_FB_AD
return FbAdHelper(
placementId,didLoad,didClose,onError)
#else
return FbAdDummy() //dummy implementation
#endif
}
}
在 FbAdHelper
中使用条件导入:
//to avoid compiler errors
#if canImport(FBAudienceNetwork)
import FBAudienceNetwork
#endif
#if !NO_FB_AD
class FbAdHelper: NSObject,FbAd,FBInterstitialAdDelegate {
//here go encapsulated logic and delegate methods
}
#endif
- 然后在您的控制器中:
var fbAdHelper: NvFbAd!
//...
self.fbAdHelper = FbAdFactory.create("placementId",{ },{ }
)