2014-11-19 12 views
5

ich einige seltsame Verhalten in beiden ios7 erleben und 8 ..Strange Behaviour mit iAd Interstitial

Was manchmal das Vollbild passiert ist, ist mit einem X dargestellt (POTRAIT größer anzeigen AD - meine App Landschaft ist nur). Sie klicken auf das X und Sie können zurück zu meinem Menü gehen.

Aber manchmal wird eine Anzeige ohne ein X (LANDSCAPE FullSCREEN AD) angezeigt. Wenn Sie warten, wird DiDFinish Delegat NIE aufgerufen. Also versuche ich es zu klicken, um wegzugehen. Es zeigt dann eine andere Anzeige mit einem X (LANDSCAPE FULLSCREEN AD). Also klicke ich auf das X. Es geht dann zu einer anderen Anzeige (LANDSCAPE FULLSCREEN AD) wo DiDFinish aufgerufen wird. iOS7 wird bei dieser dritten Anzeige einfach eingefroren. ios8 es wird die dritte Anzeige für eine Sekunde zeigen, dann auf einen schwarzen Bildschirm gehen? Hat sich jemand mit so etwas beschäftigt?

Nicht sicher, wenn die erste Anzeige im Hochformat zeigt, funktioniert es gut, ist ein Hinweis oder nicht?

Auch die mehrere Anzeigen zeigen alle iAd nicht rev mob und iAd kombiniert, da ich 100 Prozent Füllrate für iAd haben. zur Zeit im nur versuchen iAds Vollbild-Anzeigen arbeiten konsequent

Ich weiß, dass die Delegierten festgelegt werden als didLoad Delegat aufgerufen wird, wenn die Anzeige Lasten Auch dies ist ein Problem sowohl für iPhone und iPad

zu erhalten Hat jemand anderes diese Probleme?

Mit ..

[interstitial presentFromViewController:self]; 

statt ..

[interstitial presentInView:self.view]; 

macht alle Arbeit properly..but presentFromViewController: veraltet ist jetzt

enter image description here

Hier ist mein Code I Verwenden Sie ...

-(void)showFullScreenAd { 
    //Check if already requesting ad 
    if (requestingAd == NO) { 
     //[ADInterstitialAd release]; 
     interstitial = [[ADInterstitialAd alloc] init]; 
     interstitial.delegate = self; 
     self.interstitialPresentationPolicy = ADInterstitialPresentationPolicyManual; 
     [self requestInterstitialAdPresentation]; 
     NSLog(@"interstitialAdREQUEST"); 
     requestingAd = YES; 
    } 
} 

-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error { 
    interstitial = nil; 
    requestingAd = NO; 
    NSLog(@"interstitialAd didFailWithERROR"); 
    NSLog(@"%@", error); 

    [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) { 
     [fs showAd]; 
     NSLog(@"Ad loaded"); 
    } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) { 
     NSLog(@"Ad error: %@",error); 
    } onClickHandler:^{ 
     NSLog(@"Ad clicked"); 
    } onCloseHandler:^{ 
     NSLog(@"Ad closed"); 
    }]; 
} 

-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd { 
    NSLog(@"interstitialAdDidLOAD"); 
    if (interstitialAd != nil && interstitial != nil && requestingAd == YES) { 
     [interstitial presentInView:self.view]; 
     NSLog(@"interstitialAdDidPRESENT"); 
    }//end if 
} 

-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd { 
    interstitial = nil; 
    requestingAd = NO; 
    NSLog(@"interstitialAdDidUNLOAD"); 
} 

-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd { 
    interstitial = nil; 
    requestingAd = NO; 
    NSLog(@"interstitialAdDidFINISH"); 
} 

wenn jemand könnte nur dort Code schreiben, die vollständig in dort App funktionieren auch für mich, um zu versuchen +50 Ruf

Antwort

3

Kein Arbeitscode von meinem Ende verdienen, aber ich habe einen Blick in der Dokumentation hat und fand einen catergory für UIViewController mit iAd Methoden

Here

Es scheint, Sie alten Code mit neuem Code mischen.

Von dem, was ich gesehen habe, würde ich vorschlagen:

 -(void)showFullScreenAd { 
     //Check if already requesting ad 
     if (requestingAd == NO) { 
      [self requestInterstitialAdPresentation]; 
      requestingAd = YES; 
     } 
    } 

    -(void)viewDidLoad() 
{ 
    [super viewDidLoad]; 
// Any other setup. 
self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual 

} 

Dies folgt der neue iOS7 Umsetzung. Durch Festlegen der Richtlinie in der viewDidLoad-Methode kann das Framework Assets vorab zwischenspeichern und Anzeigen vom iAd-Server abrufen. Fertig, wenn die Methode "showFullScreenAd" aufgerufen wird, sollte eine Anzeige bereit sein.

