【问题标题】:What makes "FBAudienceNetwork" link took 20 seconds?是什么让“FBAudienceNetwork”链接花了 20 秒?
【发布时间】:2020-10-13 03:54:42
【问题描述】:

最近我发现链接项目需要大约 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 秒。

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

谢谢!

【问题讨论】:

    标签: ios swift xcode facebook-ios-sdk


    【解决方案1】:

    我也有这个问题很长一段时间了,这很烦人。 我不知道解决链接时间问题的方法(也许使用框架的动态版本,而不是静态的,但这意味着手动管理此依赖项,这对我来说是不行的),我认为这取决于FB 团队来修复。

    但有一种解决方法 - 完全避免链接 FBAudienceNetwork。

    这将问题减少到仅与 FB 广告相关的开发,幸运的是,这种情况并不常见。

    • 在 XCode 和 Podfile 中创建单独的目标
    • 不要在 Podfile 中指定 FBAudienceNetwork 依赖项
    • 创建预处理器宏以从编译中排除与 FBAudienceNetwork 相关的代码
    • 创建一个帮助类来封装所有 FB 相关的逻辑
    • 对虚拟广告助手使用工厂方法

    一些细节:

    • 目标

    假设您的 fb-free 目标是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",
                { },
                { },
                { }
            )
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2021-12-19
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 2021-10-01
      相关资源
      最近更新 更多