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.
habe alle Fehler außer dieser Zeile behoben .. [object displayingBannerAd] sagt keine bekannte Instanz Methode für Selektor – 4GetFullOf
Sorry, Sie müssen es so vor der Zeile wie ADIntersitualAd * ad = (ADInterstitualAd *) Objekt dann ändern die Methode im if to [ad displayingBannerAd]; –
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