Почему ссылка «FBAudienceNetwork» заняла 20 секунд?

#ios #swift #xcode #facebook-ios-sdk

#iOS #swift #xcode #facebook-ios-sdk

Вопрос:

Недавно я узнал, что причина, по которой для связывания проекта требуется ~ 20 секунд, связана с установкой SDK «FBAudienceNetwork» CocoaPods, как показано на этом изображении:

введите описание изображения здесь

Вы можете клонировать демонстрационный проект здесь:

 git@github.com:JohnnyTseng/FBDemoProject.git
  

Это чистый проект, который содержит только «FBAudienceNetwork», установленный CocoaPods, и для связывания проекта потребуется ~ 20 секунд.

Шаги для воспроизведения:

  1. Установите «FBAudienceNetwork» с помощью CocoaPods
  2. Создайте приложение
  3. Время соединения займет ~ 20 секунд (на MBPR 16 «, 16G, 8 ядер)

Интересно то, что если вы устанавливаете даже более 10 библиотек с CocoaPods, время связывания все равно очень быстро, после установки «FBAudienceNetwork» на каждую инкрементную сборку уходило ~ 20 секунд.

Кто-нибудь знает, как это происходит? Мне очень любопытно, но у меня недостаточно знаний, чтобы разобраться в этой проблеме

Спасибо!

Ответ №1:

У меня тоже эта проблема уже довольно давно, и это очень раздражает. Я не знаю способа исправить проблему времени связывания (возможно, использовать динамическую версию фреймворка, а не статическую, но это означает управление этой зависимостью вручную, что для меня недопустимо), я думаю, что исправить это должна команда FB.

Но есть обходной путь — вообще не связывать FBAudienceNetwork.

Это сводит проблему только к разработке, связанной с рекламой в FB, что, к счастью, происходит не так часто.

  • создайте отдельную цель в XCode и Podfile
  • не указывайте зависимость FBAudienceNetwork в Podfile
  • создайте макросы препроцессора, чтобы исключить связанный с FBAudienceNetwork код из компиляции
  • создайте вспомогательный класс, который будет инкапсулировать всю логику, связанную с FB
  • используйте заводской метод с фиктивным помощником ad

Некоторые подробности:

  • цель

Предположим, ваша цель без 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",
            { },
            { },
            { }
        )