Stuck with google admob sdk 7 - ios

I have implemented google admob sdk 6.12, ads were appearing , everything was working perfectly, after few days google updated sdk 7, again i imported new sdk but this time i am unable to use #import "GADInterstitial.h" each time i get error #import "GADInterstitial.h" not found, imported all frameworks but no success and no ads are appearing if i use #class GADInterstitial.h; and use this code
- (void)viewDidLoad {
[super viewDidLoad];
self.interstitial = [[GADInterstitial alloc] init];
self.interstitial.adUnitID = Interstical_Unit_id;
GADRequest *request = [GADRequest request];
// Requests test ads on simulators.
request.testDevices = #[ GAD_SIMULATOR_ID ];
[self.interstitial loadRequest:request];
}
- (void)gameOver {
if ([self.interstitial isReady]) {
[self.interstitial presentFromRootViewController:self];
}
// Rest of game over logic goes here.
}

You don't need to import headers anymore, just use this and go
#import GoogleMobileAds
Also you don't need to link other frameworks or add the -ObjC to your linker flags.

I was having this issue myself after upgrading. Use this instead:
#import <GoogleMobileAds/GADInterstitial.h>

If you add GoogleMobileAdsSdkiOS-7.0.0 folder in your app, you have to replace your #import row with the following:
#import <GoogleMobileAds/GADBannerView.h>
I had the same issue.

Related

Admob bannerView Request Error: No ad to show

