{"id":6161,"date":"2011-03-10T12:05:10","date_gmt":"2011-03-10T11:05:10","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6161"},"modified":"2011-03-10T12:05:10","modified_gmt":"2011-03-10T11:05:10","slug":"t088-monetizzare-le-proprie-applicazioni-con-iad-una-guida-pratica","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t088-monetizzare-le-proprie-applicazioni-con-iad-una-guida-pratica\/","title":{"rendered":"T#088 &#8211; Monetizzare le proprie applicazioni con iAD: una guida pratica"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/iAd-Producer-tutorial-devapp-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/iAd-Producer-tutorial-devapp-00.jpg\" alt=\"iAd-Producer-tutorial-devapp-00\" title=\"iAd-Producer-tutorial-devapp-00\" width=\"180\" height=\"150\" class=\"alignleft size-full wp-image-5730\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/iAd-Producer-tutorial-devapp-00.jpg 180w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/iAd-Producer-tutorial-devapp-00-150x125.jpg 150w\" sizes=\"auto, (max-width: 180px) 100vw, 180px\" \/><\/a> Oggi parliamo di iAD e come implementarlo all&#8217;interno delle nostre applicazioni. iAD permette di mostrare contenuti pubblicitari direttamente dall&#8217;interno della nostra applicazione. Verremo pagati in base a quante visualizzazioni (e click) facciamo attraverso la nostra applicazione.<\/p>\n<p>Apple si occupa di vendere la pubblicit\u00e0 e fornire al programmatore che implementa iAD i corrispettivi di guadagno in base ai criteri di cui sopra.<\/p>\n<p>Non mi dilungher\u00f2 ancora sulle caratteristiche del network iAD e sulle sue potenzialit\u00e0, esistono gi\u00e0 abbastanza articoli presenti su DevAPP in merito.<\/p>\n<p>Per implementare con successo iAD \u00e8 necessario tenere presente quattro concetti base:<!--more--><\/p>\n<ul>\n<li>I banner sfruttano una porzione dello schermo. Bisogner\u00e0 adattare il nostro schermo alla presenza o meno di pubblicit\u00e0. Attenzione al fatto che Apple prevede la possibilit\u00e0 che non ci siano banners pubblicitari per un determinato lasso temporale o per una determinata nazione. In questi casi, la nostra applicazione dovr\u00e0 continuare a funzionare EVITANDO di lasciare sullo schermo una zona BIANCA (o vuota) in cui dovrebbe andare la pubblicit\u00e0. Se non implementata correttamente questa caratteristica, potrete incorrere in un reject da parte di Apple per non conformit\u00e0 alla UIGL.<\/li>\n<li>Prevedere (dove necessario) una pausa di tutte le attivit\u00e0 con criticit\u00e0 di tempo quando l&#8217;utente visualizza una pubblicit\u00e0. Immaginate di stare sviluppando un game, in cui volete aggiungere della pubblicit\u00e0 come fonte di reddito. In questo caso, sar\u00e0 opportuno, prevedere uno o pi\u00f9 metodi, preposti alla messa in pausa delle funzionalit\u00e0 base del nostra applicazione (nel caso di un game: scrolling, animazioni, tempo, etc.). Sar\u00e0 compito dei delegati della classe che adotta il protocollo ADBannerViewDelegate, invocarli al momento opportuno.<\/li>\n<li>Riattivare tutte le attivit\u00e0 con criticit\u00e0 di tempo dopo che l&#8217;utente ha chiuso la pubblicit\u00e0. Anche in questo caso, sar\u00e0 compito della nostra classe che adotta il protocollo ADBannerViewDelegate, invocare i metodi opportuni alla chiusura dello spot pubblicitario.<\/li>\n<li>Filtrare pubblicit\u00e0 concorrenziali con la nostra applicazione (facoltativo).<\/li>\n<\/ul>\n<h4>Operazioni preliminari<\/h4>\n<p>Ai fini del programmatore, iAD \u00e8 composta da un oggetto che eredita da UIView (<strong>ADBannerView<\/strong>) e da un delegato (<strong>ADBannerViewDelegate<\/strong>).<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-01.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-01\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-01\" width=\"406\" height=\"525\" class=\"aligncenter size-full wp-image-6163\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-01.jpg 406w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-01-232x300.jpg 232w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-01-116x150.jpg 116w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Quindi, dovunque possiamo inserire un oggetto UIView (ed implementare il suo delegato), possiamo utilizzare iAD. Questo include (ma non \u00e8 limitato soltanto) gli UIViewController ed UITableViewController. Nel nostro esempio, utilizzeremo un oggetto UIViewController.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.iphonesmartapps.org\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg\" alt=\"banner-iphoneSmartApps-org\" title=\"banner-iphoneSmartApps-org\" width=\"468\" height=\"54\" class=\"aligncenter size-full wp-image-6174\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-300x34.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-150x17.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>I preliminari<\/h4>\n<p>Per prima cosa, bisogna aggiungere il supporto ad iAD nella nostra applicazione. Per fare questo \u00e8 necessario appoggiarsi ad un framework di Apple preesistente. Selezioniamo la cartella Frameworks dalla lista dei files nel nostro progetto e, premendo con il tasto destro, scegliamo di aggiungere un framework preesistente:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-02.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-02\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-02\" width=\"450\" height=\"261\" class=\"aligncenter size-full wp-image-6164\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-02.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-02-300x174.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-02-150x87.jpg 150w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>A questo punto, selezioniamo la voce iAD.framework e premiamo Add.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-03.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-03\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-03\" width=\"338\" height=\"534\" class=\"aligncenter size-full wp-image-6165\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-03.jpg 338w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-03-189x300.jpg 189w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-03-94x150.jpg 94w\" sizes=\"auto, (max-width: 338px) 100vw, 338px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Ricordiamoci di aggiungere il supporto al framework nel nostro file .pch:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#ifndef __IPHONE_3_0\r\n#warning \"This project uses features only available in iPhone SDK 3.0 and later.\"\r\n#endif\r\n\r\n#ifdef __OBJC__\r\n    #import <Foundation\/Foundation.h>\r\n    #import <UIKit\/UIKit.h>\r\n\t#import <iAd\/iAd.h>\r\n#endif\r\n<\/pre>\n<h4>iAD ed interazione con i viewControllers<\/h4>\n<p>Creiamo una nuova classe di tipo UIViewController ed adottiamo il protocollo <strong>ADBannerViewDelegate<\/strong>:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@class ADBannerView;\r\n\r\n@interface MainViewController : UIViewController <ADBannerViewDelegate> {\r\n\r\n\tADBannerView *_adBannerView;\r\n\r\n\tUIView *contentView;\r\n\tUILabel *timerLabel;\r\n\tNSTimer *myScheduler;\r\n\tunsigned long myTimerCounter;\r\n}\r\n\r\n- (ADBannerView *)createAdBannerView;\r\n- (void)showHideAdView:(int)operationType;\r\n\r\n@end\r\n<\/pre>\n<p>Al suo interno, avremo cura di dichiarare una variabile d&#8217;istanza puntatore ad un oggetto di tipo <strong>ADBannerView<\/strong>. Le altre variabili serviranno rispettivamente per creare una view contenitore (<strong>UIView<\/strong>), creare una casella di testo in cui aggiungeremo un contatore di secondi (<strong>UILabel<\/strong>) ed un timer (<strong>NSTimer<\/strong>) utile per scandire il refresh del nostro timer a schermo.<\/p>\n<p>Spostiamoci nella parte di implementazione ed implementiamo il metodo di loadView. Come sappiamo, esso verr\u00e0 invocato ogni qualvolta ci sar\u00e0 necessit\u00e0 di disegnare la UIView del nostro controllore a schermo.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)loadView {\r\n\tcontentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];\r\n\t[contentView setBackgroundColor:[UIColor redColor]];\r\n\t\r\n\ttimerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 140, 320, 20)];\r\n\t[timerLabel setBackgroundColor:[UIColor clearColor]];\r\n\t[timerLabel setFont:[UIFont systemFontOfSize:18]];\r\n\t[timerLabel setTextAlignment:UITextAlignmentCenter];\r\n\t[timerLabel setTextColor:[UIColor blackColor]];\r\n\t\r\n\t[contentView addSubview:timerLabel];\r\n\t[timerLabel release];\r\n\t\r\n\tmyScheduler = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(incrementTimer) userInfo:nil repeats:YES];\r\n\t\r\n\tself.view = contentView;\r\n\t[contentView release];\r\n}\r\n<\/pre>\n<p>La prima cosa da fare \u00e8 quella di creare un oggetto UIView contenitore che sar\u00e0 assegnato alla property view del nostro controllore. Al suo interno trova posto anche l&#8217;oggetto timerLabel, necessario per mostrare a schermo il nostro timer.<\/p>\n<p>L&#8217;oggetto myScheduler, di tipo NSTimer, \u00e8 molto interessante. Se non vi siete mai imbattuti in esso, vi consiglio vivamente di leggere un p\u00f2 della documentazione Apple a riguardo. Esso \u00e8 un ottimo compromesso ai Thread, quando \u00e8 possibile applicarlo.<\/p>\n<p>Nel nostro caso specifico lo utilizzeremo come schedulatore del passare dei secondi. Quello che facciamo \u00e8 crearne un&#8217;istanza autorilasciante, grazie all&#8217;invocazione del metodo di classe <strong>scheduledTimerWithTimeInterval:target:selector:userInfo:repeats<\/strong>.<\/p>\n<p>Ad esso passiamo il tempo di scadenza per ogni successiva invocazione, la classe target idonea a ricevere l&#8217;evento, il selettore da invocare nell&#8217;evento, eventuali payloads aggiuntivi e la modalit\u00e0 di ripetizione.<\/p>\n<p>Notate come la variabile sia dichiarata d&#8217;istanza, quindi, \u00e8 lecito dedurre che essa sar\u00e0 valida per tutto il tempo di durata del timer. Nel nostro caso specifico, essa rester\u00e0 valida sino a quando non interromperemo (<strong>invalidate<\/strong>) il timer esplicitamente, visto che abbiamo selezionato la modalit\u00e0 repeat.<\/p>\n<p>Alla fine, assegniamo il contenuto della UIView contenitore alla property view del nostro UIViewController e rilasciamo la sua istanza.<\/p>\n<p>I metodi delegati, invocati subito prima e subito dopo la visualizzazione della view, completano l&#8217;inizializzazione del nostro controllore.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewWillAppear:(BOOL)animated {\r\n\tmyTimerCounter = 0;\r\n}\r\n\r\n- (void)viewDidAppear:(BOOL)animated {\r\n\t_adBannerView = [self createAdBannerView];\r\n\t[contentView addSubview:_adBannerView];\r\n}\r\n<\/pre>\n<p>Poco prima della visualizzazione del contenuto del metodo loadView, provvederemo a resettare il nostro contatore dei secondi e, subito dopo la visualizzazione della view, provvederemo ad istanziare il nostro oggetto ADBannerView. <\/p>\n<p>Per farlo, invochiamo un metodo <strong>createAdBannerView<\/strong> responsabile della creazione e restituizione di una istanza valida di tipo ADBannerView; vedremo nel prossimo paragrafo di cosa si tratta. Ai fini del metodo <strong>viewDidAppear<\/strong>, ci basta sapere che l&#8217;istanza ritornata eredita da UIView, quindi possiamo operare con essa come in presenza di una normale UIView. Infatti, al ritorno dalla funzione di creazione, aggiungiamo la view risultante al nostro contentView. <\/p>\n<p>La creazione del nostro banner pubblicitario \u00e8 responsabilit\u00e0 del metodo createAdBannerView:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (ADBannerView *)createAdBannerView {\r\n\tADBannerView *myBannerView = [[ADBannerView alloc] initWithFrame:CGRectZero];\r\n\t[myBannerView setRequiredContentSizeIdentifiers:[NSSet setWithObjects:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t ADBannerContentSizeIdentifierPortrait, nil]];\r\n\t[myBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierPortrait];            \r\n\t[myBannerView setDelegate:self];\r\n\t[myBannerView setAlpha:0.0];\r\n\t[myBannerView setCenter:CGPointMake(160, 500)];\r\n\treturn [myBannerView autorelease];    \r\n}\r\n<\/pre>\n<p>Come prima cosa, dobbiamo allocare ed inizializzare un&#8217;istanza di tipo ADBannerView. Su quest&#8217;ultima, aggiungiamo tutti i tipi di banner che vogliamo supportare. Attualmente esistono due tipo di banner: uno per l&#8217;orientamento verticale del nostro dispositivo, ed una per l&#8217;orientamento orizzontale. Nel nostro esempio, popoleremo l&#8217;oggetto NSSet con la sola modalit\u00e0 Portrait, visto che la nostra applicazione non supporta le altre modalit\u00e0.<\/p>\n<p>Subito dopo, assegnamo come delegato la classe UIViewController stessa e ci preoccupiamo di rendere invisibile (<strong>setAlpha<\/strong>) e mettere fuori dallo schermo (<strong>setCenter<\/strong>) l&#8217;istanza di ADBannerView che, ricordo ancora una volta, \u00e8 una classe che eredita direttamente dalla classe UIView.<\/p>\n<p>Dopo la configurazione ritorniamo l&#8217;oggetto appena istanziato. Prima di farlo, per\u00f2, \u00e8 necessario lanciare un messaggio di <strong>autorelease<\/strong>, prima della restituzione, per evitare un problema di rilascio anticipato della memoria.<\/p>\n<h4>La claase ADBannerView<\/h4>\n<p>La classe ADBannerView \u00e8 responsabile di creare una view che mostri contenuti pubblicitari all&#8217;interno della nostra applicazione. L&#8217;oggetto eredita direttamente da UIView. Ad esso, quindi, si applicano tutte le propriet\u00e0 e le caratteristiche degli oggetti di tipo UIView (che dovremmo conoscere molto bene).<\/p>\n<p>A questo oggetto \u00e8 associato un delegato, responsabile della corretta visualizzazione a schermo degli spot pubblicitari associati ad un banner. Il delegato viene invocato ogni qualvolta si clicca su di un banner.<\/p>\n<p>La classe delegata deve anche essere responsabile della corretta gestione dei banners a schermo in caso di mancanza di connessione internet o nel caso in cui Apple decida di non trasmettere momentaneamente dei banners pubblicitari (ad esempio, in particolari nazioni, iAD non \u00e8 disponibile).<\/p>\n<p>Iniziamo subito con il costruire un metodo che, quando invocato, mostra a schermo (o nasconde) la nostra istanza di ADBannerView creata sopra. In questo modo, se ci sono dei messaggi pubblicitari disponibili, li mostreremo a schermo. Nel caso di non disponibilit\u00e0, eviteremo di lasciare una zona inutilizzata e non reattiva a schermo.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)showHideAdView:(int)operationType {\r\n    if (_adBannerView != nil) {        \r\n\t\t[_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierPortrait];\r\n\t\t\r\n\t\t[UIView beginAnimations:@\"showHideAdView\" context:nil];\r\n\t\tswitch (operationType) {\r\n\t\t\tcase hideiADBanner:\r\n\t\t\t\t[_adBannerView setCenter:CGPointMake(160, 500)];\r\n\t\t\t\t[_adBannerView setAlpha:0.0];\r\n\t\t\t\tbreak;\r\n\t\t\tcase showiADBanner:\r\n\t\t\t\t[_adBannerView setCenter:CGPointMake(160, 460-25)];\r\n\t\t\t\t[_adBannerView setAlpha:1.0];\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n        [UIView commitAnimations];\r\n    }   \r\n}\r\n<\/pre>\n<p>Il metodo prende come input un parametro di tipo intero che pu\u00f2 assumere due valori: <em>showADBanner<\/em> e <em>hideADBanner<\/em>.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ntypedef enum iADShowerSwitch { \r\n\tshowiADBanner = 0,\r\n\thideiADBanner = 1\r\n} iADShowerSwitch;\r\n<\/pre>\n<p>Nel caso in cui la nostra applicazione dovr\u00e0 gestire pi\u00f9 orientamenti, sar\u00e0 in questo metodo che sceglieremo come mostrare a schermo il banner. A seconda (<strong>switch<\/strong>) dell&#8217;operazione desiderata, mostriamo o nascondiamo a schermo l&#8217;oggetto ADBannerView. L&#8217;operazione \u00e8 stata racchiusa all&#8217;interno di un brachet begin\/commitAnimations, per ottenere un gradevole effetto animato durante la visualizzazione\/sparizione dallo schermo.<\/p>\n<p>La User Interface Guide Lines di Apple, consiglia caldamente di gestire entrambe le evenienze (presenza o meno di eventuali banners pubblicitari). Per fare questo, \u00e8 necessario implementare nella classe che adotta il protocollo <strong>ADBannerViewDelegate<\/strong> due metodi. Il primo si occupa di mostrare a schermo gli eventuali banners pubblicitari inviati dal server di Apple:<\/p>\n<p>&#8211; (void)bannerViewDidLoadAd:(ADBannerView *)banner {<br \/>\n\t[self showHideAdView:showADBanner];<br \/>\n}<\/p>\n<p>Il secondo si occupa di nascondere l&#8217;eventuale banner presente a schermo, in caso di errore o mancata comunicazione con il server Apple.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {\r\n\tNSLog(@\"ADBannerView ERROR: %@\", [error localizedDescription]);\r\n\t[self showHideAdView:hideiADBanner];\r\n}\r\n<\/pre>\n<p>Ci resta da implementare i due metodi delegati responsabili per la gestione a schermo dello spot pubblicitario in caso di pressione sul banner da parte dell&#8217;utente. Come anticipato all&#8217;inizio di quest&#8217;articolo, sarebbe desiderabile interrompere qualunque operazione <em>time critical<\/em>, all&#8217;interno della nostra applicazione, durante la visualizzazione della pubblicit\u00e0. Essa, infatti, occupa momentaneamente tutto lo schermo dell&#8217;iPhone\/iPad. <\/p>\n<p>Nel nostro esempio, quello che faremo sar\u00e0 sospendere e riattivare il nostro timer a schermo alla visualizzazione\/scomparsa della pubblicit\u00e0. Ovviamente, un metodo completo dovrebbe prendere in considerazione tutte le parti critiche dell&#8217;applicazione. <\/p>\n<p>Al completamento delle operazioni di sospensione dell&#8217;applicazione, ricordiamoci di ritornare con un valore booleano positivo. In caso negativo, infatti, la pubblicit\u00e0 non verr\u00e0 mostrata a schermo.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave {\r\n\t[self pauseTimer];\r\n\treturn YES;\t\r\n}\r\n<\/pre>\n<p>Al ritorno dalla pubblicit\u00e0, effettuiamo l&#8217;operazione inversa: riattiviamo il timer e riprendiamo la normale attivit\u00e0 della nostra applicazione.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)bannerViewActionDidFinish:(ADBannerView *)banner {\r\n\t[self restartTimer];\r\n}\r\n<\/pre>\n<p>Ci restano da implementare i quattro metodi ausiliari, necessari per incrementare, sospendere, riattivare e mostrare a schermo il nostro contatore.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)renderTimerToScreen {\r\n\t[timerLabel setText:[NSString stringWithFormat:@\"seconds elapsed: %d\", myTimerCounter]];\r\n}\r\n\r\n- (void)incrementTimer {\r\n\tmyTimerCounter++;\r\n\t[self renderTimerToScreen];\r\n}\r\n\r\n- (void)restartTimer {\r\n\tmyScheduler = [NSTimer scheduledTimerWithTimeInterval:1.0 \r\n                                          target:self \r\n                                          selector:@selector(incrementTimer) \r\n                                          userInfo:nil \r\n                                          repeats:YES];\r\n}\r\n\r\n- (void)pauseTimer {\r\n \t[myScheduler invalidate];\r\n}\r\n<\/pre>\n<h4>iAD e configurazione su iTunesConnect<\/h4>\n<p>Attenzione, questo paragrafo non \u00e8 strettamente necessario per la fase di testing. In base alle mie esperienze, per testare con un provisioning profile di debug\/release su iPhone o Simulatore quanto sopra riportato, non \u00e8 necessario provedere con la creazione di un&#8217;applicazione abilitata ad iAD. Tuttavia, quest&#8217;operazione \u00e8 necessaria nel caso in cui si decida di sottomettere l&#8217;applicazione ad Apple per la revisione, utilizzando il sistema pubblicitario iAD. Apple consiglia sempre di creare preventivamente e nella fase di testing un provisioning profile (ed una relativa applicazione su iTunesConnect) legato all&#8217;applicazione che si sta sviluppando.<\/p>\n<p>Per fare questo, apriamo il portale iTunesConnect e creiamo un&#8217;applicazione legata al provisioning profile scelto in fase di sviluppo. Non ha importanza se poi non pubblicherete quest&#8217;applicazione. Potrete sempre rimuovere l&#8217;applicazione da iTunesConnect quando lo desiderate.<\/p>\n<p>Una volta creata l&#8217;applicazione, selezionatela e scegliete il menu <strong>Setup iAD Network<\/strong>.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-04.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-04.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-04\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-04\" width=\"224\" height=\"174\" class=\"aligncenter size-full wp-image-6166\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-04.jpg 224w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-04-150x116.jpg 150w\" sizes=\"auto, (max-width: 224px) 100vw, 224px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Il sistema vi chieder\u00e0 che genere di target avete in mente per la vostra applicazione e se esso \u00e8 di tipo minorenne. Effettuate la vostra scelta e premete Enable iADs.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-05.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-05.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-05\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-05\" width=\"550\" height=\"176\" class=\"aligncenter size-full wp-image-6167\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-05.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-05-300x96.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-05-150x48.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>A questo punto, il portale vi risponder\u00e0, ricordandovi che l&#8217;abilitazione ad iAD avverr\u00e0 solo alla prossima revisione, da parte di Apple, dell&#8217;applicativo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-06.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-06.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-06\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-06\" width=\"550\" height=\"77\" class=\"aligncenter size-full wp-image-6168\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-06.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-06-300x42.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-06-150x21.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Un&#8217;ultima cosa<\/h4>\n<p>C&#8217;e&#8217; ancora un&#8217;ultima cosa di cui ritengo sia utile parlare. Dalla homepage del vostro portale iTunesConnect, c&#8217;\u00e8 la possibilit\u00e0 di gestire e visualizzare l&#8217;andamento della propria pubblicit\u00e0, all&#8217;interno delle singole apps:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-07.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-07.jpg\" alt=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-07\" title=\"t-088-Monetizzare-le-applicazioni-iPhone-iPad-con iAD-guida pratica-07\" width=\"363\" height=\"84\" class=\"aligncenter size-full wp-image-6169\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-07.jpg 363w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-07-300x69.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica-07-150x34.jpg 150w\" sizes=\"auto, (max-width: 363px) 100vw, 363px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Attraverso questo frontend, sar\u00e0 possibile visualizzare gli andamenti ed i guadagni dalla pubblicit\u00e0, cos\u00ec come sar\u00e0 possibile gestire eventuali gruppi di pubblicit\u00e0 selezionate per parole chiave che non si vuole appaiano all&#8217;interno della nostra applicazione (ad esempio, applicazioni concorrenti).<\/p>\n<p>Il sistema \u00e8 egregiamente documentato e semplice da usare. Vi invito a navigarlo e studiarlo, insieme alla documentazione Apple sull&#8217;argomento.<\/p>\n<p>Grazie e buona programmazione a tutti!<br \/>\nCostantino<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica.zip\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"Icona Download\" title=\"download_icon\" width=\"33\" height=\"40\" class=\"alignnone size-full wp-image-3385\" \/><\/a> Se avete problemi con il tutorial, questo \u00e8 il <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t-088-Monetizzare-le-applicazioni-iPhone-iPad-con-iAD-guida-pratica.zip\" target=\"_blank\">nostro file di progetto<\/a>.<br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.iphonesmartapps.org\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg\" alt=\"banner-iphoneSmartApps-org\" title=\"banner-iphoneSmartApps-org\" width=\"468\" height=\"54\" class=\"aligncenter size-full wp-image-6174\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-300x34.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-150x17.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi parliamo di iAD e come implementarlo all&#8217;interno delle nostre applicazioni. iAD permette di mostrare contenuti pubblicitari&#8230;<\/p>\n","protected":false},"author":476,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[479,609,287,608,610],"class_list":["post-6161","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-costantino-pistagna","tag-guadagnare-con-applicazioni-iphone-e-ipad","tag-iad","tag-monetizzare-con-le-applicazioni-iphone","tag-pubblicita-su-iphone-app"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6161","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\/476"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6161"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6161\/revisions"}],"predecessor-version":[{"id":6181,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6161\/revisions\/6181"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}