SwiftUI - межстраничное объявление Google AdMob не отображается в onAppear - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь показать межстраничное объявление из Google AdMob при появлении, но оно не отображается, а в консоли отображается сообщение «не готово». Я просмотрел много других руководств и страниц с переполнением стека, но не нашел ответа. Может кто-нибудь помочь мне? Вот мой код:

struct ContentView: View {
@State var interstitial: GADInterstitial!
var body: some View{
    Text("Some Text").onAppear(perform: {
        self.interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
        let req = GADRequest()
        self.interstitial.load(req)


                if self.interstitial.isReady{
                        let root = UIApplication.shared.windows.first?.rootViewController
                        self.interstitial.present(fromRootViewController: root!)
                    }else {
                    print("not ready")
                }



    })
}
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2020

Как упоминалось в комментариях, использование обратного вызова interstitialDidReceiveAd для показа рекламы крайне не рекомендуется Google Admob. Вместо этого вы можете уведомить свое представление о том, что объявление загружено, а затем ваше представление должно принять решение, следует ли показывать межстраничное объявление или нет. Поэтому просто создайте вспомогательный класс с функцией load и show , как показано: -

import Foundation
import GoogleMobileAds
import UIKit
    
final class InterstitialAd : NSObject, GADInterstitialDelegate, ObservableObject {
    var interstitial: GADInterstitial? = nil
    @Published var isLoaded: Bool = false
    
    func LoadInterstitial() {
        interstitial = GADInterstitial(adUnitID: Constants.interstitialAdCode)
        let req = GADRequest()
        interstitial!.load(req)
        interstitial!.delegate = self
    }
    
    func showAd() {
        if let fullScreenAd = self.interstitial, fullScreenAd.isReady {
           let root = UIApplication.shared.windows.first?.rootViewController
           fullScreenAd.present(fromRootViewController: root!)
           isLoaded = false
        }
    }
    
    func interstitialDidReceiveAd(_ ad: GADInterstitial) {
        isLoaded = true
    }
}

Теперь просто используйте этот класс в своем представлении и каждый раз, когда вы вызываете метод загрузки создает новый запрос (требуется согласно do c). Теперь вы должны наблюдать логическое значение isLoaded в своем представлении и можете запускать объявление на экране (используя showAd) только тогда, когда оно предназначено, а не сразу после его загрузки, потому что мы должны учитывать, что пользователь может быть в середине чего-то ...

0 голосов
/ 27 мая 2020

Операция GADInterstitial.load является асинхронной и не дожидается загрузки объявления, поэтому вам нужно использовать делегат, если вы хотите показать добавление сразу после загрузки.

Вот возможное решение

class MyDInterstitialDelegate: NSObject, GADInterstitialDelegate {

    func interstitialDidReceiveAd(_ ad: GADInterstitial) {
        if ad.isReady{
            let root = UIApplication.shared.windows.first?.rootViewController
            ad.present(fromRootViewController: root!)
        } else {
            print("not ready")
        }
    }
}

struct ContentView: View {
    @State var interstitial: GADInterstitial!
    private var adDelegate = MyDInterstitialDelegate()
    var body: some View{
        Text("Some Text").onAppear(perform: {
            self.interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
            self.interstitial.delegate = self.adDelegate

            let req = GADRequest()
            self.interstitial.load(req)
        })
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...