【问题标题】:Admob sdk v8.0+ rewarded ad in SwiftUISwiftUI 中的 Admob sdk v8.0+ 奖励广告
【发布时间】:2021-05-29 21:11:26
【问题描述】:

我正在尝试在我的 SwiftUI 应用中使用 Admob 制作奖励广告,但遇到了一些问题。我正在使用用 obj-c 编写的官方文档,并试图从中创建 swift 类。 这是我所拥有的

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 中,我从try self.rewardedAd.canPresent(fromRootViewController: root!) 的调用中遇到了一个异常nilerror,并且不知道该怎么做。我没有找到任何说明如何使用 sdk 8+ 版本设置它的教程,请您帮我找出问题所在。

【问题讨论】:

  • 纯 SwiftUI 应用程序中没有根视图控制器。您可以使用旧的 SwiftUI 方法将 SwiftUI 视图层次结构包装在 UIHostingController 中,也可以将 admob 视图控制器包装在 UIViewRepresentable 中。

标签: ios swiftui uikit admob


【解决方案1】:

找到了解决方案,Google 有关于迁移到 v8+ sdk 的论文。所以,从https://medium.com/@michaelbarneyjr/how-to-integrate-admob-ads-in-swiftui-fbfd3d774c50https://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()
        }
    }
}

【讨论】:

  • 能否补充一下您在 SwiftUI 中的实现方式?
  • @FrederikBrammer 只需调用 showAd(),不需要任何特定的 SwiftUI 代码
【解决方案2】:

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

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")
  }
}

}

这是我找到 sn-p 的链接:https://medium.com/@michaelbarneyjr/how-to-integrate-admob-ads-in-swiftui-fbfd3d774c50

【讨论】:

  • 很遗憾没有,因为8.0版本的sdk没有这样的类和方法,你知道作者使用的sdk具体版本是什么吗?
  • 我找到了一个版本 - 7.69.0,该版本一切正常,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2019-04-08
  • 2018-08-19
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多