Admob Награда видео - проблема с корневым представлением контроллера - PullRequest
0 голосов
/ 11 ноября 2018

Итак, в моем приложении два контроллера представления:

StartViewController (Root view controller) и GameViewController

Я представляю вознагражденное видео от GameViewController

Все работает отлично, кроме случаев, когда пользователь нажимает «Пропустить сейчас» на видео с вознаграждением. Он отклоняет GameViewController и возвращается к StartViewController, который является моим корневым контроллером представления.

Если пользователь просматривает все видео, оно работает как положено.

Код для представления вознагражденного вида из GameViewController:

func playReward()
{
    if rewardVideo!.isReady
    {
        if var topController = UIApplication.shared.keyWindow?.rootViewController
        {
            while let presentedViewController = topController.presentedViewController
            {
                // Make top controller topmost view controller
                topController = presentedViewController
            }

            rewardVideo!.present(fromRootViewController: topController)
        }
    }
}

Я временно изменил корень на GameViewController, чтобы посмотреть, была ли это проблема, и сделал это, поэтому я знаю, что это проблема, связанная с контроллером корневого представления и кнопкой «Пропустить сейчас» в видео с вознаграждением.

Ответы [ 4 ]

0 голосов
/ 08 декабря 2018

Для тех из вас, кто сталкивается с той же проблемой:

Вы можете создать новый класс для вашего rootViewController (TabBarController или NavigationController и т. Д.) И реализовать там что-то вроде этого:

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    dismissalCounter += 1
    if (dismissalCounter < 2) {
       super.dismiss(animated: flag, completion: completion)
    }
}

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    dismissalCounter = 0
}

override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
    dismissalCounter = 0
    super.present(viewControllerToPresent, animated: flag, completion: completion)
}

var dismissalCounter : Int = 0

Внимание! Используйте эти функции внутри TabBarController или NavigationController, иначе это не сработает

UPD: В моем случае, к сожалению, он разбивает все NavigationControllers внутри TabBarController (заголовки не отображаются и внутри них нет кнопок), если я пойму действия по исправлению, я дам вам знать

UPD2: Довольно очевидным решением будет изменение initialViewController и просмотр дополнения от него, он не будет отклонен

UPD3: Я решил это очень и очень странно:

class ViewController : UIViewController {  
override func viewWillAppear(_ animated: Bool) {
        if GADRewardBasedVideoAd.sharedInstance().isReady == false {
             let request = GADRequest()
            rewardBasedVideo!.load(request, withAdUnitID: "ca-app-pub-3940256099942544/1712485313")
        }
    }

    var rewardBasedVideo: GADRewardBasedVideoAd?

    @IBAction func ad_button_click(_ sender: Any) {
        if rewardBasedVideo!.isReady == true     {
            let bl = blur()
            self.present(bl, animated: true, completion: {
                self.rewardBasedVideo?.present(fromRootViewController: bl)
            })

        }
    }

}

class blur : UIViewController {
    override func viewDidLoad() {
        checkForKeyWindow()
    }

    func checkForKeyWindow() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
            if (UIApplication.topViewController() == self) {
                print("dismissed and forgotten")
                self.dismiss(animated: true, completion: nil)
            } else {
                print("not keywindow")
                self.checkForKeyWindow()
            }
        })
    }

    @objc func close() {
       self.dismiss(animated: true, completion: nil)
    }
}

extension UIApplication {
    class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }

        if let tab = base as? UITabBarController {
            let moreNavigationController = tab.moreNavigationController

            if let top = moreNavigationController.topViewController, top.view.window != nil {
                return topViewController(base: top)
            } else if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }

        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }

        return base
    }
}
0 голосов
/ 06 декабря 2018

@ миалкан,

ваше решение не работает. Я не знаю, почему никто не говорит об этой проблеме. Я тоже сталкиваюсь с такой проблемой.

0 голосов
/ 06 декабря 2018

import GoogleMobileAds import sdk в вашем классе или контроллере представления

GADRewardBasedVideoAdDelegate Добавьте это в свой класс или контроллер представления

var RewardBasedVideo: GADRewardBasedVideoAd? ** инициализировать объект AdController **

override func viewDidLoad()
{
    super.viewDidLoad()
    RewardBasedVideo=GADRewardBasedVideoAd.sharedInstance()
    RewardBasedVideo?.delegate = self
}

// MARK: - СМОТРЕТЬ КНОПКУ ОБЪЯВЛЕНИЯ

 @IBAction func WatchAdBtn_Click(_ sender: UIButton)
 {
    if RewardBasedVideo?.isReady == true
     {
        RewardBasedVideo?.present(fromRootViewController: self)
    } else
     {
     //Show alert here "Ads is not ready to load"
    }
}

func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) 
{
    print("Reward based video ad is closed.")
}
0 голосов
/ 29 ноября 2018

У меня была такая же проблема.Я решил эту проблему, переопределив метод func dismiss(animated flag: Bool, completion: (() -> Void)? = nil.

Вот что я сделал.

var didOpenRewardedVideo:Int = 0 
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    if didOpenRewardedVideo == 1 {
        didOpenRewardedVideo = 2
        super.dismiss(animated: flag, completion: completion)
    }
    else if didOpenRewardedVideo == 2{
        didOpenRewardedVideo = 0
    }
    else{
        super.dismiss(animated: flag, completion: completion)
    }
}
func showRewardedVideo()
{
    didOpenRewardedVideo = 1
    GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self)
}

Прежде чем показывать rewardedAd, не забудьте проверить, готов он или нет.

GADRewardBasedVideoAd.sharedInstance().isReady == true

При представлении rewardedAd didOpenRewardedVideo устанавливается на 1. Когда пользователь отклоняет rewardedAd, didOpenRewardedVideo равен 1 и вызывает super.dismiss(animated: flag, completion: completion).Тогда didOpenRewardedVideo устанавливается на 2. Теперь я знаю, что dismiss(animated flag: Bool, completion: (() -> Void)? = nil) будет вызван еще раз.На этот раз я не вызываю метод super и устанавливаю didOpenRewardedVideo в 0. Я знаю, если я уволю, мой UIViewController будет отклонен.

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