2010-11-11 12 views
15

Ho aggiunto l'ADBannerView ad una vista e quando carico l'applicazione ottengo il seguente messaggio:È un problema quando un iAd può essere oscurato?

ADBannerView: ATTENZIONE Una vista banner (0x7a023c0) ha un annuncio, ma può essere oscurata. Questo messaggio viene stampato solo una volta per visualizzazione banner.

Per quanto posso vedere tutto il banner è visibile sullo schermo. E 'veramente un problema? O è solo un avvertimento che posso ignorare?

+0

potete aiutarmi in questo http://stackoverflow.com/questions/5953418/implementation-for-iad – ajay

+0

Ho trovato utile questo video di Youtube. http://www.youtube.com/watch?v=hLpgL6K1vM4 – user961632

risposta

22

Come dice Stephen Darlington, è una buona idea per capire qual è il problema. Un modo semplice per controllare due volte questo nel codice (da un controller di vista) sarebbe:

 // bring your bannerView to the front 
    [self.view bringSubviewToFront:bannerView]; 

    // and make sure it's positioned onscreen. 
    bannerView.frame = CGRectMake(0.0, 0.0, bannerView.frame.size.width, bannerView.frame.size.height); 

Supponendo che si ha avuto un iVar/IBOutlet al ADBannerView chiamato bannerView, questo si sarebbe preso cura di eventuali problemi di posizionamento Interface Builder, e assicurati che bannerView non sia coperto da nulla.

Dalla mia esperienza, niente di male succede se l'annuncio è fuori campo, tuttavia, l'iAd non sarà caricare nuovi annunci fino a quando non sa che è completamente sullo schermo. Quindi, quando avvii la tua app,

  1. Your AdBannerView tenterà di caricare un annuncio pubblicitario, sia esso sullo schermo o meno.

  2. A seconda se sia o non riesce, l'AdBannerViewDelegate riceverà o

    a) bannerViewDidLoadAd: (passare al punto 3) o

    b) bannerView: didFailToReceiveAdWithError: (l'ADBannerView ci riprova da solo)

  3. A quel punto, la palla è nella tua corte su cosa fare con detto bannerView, se in effetti ha caricato un annuncio. Un modo semplice per verificare questo codice è YourBannerView.bannerLoaded, che restituirà SÌ se ha un annuncio, o NO se non lo fa. E così ...

  4. Il modo in cui gestisci AdBannerView dopo aver caricato correttamente l'annuncio iniziale determina come si comporterà in futuro. Non è necessario posizionarlo sullo schermo immediatamente: scegliere un orario adatto all'applicazione. Tuttavia, una visualizzazione banner che ha caricato correttamente un annuncio NON prova a caricarne un altro finché non è sullo schermo. (Ha senso, giusto?) La parte difficile è ....

    4b) non si riceveranno nuovi messaggi di delegato da tale bannerView, quindi se non si sposta il bannerView sullo schermo immediatamente dopo aver ricevuto il messaggio di delega BannerViewDidLoadAd, sarà necessario implementare una sorta di struttura di controllo su il tuo da gestire quando, se del caso, lo sposti sullo schermo, a quel punto inizierà a chiedere all'ad server più annunci e otterrai più messaggi delegati e il ciclo ricomincia.

Quindi, per riassumere: E 'solo un problema se l'iAd è oscurato se si desidera servire più IAD ed essere pagati. Tuttavia, l'eCPM è stato molto, molto poco ultimamente, quindi forse non è poi così un problema;)

2

Come avvisi del compilatore, credo che questo è qualcosa che probabilmente si dovrebbe cercare di andare a fondo di anche se non sta causando immediatamente i problemi. Se fossi Apple, invierei i miei annunci alle app che effettivamente li mostrano (non sto dicendo che lo fanno do), quindi potrebbe esserci anche un aspetto finanziario.

un paio di problemi che ho visto:

  • Il telaio iAd è un po 'fuori, forse fuori dallo schermo da solo un pixel o due
  • hai accidentalmente creato due IAD e uno è sullo schermo e l'altro è nascosto dietro il primo
+0

Ho disattivato l'autosizing su AdBannerView in XIB per ogni dimensione tranne la distanza dal fondo (il mio banner è nella parte inferiore dello schermo e c'è una barra sotto esso). Questo sembra aver risolto per me. – Oscar

