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 будет жаловаться, что вы пытаетесь представить контроллер представления, в то время как контроллер представления уже присутствует (лист), решение? просто, представить объявление, на представленном представлении Контроллер (Лист)