ios - 是什么让“FBAudienceNetwork”链接花了 20 秒?
问题描述
最近我发现链接项目需要大约 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",
{ },
{ },
{ }
)
推荐阅读
- python - PySerial。在串行读取期间无法进行任何输入
- javascript - 如何使用按钮更改在搜索字段中输入的文本值的颜色?
- java - 设计一个 JVM REPL
- javascript - 工具提示中的 d3.js 格式编号
- vba - 错误“应用程序定义或对象定义”
- r - (R) 有条件地格式化表格中的单元格
- python - TypeError:无法将 cuda:0 设备类型张量转换为 numpy。首先使用 Tensor.cpu() 将张量复制到主机内存
- java - 如何在 Azure DevOps 上部署 Java Web 应用
- c - 在 C 中将 Alphabets 设置为双精度数组
- sql-server - 非聚集列存储索引与 bigint 字段上的传统非聚集行存储索引