I'm having this issue on one of my ads for an ios game
Here is my code, the odd thing is that if I add the device on the request.testDevices list it displays the demo banner, if I remove from testDevices, it does not show a real banner, but if I change my bundleIdentifier on XCODE, it shows a real banner,so I believe its something with my admob account, does anyone ever got something like it?
Its always failing with this error:
AdView didFailToReceiveAdWithError --------------------------- : Error Domain=com.google.ads Code=1 "Request Error: No ad to show." UserInfo={NSLocalizedDescription=Request Error: No ad to show., NSLocalizedFailureReason=Request Error: No ad to show.}
On my AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Use Firebase library to configure APIs
[FIRApp configure];
[[FIRAnalyticsConfiguration sharedInstance] setAnalyticsCollectionEnabled:YES];
// Initialize Google Mobile Ads SDK
[GADMobileAds configureWithApplicationID:#"ca-app-pub-xx~xx"];
/* other stuff here... */
}
on my rootViewController.m
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
bannerViewAdded = NO;
interstitialViewAdded = NO;
[self addBanner];
// ..... more stuff here;
}
- (void)addBanner{
NSLog(#"CALL ADD BANNER ROOTVIEWCONTROLLER");
if(!bannerViewAdded && ![MKStoreManager isFeaturePurchased:kFeatureAId]){
NSLog(#"ADD BANNER ROOTVIEWCONTROLLER");
CGSize size = [[CCDirector sharedDirector] winSize];
// Create adMob ad View (note the use of various macros to detect device)
if (IS_IPAD || IS_IPADHD) {
bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeLeaderboard];
bannerView.center = CGPointMake(size.width/2, (size.height-CGRectGetHeight(bannerView.frame)/2)-2);
}
else if (IS_IPHONE6) {
bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView.center = CGPointMake(size.width/2, (size.height-CGRectGetHeight(bannerView.frame)/2)-2);
}
else if (IS_IPHONE6P) {
bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView.center = CGPointMake(size.width/2, (size.height-CGRectGetHeight(bannerView.frame)/2)-2);
}
else {
// boring old iPhones and iPod touches
bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView.center = CGPointMake(size.width/2, (size.height-CGRectGetHeight(bannerView.frame)/2)-2);
}
//[bannerView setBackgroundColor:[UIColor blueColor]];
// Need to set this to no since we're creating this custom view.
//bannerView.translatesAutoresizingMaskIntoConstraints = NO;
// Note: Edit SampleConstants.h to provide a definition for kSampleAdUnitID
// before compiling.
// Replace this ad unit ID with your own ad unit ID.
bannerView.adUnitID = #"ca-app-pub-xx/xx";
bannerView.rootViewController = self;
bannerView.delegate = self;
[self.view addSubview:bannerView];
GADRequest *request = [GADRequest request];
//request.testDevices = #[ kGADSimulatorID ];
//request.testDevices = #[ #"xx", #"xx" , kGADSimulatorID ];
[bannerView loadRequest:request];
bannerViewAdded = YES;
}
}
- (void)removeBanner {
//admob
if(bannerViewAdded){
bannerViewAdded = NO;
[bannerView removeFromSuperview];
[bannerView release];
bannerView = nil;
}
//No AdMOB
if(localBannerAdded){
localBannerAdded = NO;
[localBannerButton removeFromSuperview];
[localBannerButton release];
localBannerButton = nil;
}
}
- (void)addInterstitial{
if(!interstitialViewAdded && ![MKStoreManager isFeaturePurchased:kFeatureAId]){
NSLog(#"INIT INTERSTITIAL ROOTVIEWCONTROLLER");
interstitialView = [[GADInterstitial alloc] initWithAdUnitID:#"ca-app-pub-xx/xx"];
GADRequest *request = [GADRequest request];
// Requests test ads on devices you specify. Your test device ID is printed to the console when
// an ad request is made. GADBannerView automatically returns test ads when running on a
// simulator.
//request.testDevices = #[ kGADSimulatorID, #"xxx", #"xxx" ];
[interstitialView loadRequest:request];
[interstitialView setDelegate:self];
}
}
- (void)adView:(GADBannerView *)gadBannerView didFailToReceiveAdWithError:(GADRequestError *)error{
NSLog(#"AdView didFailToReceiveAdWithError --------------------------- : %#", error);
[self removeBanner];
if(!localBannerAdded){
CGSize size = [[CCDirector sharedDirector] winSize];
localBannerButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
localBannerButton.frame = CGRectMake(0.0, 0.0, 320.0, 50.0);
[localBannerButton setTitle:#"DOWNLOAD MORE FREE GAMES" forState:UIControlStateNormal];
localBannerButton.backgroundColor = [UIColor whiteColor];//[UIColor clearColor];
[localBannerButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal ];
[self.view addSubview:localBannerButton];
[localBannerButton setCenter:CGPointMake(self.view.center.x,(size.height-CGRectGetHeight(localBannerButton.frame)/2)-2)];
// Add Target-Action Pair
[localBannerButton addTarget:self action:#selector(openAppStore:) forControlEvents:UIControlEventTouchUpInside];
localBannerAdded = YES;
}
}
I just had this error today, the problem for me was simple, it was because the adUnitID is basically still new. I had to wait more than 2 hours after creating the adUnitID in order for the ads to be served.
If you have this error, and some of your adUnitIDs serve ads and some don't. You're highly likely having the same issue, and the only way to fix it is to wait.
The ad server will return this message mainly because of the following:
There are no ads for your ad unit id.
Check whether your ad unit id is proper or not.
You will get the same error if either your banner width/height is 0.
Make sure that your adUnitID is perfect.
or
check following links its may help you
https://groups.google.com/forum/#!topic/google-admob-ads-sdk/ioXU2nX9W28
AdMob Legacy Publisher ID not showing ads
I had just created a new account and seen that problem. When checking my account there was a message shown on the top of admob page: "Your ad units are not displaying ads because you haven't provided your account payments information yet.". Click on the button Fix it, fill the form and the ads will be shown within few hours
I met this error too. Both my banner and interstitial ads failed with this error. I found that it is my mistake to change UserAgent globally, after I change UserAgent to default it works well.
Make sure you are using the test ad IDs when in a debug session.
https://developers.google.com/admob/ios/banner?hl=en-US
The easiest way to load test ads is to use our dedicated test ad unit ID for iOS banners: ca-app-pub-3940256099942544/2934735716
This error could happen if you have not setup your payment and billing information in your AdMob account.
As per Admob after you setup the payment details, it can take up to 2 hours before it would be completely functional
Billing and Payments
This solved my problem
changing banner id to example id.
run the app then .
changing id back to production id.
For me, the reason why it started showing this is that I didn't have any payment methods set up on my AdMob account.
Once I have set this up, the error has disappeared and ads started showing instantly.
Hope this helps someone!
One possible reason is a Constraint bug.
you should guarantee your bannerView's constraint to other views is
right
I had the same issue when testing the sample application on my phone. I fixed with the following steps:
Reset Advertising identifier on iPhone 6, Go to:
Settings -> Privacy -> Advertising -> Reset Ad identifier
After create adUnitID, Wait for 1-2 hours and then try it out.
Because I had the same issue and it gets solved just after 1-2 hours.
Enjoy coding :)
If you are using your app in debug or testing mode make sure you are using test AppID and BannerID provided by google admob which would be as:-
Google Test AdMobID:
ca-app-pub-3940256099942544~1458002511
Google Test BannerID
ca-app-pub-3940256099942544/2934735716
In my case, ads are working fine but suddenly it stop showing ad with error: No ad to show.
I noticed console is throwing error about test device identifier. Somehow the test device identifier get changed. I don't know how it happen, may be due to Xcode upgrade. I am not sure. But once I changed the test device identifier, it start working again.
Do not make any modifications in code if this error pops, just wait about 3-4 days. Google takes time to send adds for new accounts
Make sure not to make an other variable of GADBannerView. Use one variable in every controller by making it global and just change unit id.
e.g this line should be out of any controller (global)
var bannerView: GADBannerView!
then use it wherever you want and just change id accordingly
bannerView.adUnitID = "ca-app-exampleid-abcabc938-4e8"
I was used to init the banner like this:
adBannerView = GADBannerView()
and it was working.
I can't say precisely from which AdMob library version, but suddently the banner wasn't show anymore.
Init the banner with the size as parameter, fixed the problem:
adBannerView = GADBannerView(adSize: kGADAdSizeBanner)
I solve this by adding request.testDevice = #[#"xxxxxxxxxxxx"] before load request.(I get this tip and test device number from console)
The best way I think should be used the test ad Ids from the integration guide from Google, after that change to your Ad Ids when it goes live.
I faced with this issue even with google test ad units.
In my scenario, problem was, I modified the WkWebView UserAgent directly without concatenating with the real one.
I had to change from;
static func arrangeUserAgent() {
let webView = WKWebView()
webView.evaluateJavaScript("navigator.userAgent") { (result, error) in
webView.customUserAgent = "Some Awesome User Agent"
let dictionary = Dictionary(dictionaryLiteral: ("UserAgent", webView.customUserAgent!))
UserDefaults.standard.register(defaults: dictionary)
}
}
to;
static func arrangeUserAgent() {
let webView = WKWebView()
webView.evaluateJavaScript("navigator.userAgent") { (result, error) in
let mergedUserAgent = "\(result ?? "") Some Awesome UserAgent"
webView.customUserAgent = mergedUserAgent
let dictionary = Dictionary(dictionaryLiteral: ("UserAgent", mergedUserAgent))
UserDefaults.standard.register(defaults: dictionary)
}
}
Had rough times to find the problem.
Be careful with the UserAgent you change.
Happy coding.
In the Settings of your iOS device: Settings > Privacy > Advertising: Turn on and then turn off "Limit Ad Tracking" ("Reset of Ad Identifier" doesn't always help. Try "Reset of Ad Identifier" first and comment if this action doesn't help you).
But! It will help only get ads on your own device and will not solve the problem that matching rate of your ad is low.

pebbleCentral:watchDidConnect never gets called on iOS

I have an old Pebble Classic watch, upgraded to latest firmware (3.8.2) and using latest Pebble-SDK.
I have followed the few simple steps to install SDK, setup an Xcode project and adding the code to initialise and connect:
https://developer.getpebble.com/guides/mobile-apps/ios/
My problem is, that the delegate method pebbleCentral:watchDidConnect never gets called!
I am using the Pebble Time app on the iPad to install the watchApp in the watch, so I know the iPad is connected to the watch. The same iPad runs the iOS app, which apparently does not discover the watch.
I have tried to import an old test project from a colleague, who had it running a year or two ago. Same watch, same watchApp, but of course older firmware and SDK versions. Same result...
I think the documentation on the pebble site is quite simple and easy to follow. However, I feel I am missing some explanations of how and when this watchDidConnect is supposed to be triggered.
I am most likely missing some simple step somewhere, but I am quite lost in where to look!
Any ideas are welcome!
EDIT: My code looks like this:
ViewController.h:
#import <UIKit/UIKit.h>
#import PebbleKit;
#interface ViewController : UIViewController<PBPebbleCentralDelegate>
#end
ViewController.m:
#import "ViewController.h"
#interface ViewController ()
#property (weak, nonatomic) PBWatch* connectedWatch;
#end
#implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[PBPebbleCentral defaultCentral].delegate = self;
[[PBPebbleCentral defaultCentral] run];
NSLog(#"Pebble initialised");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect (PBWatch*)watch isNew:(BOOL)isNew {
NSLog(#"Pebble connected: %#", [watch name]);
self.connectedWatch = watch;
}
- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch {
NSLog(#"Pebble disconnected: %#", [watch name]);
if ([watch isEqual:self.connectedWatch]) {
self.connectedWatch = nil;
}
}
#end
Are you calling the -run method, after setting up your Pebble central? I noticed that the code snippet in the link you posted does not show the central's delegate being set.
[PBPebbleCentral defaultCentral].delegate = self; // Set your delegate
[PBPebbleCentral defaultCentral].appUUID = [[NSUUID alloc] initWithUUIDString:#"Your Pebble App UUID"]; // Set the app UUID
[[PBPebbleCentral defaultCentral] run]; // Call -run on the central

Displaying admob interstitals multiple times how?

I have small gaming app which has one storyboard and inside it creates scenes like start menu-gamin area-scores I have added admob banner view and interstitals into it.My banner view is working fine and but my interstitial only works for one time.
I load my interstitial on my viewdidload and fire it in the function which calls the gaming sessions end and as I say it works but only for one time when user starts another game and fails this time there is no interstital(error below).So what should I do to fix it I want my game to show interstitials multiple times whenever I want.
Error :
Request Error: Will not send request because interstitial object has been used.
Header:
#import "GADBannerView.h"
#import "GADInterstitial.h"
#class GADInterstitial;
#class GADRequest;
////////////code UIviewcontroller//////////
GADBannerView *bannerView_;
GADInterstitial *interstitial_;
Implementation
-(void)viewdidload
{
//////////////////gaming code///////////
interstitial_ = [[GADInterstitial alloc] init];
interstitial_.delegate = self;
interstitial_.adUnitID = #"ca-app-pub-6280395701552972/5217388242";
GADRequest *request = [GADRequest request];
[interstitial_ loadRequest:request];
}
Implementaion
-(void)failgame
{
//////////////////gaming code///////////
[interstitial_ presentFromRootViewController:self];
}
On googleadmob SDK page it says that interstials are one time use objects so I am %100 sure that is the problem but there is nothing there to explain how to call them multiple time's so as long as you point the answer please don't tell go read it I have read it 5 times.
Well no one gave an answer but I am sure that there are some others out there who had the same problem so for those who want to call interstitals multiple times here is the trick.
Put it into its own method and call method from your main method (which replies many times)
Keep the interstitals on your viewdidload (or where you want fire first) because if you don't then you miss the first fire the others will work.
The full code for that.
- (void) callint
{
int rNumber1 = arc4random() % 45 + 1;
int rNumber2 = arc4random() % 45 + 1;
if((rNumber1%2==1) && (rNumber1%1==0))
{
[interstitial_ presentFromRootViewController:self];
interstitial_ = [[GADInterstitial alloc] init];
interstitial_.delegate = self;
interstitial_.adUnitID = #"ca-app-pub-6280395701552972/5217388242";
GADRequest *request = [GADRequest request];
[interstitial_ loadRequest:request];
}
}
I put random number creation and if there because I don't want users to see those intersitials every time even call int is fired every time there is 4/1 chance for it to fire so it shows 1 interstitial for 4-5 fire.
- (void)viewDidLoad {
[super viewDidLoad];
self.interstitial = [self createAndLoadInterstitial];
}
- (GADInterstitial *)createAndLoadInterstitial {
GADInterstitial *interstitial = [[GADInterstitial alloc] initWithAdUnitID:#"ca-app-pub-3940256099942544/4411468910"];
interstitial.delegate = self;
[interstitial loadRequest:[GADRequest request]];
return interstitial;
}
- (void)interstitialDidDismissScreen:(GADInterstitial *)interstitial {
self.interstitial = [self createAndLoadInterstitial];
}
GADInterstitial is a one time use object. To request another interstitial, you'll need to allocate a new GADInterstitial object.
The best place to allocate another interstitial is in the interstitialDidDismissScreen: method on GADInterstitialDelegate, so that the next interstitial starts loading as soon as the previous one is dismissed. reference: admob site link
If you follow the Admob recommended code, as Sonu VR showed, you will have no issue. Just note that whilst there will be a logging error despite of using the best practice Admob code, that is a red herring. That's probably a bug in the Admob logging, but not a bug in the Admob code to display an Ad. You can test for this by using a non-test phone and a different ad will be served at different times.

Twitter Framework for iOS - Why does TWrequest.h import <Social/SLRequest.h>?

Inside of TWRequest.h that's inside of the Twitter Framework, there it imports this
#import <Social/SLRequest.h>
But TWRequest was built for iOS 5, so why would it import the Social Framework's file since those are for iOS 6?
I'm getting this error..
'Social/SLRequest.h' file not found
Of course it's not found because I didn't add in the Social Framework because I want to use the Twitter Framework. I can't simply remove it because that file is referencing from the Social framework, how can I fix this? Thanks
In iOS 6 the Twitter framework methods are deprecated. Instead you should use the Social.framework. Which includes sharing both Twitter and Facebook.
The sample code checks what the OS version is running and what framework classes are available whether it iOS 5 - Twitter.framework or 6 - Social.framework
#import <Twitter/Twitter.h>
#import <Social/Social.h>
- (void) postTweet {
NSString *someTweet = #"someTweet";
// running on iOS5
if (NSClassFromString(#"TWTweetComposeViewController") && [TWTweetComposeViewController canSendTweet]) {
TWTweetComposeViewController *tweetSheet = [[TWTweetComposeViewController alloc] init];
[tweetSheet setInitialText:someTweet];
[self presentModalViewController:tweetSheet animated:YES];
// running on iOS6
} else if ( NSClassFromString(#"SLComposeViewController") && [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] ) {
SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:someTweet];
[self presentViewController:tweetSheet animated:YES completion:NULL];
}
}
This seemed more of an xcode problem. Sometimes it worked and sometimes it threw the error. I had to exit xcode and restart for it to work again. It eventually fixed itself.

Supporting both iOS 5 and iOS 6 with the Facebook SDK 3.1

I have an app that currently supports posting to Facebook through the feed dialog using the old Facebook SDK for iOS.
After updating to the Facebook SDK 3.1 for iOS, it seems that I can either:
use the old style API (Facebook.h, instantiate a Facebook, call dialog:...)
or use the new style API (FacebookSDK.h, use shared FBSession, native dialogs)
The different header files collide and seem completely incompatible.
Can I do both? If so, then how?
Just include Facebook.h instead. To do this first, Copy the DeprecatedHeaders folder into your Frameworks project. The DeprecatedHeaders are found under ~/Documents/FacebookSDK/FacebookSDK.frameworks/Versions/A/. When you copy it over do not copy the items into your project, so they stay copied as a reference.
Next, in your code where you have:
#import <FacebookSDK/FacebookSDK.h>
Replace with this:
#import "Facebook.h"
You may get an error, in which case close and reopen the project.
Next you want to declare a Facebook object and set the session or clear it whenever your Session is open or closed.
Take as an example, the sample: https://github.com/fbsamples/ios-3.1-howtos/tree/master/ShareNativeDialogsHowTo that is documented here, https://developers.facebook.com/docs/howtos/share-native-dialogs-ios-sdk/
You could make the following changes to that sample to fallback to the feed dialog instead of falling back to a view controller with a share UI. In ViewController.m you would make these changes after including the Facebook header:
....
#property (unsafe_unretained, nonatomic) IBOutlet UIButton *publishButton;
#property (nonatomic, retain) Facebook *facebook;
....
#synthesize authButton;
#synthesize facebook = _facebook;
....
- (void)sessionStateChanged:(NSNotification*)notification {
if (FBSession.activeSession.isOpen) {
self.publishButton.hidden = NO;
[self.authButton setTitle:#"Logout" forState:UIControlStateNormal];
if (nil == self.facebook) {
self.facebook = [[Facebook alloc]
initWithAppId:FBSession.activeSession.appID
andDelegate:nil];
// Store the Facebook session information
self.facebook.accessToken = FBSession.activeSession.accessToken;
self.facebook.expirationDate = FBSession.activeSession.expirationDate;
}
} else {
self.publishButton.hidden = YES;
[self.authButton setTitle:#"Login" forState:UIControlStateNormal];
self.facebook = nil;
}
}
- (void) publishUsingFeedDialog {
// Put together the dialog parameters
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
#"Facebook SDK for iOS", #"name",
#"Build great social apps and get more installs.", #"caption",
#"The Facebook SDK for iOS makes it easier and faster to develop Facebook integrated iOS apps.", #"description",
#"https://developers.facebook.com/ios", #"link",
#"https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png", #"picture",
nil];
// Invoke the dialog
[self.facebook dialog:#"feed" andParams:params andDelegate:nil];
}
- (IBAction)publishButtonAction:(id)sender {
BOOL displayedNativeDialog =
[FBNativeDialogs
presentShareDialogModallyFrom:self
initialText:#""
....
if (!displayedNativeDialog) {
/*ShareViewController *viewController =
[[ShareViewController alloc] initWithNibName:#"ShareViewController"
bundle:nil];
[self presentViewController:viewController
animated:YES
completion:nil];*/
[self publishUsingFeedDialog];
}
}
I think you will get an "duplicate error" if you use both. I know it sucks.
Ive been messing with the duplicate error for days now. Please let me know if you got there.
You'll probably have to abstract out a common interface and implement it twice in separate source files (so the compiler never sees Facebook.h and FacebookSDK.h in the same file).
It's impossible, you should use Graph API https://developers.facebook.com/docs/howtos/publish-to-feed-ios-sdk/ instead of Feed Dialog :(
Try to import
"FBSession.h"
instead of
#import<FacebookSDK/FacebookSDK.h>
it will solve the duplicate error..

Resources