Как использовать Google Mobile Ads SDK в SwiftUI или использовать UIKit UIViewController в представлении SwiftUI? - PullRequest
1 голос
/ 16 июня 2020

У меня есть представление SwiftUI, в котором я хочу открывать рекламу с вознаграждением из Google Mobile Ads SDK, когда я нажимаю кнопку. Инструкции по загрузке рекламы (https://developers.google.com/admob/ios/rewarded-ads#create_rewarded_ad) находятся в UIKit, и я изо всех сил пытаюсь использовать их в своем приложении SwiftUI. Есть ли способ загрузить рекламу с помощью SwiftUI, или, если я использую UIKit, как мне интегрировать его в SwiftUI?

Это родительское представление SwiftUI:

struct AdMenu: View {

    var body: some View {
   NavigationView {
       NavigationLink(destination: Ads())
        {
            Text("Watch Ad")
        }
    }
}
}

Я не Я не знаю UIKit, но я думаю, что это код, который я хочу использовать в SwiftUI:

    class ViewController: UIViewController, GADRewardedAdDelegate {

    var rewardedAd: GADRewardedAd?

var adRequestInProgress = false

  @IBAction func doSomething(sender: UIButton) {
    if rewardedAd?.isReady == true {
       rewardedAd?.present(fromRootViewController: self, delegate:self)
    }else {
      let alert = UIAlertController(
        title: "Rewarded video not ready",
        message: "The rewarded video didn't finish loading or failed to load",
        preferredStyle: .alert)
      let alertAction = UIAlertAction(
        title: "OK",
        style: .cancel,
        handler: { [weak self] action in
            // redirect to AdMenu SwiftUI view somehow?
        })
      alert.addAction(alertAction)
      self.present(alert, animated: true, completion: nil)
    }
}

func createAndLoadRewardedAd() {
    rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
    adRequestInProgress = true
    rewardedAd?.load(GADRequest()) { error in
      self.adRequestInProgress = false
      if let error = error {
        print("Loading failed: \(error)")
      } else {
        print("Loading Succeeded")
      }
    }
  return rewardedAd
}

// Tells the delegate that the user earned a reward
func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
  print("Reward received with currency: \(reward.type), amount \(reward.amount).")
}
// Tells the delegate that the rewarded ad was presented
func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad presented.")
}
// Tells the delegate that the rewarded ad was dismissed
func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad dismissed.")
}
// Tells the delegate that the rewarded ad failed to present
func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) {
    rewardedAd = createAndLoadRewardedAd()
    print("Rewarded ad failed to present.")
}

    override func viewDidLoad() {
        super.viewDidLoad()
    if !adRequestInProgress && !(rewardedAd?.isReady ?? false) {
    rewardedAd = createAndLoadRewardedAd()
}

1 Ответ

1 голос
/ 25 июня 2020

Я использовал очень простой подход. У меня есть класс делегата, который загружает объявление с вознаграждением и сообщает представлению, что оно загружено, следовательно, представление представляет его. Когда пользователь просматривает объявление полностью, тот же делегат получает обратный вызов успеха и информирует об этом представление.

Код делегата выглядит так: -

class RewardedAdDelegate: NSObject, GADRewardedAdDelegate, ObservableObject {
@Published var adLoaded: Bool = false
@Published var adFullyWatched: Bool = false

var rewardedAd: GADRewardedAd? = nil

func loadAd() {
    rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
        rewardedAd!.load(GADRequest()) { error in
          if error != nil {
            self.adLoaded = false
          } else {
            self.adLoaded = true
          }
        }
}

/// Tells the delegate that the user earned a reward.
func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
    adFullyWatched = true
}

/// Tells the delegate that the rewarded ad was presented.
func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) {
     self.adLoaded = false
}

/// Tells the delegate that the rewarded ad was dismissed.
func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {}

/// Tells the delegate that the rewarded ad failed to present.
func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) {}
}

Теперь вам нужно представление, чтобы инициировать и представить RewardedAd: -

struct RewardedAd: View {
@ObservedObject var adDelegate = RewardedAdDelegate()

var body: some View {
    if adDelegate.adLoaded && !adDelegate.adFullyWatched {
        let root = UIApplication.shared.windows.first?.rootViewController
        self.adDelegate.rewardedAd!.present(fromRootViewController: root!, delegate: adDelegate)
    }
    
    return Text("Load ad").onTapGesture {
        self.adDelegate.loadAd()
    }
}
}

Пояснение: - В представлении выше, когда пользователь нажимает на Load Ad, мы инициируем загрузку, а затем делегат обновляет опубликованное логическое значение. Это сообщает нашему представлению, что объявление загружено, и мы вызываем: -

let root = UIApplication.shared. windows .first? .RootViewController self.adDelegate.rewardedAd! .Present (fromRootViewController: root! Это проинформирует нас, что нам нужно вознаградить пользователя сейчас (вы можете добавить свой способ обработки / вознаграждения пользователя).

Надеюсь, это поможет. Удачного кодирования ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...