Admob sdk v8.0+ SwiftUI 中的激励广告

Admob sdk v8.0+ rewarded ad in SwiftUI

我正在尝试在我的 SwiftUI 应用程序中制作来自 Admob 的激励广告,但遇到了一些问题。我正在使用用 obj-c 编写的官方文档,并试图从中制作 swift class 。 这是我的

final class Rewarded: NSObject, GADFullScreenContentDelegate {
    
    let token = Bundle.main.object(forInfoDictionaryKey: "GADApplicationIdentifier") as? String
    
    var rewardedAd = GADRewardedAd()
    
    var rewardFunction: (() -> Void)? = nil
    
    override init() {
        super.init()
        LoadRewarded()
    }
    
    func LoadRewarded() {
        let req = GADRequest()
        GADRewardedAd.load(withAdUnitID: token!, request: req, completionHandler: { gad, error in
            print(error)
        })
    }
    
    func showAd(rewardFunction: @escaping () -> Void){
        let root = UIApplication.shared.windows.first?.rootViewController
        do {
            try self.rewardedAd.canPresent(fromRootViewController: root!)
            self.rewardFunction = rewardFunction
            self.rewardedAd.present(fromRootViewController: root!, userDidEarnRewardHandler: rewardFunction)
        } catch let error {
            print(error)
        }
    }
    
    func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
        if let rf = rewardFunction {
            rf()
        }
    }
    
    func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
        self.rewardedAd = GADRewardedAd()
        LoadRewarded()
    }
}

在方法 showAd 中,我有一个异常 nilerror 调用 try self.rewardedAd.canPresent(fromRootViewController: root!) 并且不知道如何处理它。我没有找到任何说明如何使用 sdk 8+ 版本设置它的教程,你能帮我找出问题所在吗?

我找到了这段代码。我认为它可以帮助你:

import SwiftUI
import GoogleMobileAds
import UIKit

final class Rewarded: NSObject, GADRewardedAdDelegate{

    var rewardedAd:GADRewardedAd = GADRewardedAd(adUnitID: rewardID)

    var rewardFunction: (() -> Void)? = nil

    override init() {
        super.init()
        LoadRewarded()
    }

    func LoadRewarded(){
        let req = GADRequest()
        self.rewardedAd.load(req)
    }

    func showAd(rewardFunction: @escaping () -> Void){
        if self.rewardedAd.isReady{
            self.rewardFunction = rewardFunction
            let root = UIApplication.shared.windows.first?.rootViewController
            self.rewardedAd.present(fromRootViewController: root!, delegate: self)
        }
       else{
           print("Not Ready")
       }
    }

    func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
        if let rf = rewardFunction {
            rf()
        }
    }

    func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
        self.rewardedAd = GADRewardedAd(adUnitID: rewardID)
        LoadRewarded()
    }
}

struct ContentView:View{
    var rewardAd:Rewarded

    init(){
        self.rewardAd = Rewarded()
    }

var body : some View{
  Button(action: {
    self.rewardAd.showAd(rewardFunction: {
      print("Give Reward")
    }
  }){
    Text("My Button")
  }
}

}

这里是 link 我找到片段的地方:https://medium.com/@michaelbarneyjr/how-to-integrate-admob-ads-in-swiftui-fbfd3d774c50

找到解决方案,Google 有关于迁移到 v8+ sdk 的论文。因此,从 https://medium.com/@michaelbarneyjr/how-to-integrate-admob-ads-in-swiftui-fbfd3d774c50 and https://developers.google.com/admob/ios/migration#swift_7 我在 SwiftUI

中使用 sdk 8.5 版本制作了一个有效的奖励广告
final class Rewarded: NSObject, GADFullScreenContentDelegate {
    
    var rewardedAd: GADRewardedAd?
    
    var rewardFunction: (() -> Void)? = nil
    
    override init() {
        super.init()
        LoadRewarded()
    }
    
    func LoadRewarded(){
        let request = GADRequest()
          GADRewardedAd.load(withAdUnitID: Bundle.main.object(forInfoDictionaryKey: "GADApplicationIdentifier") as! String,
                                  request: request, completionHandler: { (ad, error) in
                                    if let error = error {
                                      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
                                      return
                                    }
                                    self.rewardedAd = ad
                                    self.rewardedAd?.fullScreenContentDelegate = self
                                  }
          )
    }
    
    func showAd(rewardFunction: @escaping () -> Void){
        let root = UIApplication.shared.windows.first?.rootViewController
        if let ad = rewardedAd {
              ad.present(fromRootViewController: root!,
                       userDidEarnRewardHandler: {
                            let reward = ad.adReward
                            rewardFunction()
                       }
              )
          } else {
            print("Ad wasn't ready")
          }
    }
    
    func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
        if let rf = rewardFunction {
            rf()
        }
    }
}