1

Ho avuto lo stesso problema ma il motivo è che ho le barre di notifica di OpenFeint in cima a quello, ad es. punteggi alti, raggiungimento sbloccato, ecc. Scivola e poi scivola via, non rimane a lungo, quindi non penso che sia un problema.

Io metto ADS in alto, quindi l'utente non vedrebbe le notifiche di OpenFeint, che sarà un altro problema, non so se questo succede se hai ADS e OpenFeint su diverse posizioni dello schermo, non l'ho provato poiché lo schermo inferiore della mia app è pieno di pulsanti, quindi è disponibile solo la parte superiore dello schermo.

1

Un'altra opzione consiste nell'ascoltare gli eventi di ridimensionamento della barra di stato e spostare l'iAd quando ciò accade, in modo che non venga riposizionato sullo schermo (con conseguente avviso e annunci non pubblicati).

Nella tua app delegato, attingere a questa funzione:

  • (void) applicazione: (UIApplication *) applicazione willChangeStatusBarFrame: (CGRect) newStatusBarFrame // Controllare newStatusBarFrame.size.height e animare la cornice iAd su o giù di conseguenza.
1

Sto ottenendo questo messaggio quando aggiungo ADBannerView a un UIScrollView. In questo caso l'annuncio potrebbe essere oscurato.

7

Per aggiungere a questa discussione, ho ricevuto questo messaggio quando ho modificato la proprietà center per spostare l'annuncio appena fuori dallo schermo. Uso le animazioni di UIView per far scorrere l'annuncio sullo schermo.

Dopo alcuni esperimenti ho capito come farlo senza far apparire il messaggio. Il trucco era nascondere per impostare la proprietà adBannerView.hidden su YES in attesa che l'annuncio venisse caricato. Una volta che è stato caricato, ho dovuto fare in modo di impostare la proprietà nascosta per NO solo dopo commesso l'animazione:

-(void) fadeAdIn:(UIView*)view 
{ 
    float offsetY = view.frame.size.height * (bannerOnBottom ? 1 : -1); 

    CGPoint pos = [self getBannerPosition]; 
    view.center = CGPointMake(pos.x, pos.y + offsetY); 

    [UIView beginAnimations:@"AdIn" context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    view.center = pos; 
    [UIView commitAnimations]; 

    // must unhide AFTER animation has been committed to prevent "ad obstructed" 
    view.hidden = NO; 
} 
+0

Grazie. Stavo cominciando a sbattere la testa contro il muro su questo dettaglio, ma il semplice spostamento della chiamata _bannerView.hidden all'esterno del blocco di animazione ha fatto il trucco! –

1

La risposta LearnCocos2D è stata la soluzione per me. Non sono sicuro se questo è un problema specifico con Cocos2D (che sto usando). Il mio problema era che stavo usando le "nuove" animazioni di stile usando i blocchi consigliati da Apple, animateWithDuration: delay: options: animations: completion: Quando li uso, ottengo l'avviso oscurato. Immagino che il problema sia che la vista è parzialmente oscurata mentre si sta animando, quindi l'avviso, ma non è possibile renderlo completamente visibile prima che l'animazione si concluda, ovviamente, a meno che non si voglia solo visualizzarlo sullo schermo, che è brutto.

Va bene, perché tornare all'animazione di stile "vecchio" utilizzando beginAnimations: e commitAnimations: ha eliminato gli avvisi per me. Sono curioso di sapere se questo avviso significa che stai perdendo le entrate pubblicitarie o se è solo fastidioso, ma in realtà non è un problema.

0

ho avuto il codice come questo:

if (animate) 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.adBannerView.frame = adBannerFrame; 
     self.otherViewFrame.frame = otherViewFrame; 
     } 
    ]; 
} 
else 
{ 
    self.adBannerView.frame = adBannerFrame; 
    self.otherViewFrame.frame = otherViewFrame; 
} 

e dopo alcuni esperimenti, ho scoperto che l'ordine delle inizializzazioni dovrebbe essere invertito in entrambi se e gambe altro.

self.otherViewFrame.frame = otherViewFrame; 
    self.adBannerView.frame = adBannerFrame; 

Quindi l'idea era di non lasciare che un'altra vista copra AdBannerView, anche per pochi microsecondi.

Problemi correlati