SwiftUI: межстраничное объявление Admob не отображается в rootViewController

ЗАПИСАНО В SWIFTUI

Я реализовал страницу настроек в моем приложении SwiftUI, которая отображается при нажатии кнопки в представлении. Этот вид заключен в лист. Вы можете увидеть код ниже:

TabsBar(showOptionsTab: $showOptionsTab)
    .sheet(isPresented: $showOptionsTab)
    {
        OptionsTab(showOptionsTab: self.$showOptionsTab)
    }

Я реализовал межстраничное объявление в этой "вкладке параметров", которое создается, когда вкладка параметров загружается в вызове.onAppear() и отображается при нажатии кнопки "Назад". Вы можете использовать код из вкладки OptionsTab ниже:

@State private var interstitial : GADInterstitial!

VStack
{
    ... other code

    Button(action:
    {
        if ( self.interstitial.isReady)
        { 
            let root = UIApplication.shared.windows.first?.rootViewController
            self.interstitial.present(fromRootViewController: root!)               
        }

        self.showOptionsTab.toggle()
    })
    {
        Image(systemName: "xmark")
            .font(.largeTitle)
    }
}
.onAppear
{
    self.interstitial = GADInterstitial(adUnitID: "addID")
    let req = GADRequest()
    self.interstitial.load(req) 
}

У меня есть дополнительный код внутри кнопки, который регистрирует статус межстраничного объявления, и он показывает, что он ГОТОВ, и текущий код попадает... но он никогда не появляется.

Я реализовал этот точный код в ContentView, и межстраничные объявления отлично загружаются. Из-за того, что этот код находится внутри листа, межстраничное объявление не отображается.

Является ли rootViewController неправильным представлением для загрузки межстраничного объявления в представлении, представленном с листа? Иначе что еще я делаю не так?

Спасибо за помощь в продвижении!

2 ответа

Решение

Попробуй это

TabsBar(showOptionsTab: $showOptionsTab)
    .sheet(isPresented: $showOptionsTab)
    {
        OptionsTab(showOptionsTab: self.$showOptionsTab)
            .OnDisapear 
            {    
                if ( self.interstitial.isReady)
                { 
                    let root = UIApplication.shared.windows.first?.rootViewController
                    self.interstitial.present(fromRootViewController: root!)               
                }
            } 
        }
    }

Затем добавьте межстраничную переменную состояния в этом представлении, и onAppear для ContextView создайте там межстраничное объявление.

Решение 2:

(не проверено, но должно работать): присутствует в PresentingViewController вместо rootViewController

  if ( self.interstitial.isReady)
        { 
            let root = UIApplication.shared.windows.first?.rootViewController?.presentingViewController
            self.interstitial.present(fromRootViewController: root!)               
        }

проверьте причину, в конце ответа

Решение 1:

похоже, что есть что-то, что препятствует отображению межстраничной рекламы, когда представление листа уже представлено

в моем случае я хотел показать объявление сразу после представления представления листа, что не сработало

то, что сработало, представляет собой объявление, и после его отклонения будет представлен вид листа, и он сработал!

для межстраничного объявления я использовал этот код

import SwiftUI
import GoogleMobileAds
import UIKit

final class Interstitial:NSObject, GADInterstitialDelegate{
  var interstitialID = "ca-app-pub-3940256099942544/4411468910"
  var interstitial:GADInterstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
  var sheet: (() -> Void)? = nil  //this closure will be executed after dismissing the ad

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

  func LoadInterstitial(){
    let req = GADRequest()
    self.interstitial.load(req)
    self.interstitial.delegate = self
  }

  func showAd(then sheet:(() -> Void)?){
    if self.interstitial.isReady{
      let root = UIApplication.shared.windows.first?.rootViewController
      self.interstitial.present(fromRootViewController: root!)
      self.sheet = sheet
    }
    else{
      print("Not Ready")
    }
  }

  func interstitialDidDismissScreen(_ ad: GADInterstitial) {
    self.interstitial = GADInterstitial(adUnitID: interstitialID)
    LoadInterstitial()
    if let presentSheet = sheet {
      presentSheet()
    }
  }
}

здесь мы передаем все, что хотим, в закрытие, которое будет вызываться, когда interstitialDidDismissScreen называется

теперь вместо переключения состояния при нажатии кнопки оно будет переключаться после затемнения рекламы

в верхней части вашего contentView:

    struct HistoryView: View {
      private var fullScreenAd: Interstitial!
    init() {
fullScreenAd = Interstitial()
}
    }

затем в вашей кнопке:

   Button(action: {
            self.interstitial.showAd {
              self.showOptionsTab.toggle()

            }              

        })

Примечание: я использовал код межстраничной рекламы из этой сути

Кроме того, AFAIK мы не можем сказать, является ли это ошибкой в ​​swiftUI или это то, о чем должен был позаботиться googleAdmob?, Нет поддержки SwiftUI от Google, поэтому мы не можем винить их.

проблема AFAIK, что в iOS 13 захват корневого ViewController вернет контроллер представления, который представил лист, и при попытке представить объявление UIKit будет жаловаться, что вы пытаетесь представить контроллер представления, в то время как контроллер представления уже присутствует (лист), решение? просто, представить объявление, на представленном представлении Контроллер (Лист)

Другие вопросы по тегам