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