Sie können auch eine Klassenmethode +(void)prepareInterstitialAds aufrufen, wenn Sie die Ansicht laden oder andere Datenaufgaben ausführen. Dadurch kann das Framework Assets vorab zwischenspeichern, was bedeuten kann, dass nachfolgende Anforderungen schneller sind.

Für die Verarbeitung von RevMob mit fehlgeschlagenen Anzeigen: [self requestInterstitialAdPresentation]; gibt einen booleschen Wert zurück, das bedeutet, dass Sie damit umgehen können, und sagen Sie, dass RevMob fehlgeschlagen ist usw. Wenn die Anzeige geschlossen wurde. Es kann am besten sein, einige KVO auf der presentingFullScreenAd Eigenschaft des ViewControllers zu machen. Was sagt, ob es einen FullScreenAd zeigt, ich glaube, das ist nur iAd, Full Ad's.

Der Grund, warum Sie so unterschiedliche Ergebnisse haben, ist, dass Sie zwei Möglichkeiten haben, Anzeigen innerhalb eines Viewcontrollers anzufordern und zu präsentieren.

Wenn die Anzeige Portrait präsentiert wird, konnte die [self requestInterstitialAdPresentation]; keine Anzeige abrufen, aber die Instanziierung der ADInterstitialAd-Instanz hat eine weitere Anforderung gesendet. Dies wurde geladen, da Sie keinen Rahmen für die Ansicht der Instanz festlegen. Es ist nicht bekannt, dass es sich um eine Landschaft handelt und daher wird eine Hochformatversion angezeigt. Da dies nun in der Ansicht dargestellt wird, weiß die Ansicht nicht, in welcher Ausrichtung sie sich befindet. Daher wird die Anzeigenansicht basierend auf ihrer Geometrie dargestellt.

Wenn es Landschaft ist, die bis zum [self requestInterstitialAdPresentation]; erfolgreich ist. Diese Top-Anzeige ist die Anzeige dieses Aufrufs. Ich bin nicht sicher, warum der Rest der Anzeigelandschaft der Anzeige, es sei denn, das ist etwas aus dem Framework, dh die [self requestInterstitialAdPresentation]; intern entscheidet, dass es vom ViewControllers-Layout aus querverteilt sein muss, damit alle nachfolgenden Anzeigenanfragen dazu passen, sofern sich die VC-Ausrichtung nicht erneut ändert.

[EDIT] - Ich habe ein grundlegendes Beispielstück zusammengewürfelt. Dies wurde aus Speicher/Dokumentation getan, wird also wahrscheinlich nicht 100% korrekt sein und wird höchstwahrscheinlich nicht von einem direkten Kopieren und Einfügen funktionieren. Dies ist eine Idee zu geben, die auch die Unterstützung für Versionen vor iOS7

//.h 

@import UIKit; 
@import iAd; 

@interface MyInterstitialViewController : UIViewController <ADInterstitialAdDelegate> 
{ 

} 
@property (strong) ADInterstitialAd *fullScreenAd; 

@end 

//.m 

#include MyInterstitialViewController.h 

@implementation MyInterstitialViewController 
{ 
    - (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 
    { 
     if(self = [super initWithNibName:nibName bundle:nibBundle]) 
     { 

     } 
     return self; 
    } 


    -(void)viewDidLoad() 
    { 
     [super viewDidLoad]; 

     if([self respondsToSelector:@selector(requestInterstitialAdPresentation)] == YES) 
     { 
      self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual; 
     } 
    } 

    -(void)viewWillDisappear 
    { 
     @try 
     { 
        **[self removeObserver:self forKeyPath:@"isPresentingFullScreenAd"];** 
       } 
       @catch (NSException * __unused exception) 
     { 
     } 
    } 

    -(void)showFullScreenAd() 
    { 
     if([self respondsToSelector:@selector(requestInterstitialAdPresentation)] == NO) 
     { 
      self.fullScreenAd = [[ADInterstitialAd alloc] init]; 
      self.fullScreenAd.delegate = self; 
     } 
     else 
     { 
      if([self requestInterstitialAdPresentation] == NO) 
      { 
       //Report back to RevMob Controller that the Ad Failed. 
       [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) 
       { 
        [fs showAd]; 
        NSLog(@"Ad loaded"); 
       } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) 
       { 
        NSLog(@"Ad error: %@",error); 
       } onClickHandler:^{ 
        NSLog(@"Ad clicked"); 
       } onCloseHandler:^{ 
        NSLog(@"Ad closed"); 
       }]; 
      } 
      else 
      { 
       **[self addObserver:self forKeyPath:@"isPresentingFullScreenAd" options:NSKeyValueObservingOptions.NSKeyValueObservingOptionNew context:nil];** 
      } 
     } 
    } 

