我一直在尝试在我的 iOS 应用程序中实现原生 Google adMob 广告,并遵循 admob 官方教程:https://developers.google.com/admob/ios/native/advanced
无论我是手动添加所需的admob框架还是通过CocoaPods添加,admob框架中的所有类都未被界面生成器检测到,因此我无法将UIView的自定义类设置为所需的admob视图类。但奇怪的是,在我的 swift 文件中导入框架后,我可以使用所有与 admob 相关的类。
请看下面的截图:
我发现了一个github项目,它什么也没做,只是通过Cocoapoding admob框架实现了admob原生广告(项目链接)。我下载了它的源代码,奇怪的是,admob 框架类可以通过该项目中的界面检测到。
我已经挠头好几天了,一直在寻找解决方案,但没有运气。如果您知道为什么会发生这种情况,请帮助我,并且非常感谢您的帮助。
TL;DR
将 CocoaPods pod 版本降级为7.67.0
. (-:
Podfile
pod 'Google-Mobile-Ads-SDK', '7.67.0'
解释
这是因为GoogleMobileAds.framework
became GoogleMobileAds.xcframework
in 7.68.0+
- source。这意味着框架 (iOS 9) 和主要目标 (iOS 14.0+) 之间的 Objective C 运行时有所不同。XCFramework
s 是一种特殊类型二进制框架,因此在编译完成后手动编辑 iOS 版本不会产生任何影响,事实上,即使您在Podfile
这不会有什么不同。
主代码在底层有一个不同的、更快的 Objective-C 运行时,因此跟踪使用不同数据结构的类XCFramework
。例如,如果在框架中定义了一个类别,即使未使用新的重写方法(在运行时),该类别也将存储在读写内存中。另一方面,iOS 14.0+ 中的 Objective-C 运行时doesn't加载这些方法,直到它们被用来节省 RAM。这是一个重大改变对于旧的iOS版本,因为用于索引这些类的旧数据结构不再包含类别方法(在同一存储区域中)并且框架中的依赖逻辑(读取这些数据结构)将不再工作。方法混合处理方式不同,这就是GoogleUtilities
也是如此(依赖于GoogleMobileAds
)所以这可能会导致问题。因此,即使 IB 自动完成不起作用(这没什么大问题),也不会在运行时动态找到该类。我没有提到更改method list
表示在新运行时的引擎盖下发生了变化,因为这超出了这个问题的范围,但旧的方法列表在运行时仍然可用(不间断的改变).
要解决这个问题,只需使用7.67.0
你的版本Podfile
目前。你不能做任何其他事关于这个作为end-user的框架,因为podspec
将框架类型指定为vendored_framework
这只能在框架的源代码中编辑。我尝试禁用use_frameworks
但这不能编译。如果您可以编辑podspec
对于您自己的框架,更改为静态框架是一个可行的解决方案(有注意事项)。框架在构建时而不是静态框架的加载时链接,因此您应该能够在 IB 中看到框架类,但随后您必须使框架的依赖 pod 也是静态的(更多工作)。更简单的等效方法是降级 pod,或者禁用use_frameworks
在 Podfile 中。然而,框架具有更快的性能(链接时间)并且通常是首选,这就是为什么 CocoaPods 默认启用它们。
我还建议针对此错误创建一个新的 GitHub Issue,但看起来 SDK 不是开源的。也许苹果将来会解决这个错误,或者一旦谷歌意识到这个错误就会被谷歌解决,但是这是一个解决方法目前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)