#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 секунд.
Шаги для воспроизведения:
- Установите «FBAudienceNetwork» с помощью CocoaPods
- Создайте приложение
- Время соединения займет ~ 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",
{ },
{ },
{ }
)