{"id":4443,"date":"2010-09-23T09:56:20","date_gmt":"2010-09-23T07:56:20","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=4443"},"modified":"2010-09-23T10:20:41","modified_gmt":"2010-09-23T08:20:41","slug":"t072-aggiungere-la-pubblicita-admob-nelle-nostre-applicazioni-iphone-programmaticamente","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t072-aggiungere-la-pubblicita-admob-nelle-nostre-applicazioni-iphone-programmaticamente\/","title":{"rendered":"T#072 &#8211; Aggiungere la pubblicit\u00e0 AdMob nelle nostre Applicazioni iPhone programmaticamente"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/09\/admob_logo.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/09\/admob_logo.jpg\" alt=\"Logo AdMob Google\" title=\"admob_logo\" width=\"300\" height=\"98\" class=\"alignleft size-full wp-image-4457\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/09\/admob_logo.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/09\/admob_logo-150x49.jpg 150w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> Oggi vorrei riprendere l&#8217;ottimo articolo di Luigi Marino dedicato ad AdMob, che potete rivedere da <a href=\"http:\/\/www.devapp.it\/wordpress\/t027-inseriamo-la-pubblicita-con-admob-nelle-nostre-applicazioni.html\">qui<\/a> e aggiornarvi su come inserire i banner (sempre di AdMob) facendo per\u00f2 questa volta tutto via codice, senza intervenire sugli XIB da Interface Builder (IB). Perch\u00e9 voglio evitare di intervenire sugli XIB? Essenzialmente per parecchi motivi, uno fra tutti perch\u00e9 quando si cerca di &#8220;descrivere&#8221; tramite testi il procedimento molti si perdono, dipende sempre da quale sia l&#8217;oggetto selezionato etc&#8230;. inoltre nel caso avessimo un&#8217;applicazione con parecchie pagine da visualizzare allora aprire ogni volta IB sarebbe oltremodo snervante.<!--more--><\/p>\n<p>La comodit\u00e0 di fare tutto via codice inoltre \u00e8 data anche dal fatto che se volessimo ad esempio cambiare posizione al banner o fare delle prove per poi rimuoverlo, farlo da codice pu\u00f2 fare la differenza.<br \/>\nQuindi, riapriamo il precedente articolo di Luigi, seguiamolo fino all&#8217;import delle librerie necessarie, e fermiamoci poco prima di aprire i file xib!! E ora tocca a noi \ud83d\ude1b<\/p>\n<p>Immaginiamo di voler inserire il banner in una pagina chiamata &#8220;Dettaglio.m&#8221; (che avr\u00e0 il suo bel file di intestazione &#8220;Dettaglio.h&#8221; associato). Apriamo il file &#8220;Dettaglio.h&#8221; e modifichiamolo come segue:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"AdMobDelegateProtocol.h\"\r\n#define AD_REFRESH_PERIOD 12.5 \/\/ display fresh ads every 12.5 seconds\r\n\r\n@interface Dettaglio : UIViewController <AdMobDelegate> \r\n{\r\n\/\/............ altri vostri oggetti...\r\n\tAdMobView *adMobAd;\r\n\tNSTimer *refreshTimer;\r\n}\r\n<\/pre>\n<p>Abbiamo importato la libreria &#8220;<em>AdMobDelegateProtocol.h<\/em>&#8220;, definito il nostro controller come gestore del delegate di AdMob (in modo tale da gestirne i callback), e definito una costante per il periodo di refresh di 12.5 secondi.<\/p>\n<p>Questa costante indica il tempo dopo il quale il timer far\u00e0 il refresh del banner. Vi dico subito, \u00e8 inutile che proviate ad abbassare il suo valore settandolo, ad esempio, a 5 secondi, AdMob, infatti, fa una verifica e se inferiore, lo riporta a 12.5, pu\u00f2 solo quindi esser eventualmente aumentato!<\/p>\n<p>Gli oggetti definiti adMobAd e timer saranno rispettivamente la nostra vista adMob (ovvero il banner) e il timer, che si occuper\u00e0 di fare il refresh di volta in volta in base alla costante definita poco fa.<\/p>\n<p>Bene, possiamo chiudere il file &#8220;Dettaglio.h&#8221; non ne abbiamo pi\u00f9 bisogno!<\/p>\n<p>Apriamo quindi il file di implementazione &#8220;Dettaglio.m&#8221; e inseriamo al suo interno il seguente codice.<br \/>\nCome dicevo, preferisco mettere tutto il codice interessato tra un commento del tipo &#8220;INIZIO AdMob&#8221; e un altro che indicher\u00e0 la fine, ad esempio &#8220;FINE AdMob&#8221;, in modo tale da commentare con mano ferma tutto il processo in un sol colpo!<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/********************* INIZIO AdMob ***************************\/\r\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\r\n\tif (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {\r\n\t\t\/\/ Custom initialization\r\n\t\t\/\/self.title = @\"Programmatic Ad\";\r\n\t}\r\n\treturn self;\r\n}\r\n\r\n- (void)dealloc {\r\n\t[adMobAd release];\r\n\t[refreshTimer invalidate];\r\n\t\r\n\t[super dealloc];\r\n}\r\n\r\n\/\/ Request a new ad. If a new ad is successfully loaded, it will be animated into location.\r\n- (void)refreshAd:(NSTimer *)timer {\r\n\t[adMobAd requestFreshAd];\r\n}\r\n\r\n#pragma mark -\r\n#pragma mark AdMobDelegate methods\r\n\r\n- (NSString *)publisherIdForAd:(AdMobView *)adView {\r\n\treturn @\"99999999999999\"; \/\/ this should be prefilled; if not, get it from www.admob.com\r\n}\r\n\r\n- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {\r\n\treturn self;\r\n}\r\n\r\n- (UIColor *)adBackgroundColorForAd:(AdMobView *)adView {\r\n\treturn [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; \/\/ this should be prefilled; if not, provide a UIColor\r\n}\r\n\r\n- (UIColor *)primaryTextColorForAd:(AdMobView *)adView {\r\n\treturn [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; \/\/ this should be prefilled; if not, provide a UIColor\r\n}\r\n\r\n- (UIColor *)secondaryTextColorForAd:(AdMobView *)adView {\r\n\treturn [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; \/\/ this should be prefilled; if not, provide a UIColor\r\n}\r\n\r\n\/\/ Sent when an ad request loaded an ad; this is a good opportunity to attach\r\n\/\/ the ad view to the hierachy.\r\n- (void)didReceiveAd:(AdMobView *)adView {\r\n\tNSLog(@\"AdMob: Did receive ad\");\r\n\t\/\/ get the view frame\r\n\tCGRect frame = self.view.frame;\r\n\t\r\n\t\/\/ put the ad at the bottom of the screen\r\n\tadMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48);\r\n\t\r\n\t[self.view addSubview:adMobAd];\r\n\t[refreshTimer invalidate];\r\n\trefreshTimer = [NSTimer scheduledTimerWithTimeInterval:AD_REFRESH_PERIOD target:self selector:@selector(refreshAd:) userInfo:nil repeats:YES];\r\n}\r\n\r\n\/\/ Sent when an ad request failed to load an ad\r\n- (void)didFailToReceiveAd:(AdMobView *)adView {\r\n\tNSLog(@\"AdMob: Did fail to receive ad\");\r\n\t[adMobAd removeFromSuperview];  \/\/ Not necessary since never added to a view, but doesn't hurt and is good practice\r\n\t[adMobAd release];\r\n\tadMobAd = nil;\r\n\t\/\/ we could start a new ad request here, but in the interests of the user's battery life, let's not\r\n}\r\n\/\/********************* FINE AdMob ***************************\/\r\n<\/pre>\n<p>Fatto questo provate a compilare, se avete copiato e incollato il nostro codice nel file, senza modificare il vostro gi\u00e0 esistente potreste ottenere degli errori, questo perch\u00e8 probabilmente avevate gi\u00e0 alcuni metodi definiti, che abbiamo riportato con il nostro.<\/p>\n<p>Solitamente sono questi:<\/p>\n<ul>\n<li>initWithNibName<\/li>\n<li>dealloc (per rilasciare i due oggetti)<\/li>\n<\/ul>\n<p>Per sistemare le cose, non dovrete far altro che spostare il codice necessario nei vostri precedenti metodi, o cancellare i vostri e tenervi questi che vi ho riportato io utili per AdMob, \u00e8 indifferente, fate voi, l&#8217;importante \u00e8 che non abbiate metodi ripetuti nel codice.  <\/p>\n<p><strong>ATTENZIONE:<\/strong> Mi raccomando ricordatevi di MODIFICARE il valore <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n   return @\"99999999999999\" \r\n<\/pre>\n<p>della funzione &#8220;<em>publisherIdForAd<\/em>&#8221; mettendoci il VOSTRO di codice. Se non ne avete uno sappiate che ottenerlo \u00e8 semplicissimo, e baster\u00e0 che vi rechiate sul sito <a href=\"http:\/\/www.admob.com\/\" target=\"_blank\">AdMob.com<\/a> per ottenerne uno.<\/p>\n<p>Infine, dovreste anche cambiare le impostazioni dei colori di base:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (UIColor *)adBackgroundColorForAd:(AdMobView *)adView {\r\n\treturn [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; \/\/ this should be prefilled; if not, provide a UIColor\r\n}\r\n\r\n- (UIColor *)primaryTextColorForAd:(AdMobView *)adView {\r\n\treturn [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; \/\/ this should be prefilled; if not, provide a UIColor\r\n}\r\n\r\n- (UIColor *)secondaryTextColorForAd:(AdMobView *)adView {\r\n\treturn [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; \/\/ this should be prefilled; if not, provide a UIColor\r\n}\r\n<\/pre>\n<p>se ovviamente non vi piacciono (o semplicemente non si addicono al vostro progetto) questi scelti da me!<\/p>\n<p>Abbiamo quasi terminato, cerchiamo il metodo &#8220;viewDidLoad&#8221; e aggiungiamo le due righe che seguono:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n        adMobAd = [AdMobView requestAdWithDelegate:self]; \/\/ start a new ad request\r\n\t[adMobAd retain]; \/\/ this will be released when it loads (or fails to load)\r\n}\r\n<\/pre>\n<p>Bene, non c&#8217;e&#8217; altro da aggiungere direi.<br \/>\nSe non volete far apparire il banner mentre siete in sviluppo, o volete far diventare la versione full dopo un inApp purchase, non dovrete far altro che mettere un semplice &#8220;if&#8221; prima di queste due righe nel metodo viewDidLoad.<\/p>\n<p>Altra cosa importante da aggiungere, il banner con questo codice si visualizzer\u00e0 in basso al form (appena sopra la tabbar se ne avete una), per metterlo in alto o in mezzo o dove volete, dovete modificare la riga che imposta il frame della view nel metodo &#8220;didReceiveAd&#8221;:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n  \/\/In fondo alla view....\r\n  adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48);\r\n\r\n  \/\/in testa alla view!\r\n  adMobAd.frame = CGRectMake(0, 0, frame.size.width, 48);\r\n<\/pre>\n<p>Ricordo che i parametri passati a CGRectMake corrispondono rispettivamente a x, y, larghezza, altezza.<\/p>\n<p>Spero il tutorial vi sia d&#8217;aiuto!<br \/>\nAlla prossima<\/p>\n<p>Gino Sarnieri staff: <a href=\"http:\/\/www.sviluppo4mobile.com\">www.sviluppo4mobile.com<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi vorrei riprendere l&#8217;ottimo articolo di Luigi Marino dedicato ad AdMob, che potete rivedere da qui e&#8230;<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[146,410,409,186,412,413,411],"class_list":["post-4443","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-admob","tag-admob-ipad","tag-admob-iphone","tag-gino-sarnieri","tag-guadagnare-iphone","tag-programmare-iphone","tag-pubblicita-applicazioni-iphone"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=4443"}],"version-history":[{"count":17,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4443\/revisions"}],"predecessor-version":[{"id":4461,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4443\/revisions\/4461"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=4443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=4443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=4443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}