Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AdReward from AdColony not working on Swift 2.0 for some reason

I would like to implement a reward interstitial in my game, but i'm getting a lot of AdColony errors such as: "No fill for ad request" or that my Zone ID is invalid.

To start of, this would be how I configured my AdColony Zone:

Zone is active? Yes

Zone Type: Preroll/Interstitial (Gives me "No fill for ad request error")
           Value Exchange/V4VC (Gives me "Zone ID invalid, please check config error")

House Ads: Back Fill

Options: 0 0 1

Development: Show Test Ads Only (Although my app is currently Live)

The example they give you with the SDK download, is for Apps not for Games so I tried to kinda translate it for Games, although it wasn't that different, but there might be a problem with my current code. So this is how I have it in my GameViewController.swift.

// Outside I declare a struct
struct Constants
{
    static let adColonyAppID = "app5aab6bb6aaf3xxxxxx"
    static let adColonyZoneID = "vz19959f95bd62xxxxxx"
    static let currencyBalance = "coinAmount"
}

// Inside GameViewController
var ad: AdColonyInterstitial?!
var spinner: UIActivityIndicatorView!


override func viewDidLoad() {
        super.viewDidLoad()

        self.setupAdRewardBanner()
    }

func setupAdRewardBanner() {

        AdColony.configureWithAppID(Constants.adColonyAppID, zoneIDs: [Constants.adColonyZoneID], options: nil,
            completion: {(zones) in

            let zone = zones.first
                zone?.setReward({ (success, name, amount) in
                if (success) {
                    let storage = NSUserDefaults.standardUserDefaults()
                    let wrappedBalance = storage.objectForKey(Constants.currencyBalance)
                    var balance = 0
                    if let nonNilNumWrappedBalance = wrappedBalance as? NSNumber {
                        balance = Int(nonNilNumWrappedBalance.integerValue)
                    }
                    balance = balance + Int(amount)

                    let newBalance: NSNumber = NSNumber(integerLiteral: balance)
                    storage.setValue(newBalance, forKey: Constants.currencyBalance)
                    storage.synchronize()

                    self.updateCurrencyBalance()
                }


            })


           //If the application has been inactive for a while, our ad might have expired so let's add a check for a nil ad object
                NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.onBecameActive), name: "onBecameActive", object: nil)

                //AdColony has finished configuring, so let's request an interstitial ad
                self.requestInterstitial()

        })

        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.triggerAdReward), name: "triggerAdReward", object: nil)

        self.updateCurrencyBalance()
    }


    func requestInterstitial()
    {
        //Request an interstitial ad from AdColony
        AdColony.requestInterstitialInZone(Constants.adColonyZoneID, options:nil,

                                     //Handler for successful ad requests
            success:{(newAd) in

                //Once the ad has finished, set the loading state and request a new interstitial
                newAd.setClose({

                    self.requestInterstitial()
                })

                //Interstitials can expire, so we need to handle that event also
                newAd.setExpire( {
                    self.ad = nil


                    self.requestInterstitial()
                })

                //Store a reference to the returned interstitial object
                self.ad = newAd


            },

            //Handler for failed ad requests
            failure:{(error) in
                NSLog("SAMPLE_APP: Request failed with error: " + error.localizedDescription + " and suggestion: " + error.localizedRecoverySuggestion!)
            }
        )
    }

    func triggerAdReward(sender: AnyObject)
    {
        if let ad = self.ad {
            if (!ad!.expired) {
                ad?.showWithPresentingViewController(self)
            }
        }
    }


    func updateCurrencyBalance()
    {
        //Get currency balance from persistent storage and display it
        let storage = NSUserDefaults.standardUserDefaults()
        let wrappedBalance = storage.objectForKey(Constants.currencyBalance)
        var balance: Int = 0
        if let nonNilNumWrappedBalance = wrappedBalance as? NSNumber {
            balance = Int(nonNilNumWrappedBalance.integerValue)
        }

        print("current balance ", balance)
        //XXX Run animation of giving user coins and update view
    }

    func onBecameActive()
    {
        //If our ad has expired, request a new interstitial
        if (self.ad == nil) {
            self.requestInterstitial()
        }
    }

And then after all that, I call this notification to request the ad interstitial when pressing a button after the user loses in GameScene.

NSNotificationCenter.defaultCenter().postNotificationName("triggerAdReward", object: nil)

I tried debugging, I can't seem to see the code getting inside the if (success) block. So there might be an issue there.

Does anyone know what I'm doing wrong?

After debugging more, i noticed that it's not advancing with this method

self.requestInterstitial()

So there might be an issue with my account maybe? Why is not passing through the success and goes through the error block?

The error in the console is :

SAMPLE_APP: Request failed with error: No fill for ad request and suggestion: Make sure you have configured your zone properly in the control panel: http://clients.adcolony.com.

Thanks in advance.

like image 801
msqar Avatar asked Nov 08 '22 06:11

msqar


1 Answers

  • It seems your code should be working.
  • Since you want to implement a reward interstitial, you should set the zone type to V4VC.

  • In case it said "Zone ID invalid, please check config error", you should check twice the App id and zone id in the source code and the Adcolony client panel page.

  • After you changed the zone type, wait for some time(10 min?) to test, the server should need time to sync the status.

  • Test on device instead of simulator if possible.

Here is the document for v4vc: https://github.com/AdColony/AdColony-iOS-SDK-3/wiki/Rewarded-Interstitial-Ads-Quick-Start-Guide

like image 76
xfdai Avatar answered Nov 14 '22 21:11

xfdai