iOS项目集成AdMob遇多类问题,求成功集成经验与帮助
iOS AdMob集成常见问题解决方案
问题1:激励广告展示时类型转换错误
报错行:ad.present(fromRootViewController: self),错误信息:"Cannot convert value of type 'ContentView' to expected argument type 'UIViewController'"
原因是ContentView属于SwiftUI视图,而AdMob的present方法需要传入UIViewController类型参数。可以通过以下方式解决:
- 获取当前应用的根视图控制器来替代
self:
private func getRootViewController() -> UIViewController? { guard let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene, let window = scene.windows.first, let rootVC = window.rootViewController else { return nil } return rootVC }
修改后的展示函数:
func show() { guard let ad = rewardedAd, let rootVC = getRootViewController() else { print("广告未准备好或无法获取视图控制器") return } ad.present(fromRootViewController: rootVC) { let reward = ad.adReward print("获得奖励:货币\(reward.amount),数值\(reward.amount.doubleValue)") // 在这里实现用户奖励逻辑 } }
- 若项目基于SwiftUI,也可以创建一个
UIViewControllerRepresentable的包装器,将广告逻辑放在UIKit控制器中处理,再在SwiftUI中调用。
问题2:Google Utilities中API废弃警告
例如:'subscriberCellularProvider' is deprecated: first deprecated in iOS 12.0
这类警告是SDK依赖库的历史API问题,通常不影响功能运行,可通过以下方式处理:
- 升级到最新版本的Google Mobile Ads SDK,官方会逐步替换废弃API,减少此类警告。
- 若需消除警告,可在Xcode的项目Build Settings中,找到
Other Warning Flags,添加-Wno-deprecated-declarations来忽略废弃声明警告。注意尽量不要全局屏蔽,可针对特定目标文件或库设置,避免遗漏其他重要警告。
内容的提问来源于stack exchange,提问作者Tim_Waddles
相关产品推荐
相关产品推荐

