AdReward from AdColony not working on Swift 2.0 for some reason

穿精又带淫゛_ 提交于 2019-12-10 16:34:51

问题


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.


回答1:


  • 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



来源:https://stackoverflow.com/questions/40362875/adreward-from-adcolony-not-working-on-swift-2-0-for-some-reason

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!