我没有工作代码,但我查看了文档并找到了具有 iAd 方法的 UIViewController 的分类
Here
您似乎正在将旧代码与新代码混合在一起。
根据我所见,我会建议:
-(void)showFullScreenAd {
//Check if already requesting ad
if (requestingAd == NO) {
[self requestInterstitialAdPresentation];
requestingAd = YES;
}
}
-(void)viewDidLoad()
{
[super viewDidLoad];
// Any other setup.
self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual
}
这遵循新的 iOS7 实现。在 viewDidLoad 方法中设置策略允许框架预先缓存资产并开始从 iAd 服务器获取任何广告。准备好了,所以当调用“showFullScreenAd”方法时,广告应该准备好了。
您也可以在加载视图或执行其他数据任务时调用类方法+(void)prepareInterstitialAds,这可以让框架在可能的情况下预先缓存资产,这意味着后续请求会更快。
对于广告失败的 RevMob 处理:[self requestInterstitialAdPresentation]; 返回一个布尔值,这意味着您可以处理它并告诉 RevMob 它失败了,等等。对于广告何时关闭。最好在 ViewController 的 presentingFullScreenAd 属性上做一些 KVO。其中说明是否显示的是FullScreenAd,我相信这只是iAd,Full Ad的。
您得到如此不同结果的原因是因为您在同一个视图控制器中有两种请求和展示广告的方式。
当广告呈现肖像时,[self requestInterstitialAdPresentation]; 未能检索到广告,但 ADInterstitialAd 实例的实例化已发送另一个请求。这已加载,因为您没有为实例的视图设置框架,它不知道它是横向的,因此呈现纵向版本。由于这现在显示在视图中,因此视图不知道/不在乎它的方向,因此根据其几何形状呈现广告视图。
当它是景观时,[self requestInterstitialAdPresentation]; 成功。该顶部广告是来自此通话的广告。我不确定为什么广告的其余部分显示环境,除非那是来自框架的东西,即 [self requestInterstitialAdPresentation];内部决定它必须是 ViewControllers 布局中的横向,因此所有后续广告请求都适合此,除非 VC 方向再次更改。
[编辑] - 我整理了一个基本的示例片段。这是从内存/文档中完成的,因此可能不会 100% 正确,并且很可能无法通过直接复制和粘贴来工作。这是给出一个想法,其中还包括对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.
}
}
}**
}
}
供参考。
我所做的更改允许广告框架在 4.3 - 8.X 的所有 iOS 版本上正常工作
从 iOS 4.3 - 6.X 开始,一般流程是:
创建一个广告,设置它的委托,在委托方法中呈现和处理。
从 7 到 8.X(以前在 UIViewController 中呈现的方式在 iOS 7 中已弃用,但弃用意味着以前的方法通常在下一个 X.0 版本之前有效。)
对于这种情况,您通过 [UIViewController requestInterstitialAdPresentation] 向框架请求广告;方法。如果有广告,控制器将创建一个视图并展示它。您不再获得委托方法,
"- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id) 对象
改变:(NSDictionary *)改变
上下文:(void *)context"
该方法允许您在广告完成显示时获得委托调用,以便您可以继续应用程序的逻辑。本质上是“AdDidFinish”委托调用。但由于在卸载 Controller 之前我们不会移除观察者,因此如果显示了新广告,则需要处理逻辑。
这意味着您的 VC 的逻辑不必检查它是否一直在展示全屏广告。
您仍然可以使用 iOS 4.3 - 6.X 中的流程,但使用 presentInView 方法。正如 iAd 编程指南中所述,如果您在内部有内容视图,则应使用此方法,我提出的是“过渡广告”方法。