iOS DoubleClick for Publishers (DFP) .. Error : No ad to show - ios

I am using DoubleClick for Publishers (DFP) in my App. I have integrated it as per DOCs as follows.
dfpBannerView_ = [[DFPBannerView alloc] initWithAdSize:kGADAdSizeBanner];
dfpBannerView_.adUnitID = kSampleAdUnitID;
// Set the delegate to listen for GADBannerViewDelegate events.
dfpBannerView_.delegate = self;
// Let the runtime know which UIViewController to restore after taking
// the user wherever the ad goes and add it to the view hierarchy.
dfpBannerView_.rootViewController = self;
[self.view addSubview:dfpBannerView_];
// Initiate a generic request to load it with an ad.
[dfpBannerView_ loadRequest:[GADRequest request]];
where kSampleAdUnitID is the App Unit Id I have created.
following Delegate Method is getcalled
- (void)adView:(DFPBannerView *)view
didFailToReceiveAdWithError:(GADRequestError *)error {
NSLog(#"Failed to receive ad with error: %#", [error localizedFailureReason]);
NSLog(#"%d",error.code);
}
But still I gets error as follows,
Failed to receive ad with error: Request Error: No ad to show.
2014-04-11 17:40:55.836 DFPBannerExample[6319:70b] 1
Where error Code 1 stands for /// The ad request was successful, but no ad was returned.
kGADErrorNoFill,
I am not getting where is the problem. Why I am not getting Ads ,while I am getting Ads for Sample App Unit Id .

if you want your banner to display something, you need to specify the banner size, and then tag the banner with the adunit id: check this code:
bannerView_ = [[DFPBannerView alloc] initWithFrame:CGRectMake(111, 483, 537, 120)];
bannerView_.adUnitID = #"/5900406/UserAppWaitingView";
// the user wherever the ad goes and add it to the view hierarchy.
bannerView_.rootViewController = self;
[self.view addSubview:bannerView_];
// Initiate a generic request to load it with an ad.
[bannerView_ loadRequest:[GADRequest request]];

Related

AdMob interstitial not showing What is wrong?

I am trying to add admob interstitial ads to my app but when I run my app no ad shows up. I just get a message in the logs saying :
<Google> To get test ads on this device, call: request.testDevices = #[ #« deviceID » ];
I'm pretty sure it knows im trying to show an add because of a previous error but it just won't appear.
here is my code( I added a print statement to the first part but it doesn't seem to take it into considiration ):
if interstitialad != nil {
if interstitialad!.isReady {
interstitialad?.present(fromRootViewController: self)
}
}
here is the second part of the code ( note both are in ViewDidLoad )
if interstitialad != nil {
if interstitialad!.isReady {
interstitialad?.present(fromRootViewController: self)
}
}
func createAndLoadInterstitial() -> GADInterstitial {
let request = GADRequest()
let interstitial = GADInterstitial(adUnitID: "unit id")
//request.testDevices = ["iPhone test device ID"]
//request.testDevices = ["simulator ID"]
interstitial.delegate = self
interstitial.load(request)
return interstitial
}
interstitialad = createAndLoadInterstitial()
What is wrong with this?
Thanks !
Google Ad Interstitial Objective C Working code:
- (void)startAdInterstial
{
self.interstitial = [[GADInterstitial alloc] initWithAdUnitID:FIREBASE_ADMOBID];;
GADRequest *request = [GADRequest request];
request.testDevices = #[kGADSimulatorID,#"7b5e0f6aad46c15f1e9ef2e6d3d381b7"];
_interstitial.delegate = self;
[self.interstitial loadRequest:request];
}
#pragma mark - interstitial delegate
- (void)interstitialDidReceiveAd:(GADInterstitial *)ad
{
[_interstitial presentFromRootViewController:[APPDELEGATE window].rootViewController];
}
- (void)interstitial:(GADInterstitial *)ad didFailToReceiveAdWithError:(GADRequestError *)error
{
NSLog(#"error during full screen view %#",error);
}
- (void)interstitialDidDismissScreen:(GADInterstitial *)interstitial {
}
Hope this will help you out in some other way.
Here are some code which I used to initiate the AdMob in Objective-c:
AdMobHandler.m file:
//created 320x60 banner and displayed at the bottom of UIView.
//If your app in development stage then you need to add the device ID or simulator ID which will appear during AdMob Initiation.
To get test ads on this device, call: request.testDevices = #[ #"xxxxxxxxxxxxxxxxxxxxxxxxxx" ];
- (void)initiateAndLoadAdMob:(UIViewController *)sender
{
GADRequest *request = [GADRequest request];
GADBannerView *bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
request.testDevices = #[ #"xxxxxxxxxxxxxxxxxxxxxxxxxx <<Device ID>>",#"xxxxxxx<<Simulator ID>>" ];
bannerView.adUnitID = FIREBASE_ADMOBID;
bannerView.rootViewController = (id)self;
bannerView.delegate = (id<GADBannerViewDelegate>)self;
senderView = sender.view;
bannerView.frame = CGRectMake(0, senderView.frame.size.height - bannerHeight, senderView.frame.size.width, bannerHeight);
[senderView addSubview:bannerView];
}
If you able to understand and change code to Swift will gives you some idea and solve your above issue. Let me know if you have any queries for above code.
For more details check this below link:
https://firebase.google.com/docs/admob/ios/interstitial
You said you're trying to present your GADInterstitial in your viewDidLoad. This is not when you should be presenting your GADInterstitial. You need to give the GADInterstitial time to load the ad. Presenting an ad in your viewDidLoad is also against the AdMob TOS. You should be presenting the GADInterstitial during a transition/action in your application. You should also implement the GADInterstitial delegate methods so you know why the ad is failing to load, when it has actually loaded, and when the user has dismissed the ad so you can continue to transition them in your application.
Disallowed interstitial implementations
GADInterstitial Ad Events

GADBannerView delegate methods not called if the view is not in the view hierarchy

I'm working with the Google Mobile Ads SDK on iOS and trying to display some ads. My code:
GADBannerView* bannerView = [[GADBannerView alloc] initWithAdSize:GADAdSizeFromCGSize(CGSizeMake(300, 250))];
bannerView.adUnitID = #"hidden";
bannerView.rootViewController = self;
bannerView.delegate = self;
GADRequest* request = [GADRequest request];
request.testDevices = #[ kGADSimulatorID ];
[bannerView loadRequest:request];
This works fine if I add the bannerView to the view hierarchy right after the code you see above. However, I don't really want to add it until the ad is loaded, so I wanted to delay it. I noticed that if the bannerView is not in the view hierarchy, the delegate methods are not called at all. Furthermore, I have found this answer, which is in line with what I'm observing. On the other hand, this is a quote from the GADBannerViewDelegate header:
/// Tells the delegate that an ad request successfully received an ad. The delegate may want to add
/// the banner view to the view hierarchy if it hasn't been added yet.
- (void)adViewDidReceiveAd:(GADBannerView *)bannerView;
This suggests that it should be possible to receive those delegate callbacks even if the view is not in the hierarchy, which is exactly what I want. So, any ideas how could I achieve this?
Ok, so the problem here was that I didn't keep the reference to the bannerView. It was deallocated after the method returned, and this is why the delegate methods were not called.
I just had the same issue after upgrading from the Admob SDK 7.56 to 8.2:
They changed the method names of the GADBannerViewDelegate protocol.
E.g. instead of
-(void)adViewDidReceiveAd:(GADBannerView *)adView;
it is now
-(void)bannerViewDidReceiveAd:(GADBannerView *)bannerView;
see also the migration guide to Admob SDK version 8:
https://developers.google.com/admob/ios/migration#methods_removedreplaced
You should add the GADBannerView to your view and set its hidden property to YES initially. Also, I'd suggest using the AdSize Constant kGADAdSizeBanner that AdMob provides. Here's a list of additional AdSize Constants.
For example:
bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView.adUnitID = #"YourAdUnitID";
bannerView.rootViewController = self;
bannerView.delegate = self;
[bannerView loadRequest:[GADRequest request]];
bannerView.hidden = YES; // Hide banner initially
[self.view addSubview:bannerView];
// This will put the banner at the bottom of the screen and stretch to fit the screens width
[bannerView setFrame:CGRectMake(0, self.view.frame.size.height - bannerView.frame.size.height, self.view.frame.size.width, bannerView.frame.size.height)];
Then, when you receive an ad you unhide the banner. For example:
-(void)adViewDidReceiveAd:(GADBannerView *)adView {
// We've received an ad so lets show the banner
bannerView.hidden = NO;
NSLog(#"adViewDidReceiveAd");
}
-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error {
// Failed to receive an ad from AdMob so lets hide the banner
bannerView.hidden = YES;
NSLog(#"adView:didFailToReceiveAdWithError: %#", [error localizedDescription]);
}
You could also animate this, if you'd prefer, by setting the banner's alpha property to 0.0 initially instead of using it's hidden property. Then, animate the alpha when you receive an ad. For example:
-(void)adViewDidReceiveAd:(GADBannerView *)adView {
// We've received an ad so lets fade in the banner
[UIView animateWithDuration:0.2 animations:^{
bannerView.alpha = 1.0;
}];
NSLog(#"adViewDidReceiveAd");
}
-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error {
// Failed to receive an ad from AdMob so lets fade out the banner
[UIView animateWithDuration:0.2 animations:^{
bannerView.alpha = 0.0;
}];
NSLog(#"adView:didFailToReceiveAdWithError: %#", [error localizedDescription]);
}
Also, as a side note, the GADBannerView is transparent when there is no ad to display. So, adding it to your view and doing nothing else would work too.

Can't remove Admob Banner from the view (iOS)

I have implemented Admob into my app but i've noticed that if the Admob view doesn't receive an ad, I can't remove it from the superview. If it already has an ad loaded it just stays there with that ad loaded even if the device is not connected to the internet. This is my code:
self.admobBannerView = [[GADBannerView alloc] init];
self.admobBannerView.frame = CGRectMake(0.0,self.view.frame.size.height-50,
GAD_SIZE_320x50.width,
GAD_SIZE_320x50.height);
self.admobBannerView.adUnitID = #"...";
self.admobBannerView.rootViewController = self;
self.admobBannerView.delegate = self;
[self.view addSubview:self.admobBannerView];
[self.admobBannerView loadRequest:[GADRequest request]];
Then the Admob delegate
- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error {
[self.admobBannerView removeFromSuperview];
}
Despite calling [self.admobBannerView removeFromSuperview]; the banner remains where it is. I can't understand why this is happening. Any help is appreciated.
Thanks
I had the same problem and debugged the view hierarchy w/ Xcode only to find multiple GADBannerViews existed. Fixed the code to check if ad view already existed before adding one.
In your case you should wrap the ad view creation in:
if (self.admobBannerView != nil)
{
// create ad
}

iOS App does not resume after clicking AdMob ad

I use class to show AdMob ad and it has 320x50 size view, i call only this class's view where i want to display my ad in app but when i click ad and want to return back, it go back to AdMob's class and it resizes to cover all screen (Autoresize is closed) . Does anybody has solution about it?
I use this AdMob class with small view because of my other m files are mm. file and i could not make AdMob work in mm files and its also easy to call just this class's view when i need to display ad.
I use same codes as in AdMob example in official site.
-(void)setAdMob{
CGPoint origin = CGPointMake(0.0,
self.view.frame.size.height -
CGSizeFromGADAdSize(kGADAdSizeBanner).height);
// Use predefined GADAdSize constants to define the GADBannerView.
self.adBanner = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner
origin:origin];
// Note: Edit SampleConstants.h to provide a definition for kSampleAdUnitID
// before compiling.
self.adBanner.adUnitID = kSampleAdUnitID;
self.adBanner.delegate = self;
[self.adBanner setRootViewController:self];
[self.view addSubview:self.adBanner];
self.adBanner.center =
CGPointMake(self.view.center.x, self.adBanner.center.y);
self.adBanner.frame=CGRectMake(0, 0, self.adBanner.frame.size.width, self.adBanner.frame.size.height);
[self.adBanner loadRequest:[self createRequest]];
}
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
-(GADRequest *)createRequest {
GADRequest *request = [GADRequest request];
request.testDevices =
[NSArray arrayWithObjects:
GAD_SIMULATOR_ID,
// TODO: Add your device/simulator test identifiers here. They are
// printed to the console when the app is launched.
nil];
return request;
}
// We've received an ad successfully.
-(void)adViewDidReceiveAd:(GADBannerView *)adView {
NSLog(#"Received ad successfully");}
- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error {
NSLog(#"Failed to receive ad with error: %#", [error localizedFailureReason]);}

self.addSubView not working on iPad

I have an app that attempts to retrieve an iAd and if is unsuccessful loads an AdMob ad. It works perfectly on iPhone but when run on iPad I get a continuous loop that prevents the app from loading. Here's some code:
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
#try {
NSLog(#"Ad Error, looking for AdMob Ad...");
// Create a view of the standard size at the bottom of the screen.
bannerView_ = [[GADBannerView alloc]
initWithFrame:CGRectMake(0.0,
self.view.frame.size.height -
GAD_SIZE_320x50.height,
GAD_SIZE_320x50.width,
GAD_SIZE_320x50.height)];
// I know the banner size is incorret for iPad but it's only supposed to run
// on iPad in compatibility mode and changing doesn't help
// Specify the ad's "unit identifier." This is your AdMob Publisher ID.
bannerView_.adUnitID = #"XXXXXXX";
// Let the runtime know which UIViewController to restore after taking
// the user wherever the ad goes and add it to the view hierarchy.
bannerView_.rootViewController = self;
[self.view addSubview:bannerView_];
GADRequest *admobRequest = [GADRequest request];
admobRequest.testDevices = [NSArray arrayWithObjects:
GAD_SIMULATOR_ID,
nil];
// Initiate a generic request to load it with an ad.
[bannerView_ loadRequest: admobRequest];
[iAdBanner setHidden: YES];
[bannerView_ setHidden: NO];
}
#catch (NSException *e) {
NSLog(#"Exception: %#", e);
}
#finally {
}
}
The NSLog prints out continuously and the app doesn't load.
012-02-24 21:58:38.991 TrophyConverter Free[2948:15e03] Ad Error, looking for AdMob Ad...
2012-02-24 21:58:38.992 TrophyConverter Free[2948:15e03] Ad Error, looking for AdMob Ad...
2012-02-24 21:58:38.994 TrophyConverter Free[2948:15e03] Ad Error, looking for AdMob Ad...
Has anyone else experienced this? How do I over come it? I've managed to use a bool to stop the continuous log printing and load the app but no Ad is shown.
EDIT:
The issue completely disappears when I remove this line
[self.view addSubview:bannerView_];
which isn't helpful since this is the part that adds the AdMob view.
I've also tried changing the build target to be a universal app rather than a iPhone app. This fixes the problem but I don't want it to be a universal app and I have no layouts created for it.
I couldn't find a fix for this in the end so I basically added a bool that was switched once one fail had been made. Then no ad would be added if the check had been done and not already worked.

Resources