//ADInterstitialAd Delegate Methods. 
-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error 
{ 
    interstitial = nil; 
    NSLog(@"interstitialAd didFailWithERROR"); 
    NSLog(@"%@", error); 
    [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) 
     { 
      [fs showAd]; 
      NSLog(@"Ad loaded"); 
     } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) 
     { 
      NSLog(@"Ad error: %@",error); 
     } onClickHandler:^{ 
      NSLog(@"Ad clicked"); 
     } onCloseHandler:^{ 
      NSLog(@"Ad closed"); 
     }]; 
} 
-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd 
{ 
    NSLog(@"interstitialAdDidLOAD"); 
    if (self.fullScreenAd != nil) 
    { 
        CGRect interstitialFrame = self.view.bounds; 
interstitialFrame.origin = self.view.origin; 
UIView *view = [[UIView alloc] initWithFrame:interstitialFrame]; 
[self.view addSubview:view]; 
[self.fullScreenAd presentInView:view]; 


     NSLog(@"interstitialAdDidPRESENT"); 
    }//end if 
} 
-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd 
{ 
    NSLog(@"interstitialAdDidUNLOAD"); 
} 
-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd 
{ 
    NSLog(@"interstitialAdDidFINISH"); 
} 


//KVO Responding 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    **if([keyPath isEqualTo:"isPresentingFullScreenAd"] == YES) 
    { 
     if([object === self]) 
     { 
      if([self isPresentingFullScreenAd] == false) 
      { 
      //Handle logic for your app. New Screen etc. 
      } 
      else 
      { 
      //Handle logic for your app. Pause current activity etc. 
      } 
     } 
    }** 
} 

} 

als Referenz enthält.

Die Änderungen Ich habe ermöglichen den Ad-Framework gemacht zu arbeiten, wie Sie es auf allen Versionen von iOS von 4,3 erwarten - 8.X

Von iOS 4.3 - 6.X die allgemeinen Strömung war:

Erstellen Sie eine Anzeige, legen Sie ihre Delegate, präsentieren und behandeln in den Delegate-Methoden.

Von 7. - 8.X (Die bisherigen Art in einem UIViewController der Präsentation in iOS veraltet wurde 7, aber deprecation bisherige Verfahren bedeutet, arbeiten bis zum Release im nächsten X.0, in der Regel.)

Für diesen Fall, dass Sie das Framework nach einer Anzeige über die [UIViewController requestInterstitialAdPresentation] fragen; Methode. Der Controller wird eine Ansicht erstellen und präsentieren, wenn es eine Anzeige hat. Sie erhalten nicht die Delegatmethoden mehr, die "- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) Objekt Änderung: (NSDictionary *) Änderung Kontext: (void *) Kontext"

Mit dieser Methode können Sie den Delegatanruf im Wesentlichen erhalten, wenn die Anzeige nicht mehr angezeigt wird, damit Sie mit der Logik Ihrer App fortfahren können. Im Wesentlichen der "AdDidFinish" Delegiertenanruf. Da wir jedoch den Beobachter nicht entfernen, bis der Controller entladen ist, muss eine Logik verarbeitet werden, wenn eine neue Anzeige angezeigt wurde.

Dies bedeutet, dass die Logik für Ihre VC nicht überprüfen muss, ob sie die ganze Zeit eine Vollbildanzeige präsentiert.

Sie können weiterhin den Flow von iOS 4.3 - 6.X verwenden, aber die presentInView-Methode verwenden.Wie im iAd-Programmierleitfaden beschrieben, sollte dies verwendet werden, wenn Sie eine Inhaltsansicht haben. Was ich dargelegt habe, ist eine "Übergangsanzeige" -Methodik.

+0

habe alle Fehler außer dieser Zeile behoben .. [object displayingBannerAd] sagt keine bekannte Instanz Methode für Selektor – 4GetFullOf

+0

Sorry, Sie müssen es so vor der Zeile wie ADIntersitualAd * ad = (ADInterstitualAd *) Objekt dann ändern die Methode im if to [ad displayingBannerAd]; –

+0

gleichen Fehler ..- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) Objekt Änderung: (NSDictionary *) Änderung Kontext: (void *) Kontext { ADInterstitialAd * ad = (ADInterstitialAd *) Objekt; if ([keyPath isEqualToString: @ "displayingBannerAd"] == YES) { if ([ad displayingBannerAd] == false) { – 4GetFullOf