首页 > 解决方案 > 是什么让“FBAudienceNetwork”链接花了 20 秒?

问题描述

最近我发现链接项目需要大约 20 秒的原因是因为 CocoaPods 安装了“FBAudienceNetwork”SDK,如下图所示:

在此处输入图像描述

您可以在此处克隆演示项目:

git@github.com:JohnnyTseng/FBDemoProject.git

这是一个干净的项目,仅包含由 CocoaPods 安装的“FBAudienceNetwork”,链接该项目大约需要 20 秒。

重现步骤:

  1. 使用 CocoaPods 安装“FBAudienceNetwork”
  2. 构建应用程序
  3. 链接时间大约需要 20 秒(在 MBPR 16"、16G、8 核上)

有趣的是,如果你用 CocoaPods 安装了 10 多个库,链接时间仍然非常快,一旦你安装了“FBAudienceNetwork”,每次增量构建大约需要 20 秒。

有谁知道这是怎么回事?我很好奇,但没有足够的知识来深入研究这个问题

谢谢!

标签: iosswiftxcodefacebook-ios-sdk

解决方案


我也有这个问题很长一段时间了,这很烦人。我不知道解决链接时间问题的方法(也许使用框架的动态版本,而不是静态的,但这意味着手动管理此依赖项,这对我来说是不行的),我认为这取决于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",
            { },
            { },
            { }
        )


推荐阅读