Search code examples
iosswiftadmobrewardedvideoadappodeal

How to create a function which will add reward on watching an ad video


I have a counter in my game that adds a score by 1, and I want a rewarded video on my game over screen that can boost the player score by 100 but I'm not sure how to execute the function when the ad ends. Here is my code:

//  FirstViewController.swift
import UIKit
import Firebase
import AVFoundation
import StoreKit
import GameKit
import Appodeal


class Page1: UIViewController, AVAudioPlayerDelegate, GADInterstitialDelegate, UIAlertViewDelegate, GKGameCenterControllerDelegate, AppodealInterstitialDelegate {


    let ncObserver = NotificationCenter.default
    let PlayAgainObserver = NotificationCenter.default
    let AddScoreObserver = NotificationCenter.default


    var player = AVAudioPlayer()


    /* Variables */
    var gcEnabled = Bool() // Check if the user has Game Center enabled
    var gcDefaultLeaderBoard = String() // Check the default leaderboardID

    var score = 0


    let LEADERBOARD_ID = "ScoreID"


    var interstitial: GADInterstitial!

    var counter: Int = 0
    var counter2: Int = 0


    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var pageControl: UIPageControl!
    @IBOutlet weak var placementField: UITextField!


   // @IBOutlet weak var testpulse: UIButton!

    let notification = NotificationCenter.default
    let notification2 = NotificationCenter.default


    override func viewDidLoad() {
        super.viewDidLoad()
      authenticateLocalPlayer()
        Appodeal.setInterstitialDelegate(self)


        ncObserver.addObserver(self, selector: #selector(self.StopSoundsfunc), name: Notification.Name("StopSounds"), object:nil)

        PlayAgainObserver.addObserver(self, selector: #selector(self.PlayAgainfunc), name: Notification.Name("PlayAgain"), object:nil)

        AddScoreObserver.addObserver(self, selector: #selector(self.AddScorefunc), name: Notification.Name("AddScore"), object:nil)


        interstitial = GADInterstitial(adUnitID: "ca-app-pub-6626761084276338/5899386416")

        let request = GADRequest()
        interstitial.load(request)


    }


    @IBAction func playAgain(_ sender: Any) {
        if counter % 15 == 0 {
            if interstitial.isReady {
                interstitial.present(fromRootViewController: self)
                interstitial = CreateAd()
            } else {
                print("Ad wasn't ready")
            }
        }
        counter += 1


}


    @objc func PlayAgainfunc(_ sender: Any) {
        if counter % 15 == 0 {
            if interstitial.isReady {
                interstitial.present(fromRootViewController: self)
                interstitial = CreateAd()
            } else {
                print("Ad wasn't ready")
            }
        }
        counter += 1
    }


    @IBAction func ShowAds(_ sender: Any) {
       // notification.post(name: Notification.Name("PlayAgain"), object: nil)
        Appodeal.showAd(AppodealShowStyle.interstitial, rootViewController: self)

    }
    @IBAction func AddScore(_ sender: Any) {
          notification.post(name: Notification.Name("AddScore"), object: nil)
    }

    // MARK: - OPEN GAME CENTER LEADERBOARD
    @IBAction func checkGCLeaderboard(_ sender: AnyObject) {
        let gcVC = GKGameCenterViewController()
        gcVC.gameCenterDelegate = self
        gcVC.viewState = .leaderboards
        gcVC.leaderboardIdentifier = LEADERBOARD_ID
        present(gcVC, animated: true, completion: nil)
    }

    // MARK: - ADD 10 POINTS TO THE SCORE AND SUBMIT THE UPDATED SCORE TO GAME CENTER
    @objc func AddScorefunc(_ sender: AnyObject) {
        // Add 1 point to current score
        score += 1


        // Submit score to GC leaderboard
        let bestScoreInt = GKScore(leaderboardIdentifier: LEADERBOARD_ID)
        bestScoreInt.value = Int64(score)
        GKScore.report([bestScoreInt]) { (error) in
            if error != nil {
                print(error!.localizedDescription)
            } else {
                print("Best Score submitted to your Leaderboard!")
            }
        }
    }


    // MARK: - AUTHENTICATE LOCAL PLAYER
    func authenticateLocalPlayer() {
        let localPlayer: GKLocalPlayer = GKLocalPlayer.localPlayer()

        localPlayer.authenticateHandler = {(ViewController, error) -> Void in
            if((ViewController) != nil) {
                // 1. Show login if player is not logged in
                self.present(ViewController!, animated: true, completion: nil)
            } else if (localPlayer.isAuthenticated) {
                // 2. Player is already authenticated & logged in, load game center
                self.gcEnabled = true

                // Get the default leaderboard ID
                localPlayer.loadDefaultLeaderboardIdentifier(completionHandler: { (leaderboardIdentifer, error) in
                    if error != nil { print(error)
                    } else { self.gcDefaultLeaderBoard = leaderboardIdentifer! }
                })

            } else {
                // 3. Game center is not enabled on the users device
                self.gcEnabled = false
                print("Local player could not be authenticated!")
                print(error!)
            }
        }
    }


    func gameCenterViewControllerDidFinish(_ gameCenterViewController: GKGameCenterViewController) {
        gameCenterViewController.dismiss(animated: true, completion: nil)
    }

}

func CreateAd() -> GADInterstitial {
   let interstitial = GADInterstitial(adUnitID: "ca-app-pub-6626761084276338/5899386416")
   interstitial.load(GADRequest())
    return interstitial
}

func interstitialDidFailToLoadAd(){
    NSLog("Interstitial failed  to load")
}

func interstitialDidReceiveAd(_ interstitial: GADInterstitial) {
    print("Interstitial adapter class name: \(String(describing: interstitial.adNetworkClassName))")
}


    @IBAction func RewardedVideo(_ sender: Any) {
        Appodeal.showAd(AppodealShowStyle.rewardedVideo, rootViewController: self)

    }

In my "AddScorefunc" I have a counter that increases the score by 1. I want to create a similar function that increases the score by 100 but only if the rewarded video requirements are met.


Solution

  • If we look into the SDK integration guide of AppoDeal, they have provided delegates for all kind of ads you show through their sdk. For your case of showing a rewarded video, the delegate is AppodealRewardedVideoDelegate and here is how you can use it to get the callback and add score.

    extension Page1: AppodealRewardedVideoDelegate {
    
        func rewardedVideoDidLoadAd(){
             NSLog("video ad was loaded")
        }
        func rewardedVideoDidFailToLoadAd(){
             NSLog("video ad failed to load")
        }
        func rewardedVideoDidPresent(){
              NSLog("video ad was presented");
        }
        func rewardedVideoWillDismiss(){
              NSLog("video ad was closed");
        }
        func rewardedVideoDidFinish(_ rewardAmount: UInt, name rewardName: String!){
              NSLog("video ad was fully watched");
              // Add score here i.e, score += 100
        }
    }
    

    In viewDidLoad of Page1, set the delegate method like this,

    override func viewDidLoad() {
        super.viewDidLoad()
        // set delegate
        Appodeal.setRewardedVideoDelegate(self)
      }