美文网首页iOS Developer
iOS开发 如何将ADMob的插屏广告做成开屏广告

iOS开发 如何将ADMob的插屏广告做成开屏广告

作者: 嫌疑人zx | 来源:发表于2017-08-05 10:08 被阅读2636次

需求:需要在用户进入应用时,弹出全屏广告,并且使用ADMob。
问题:现在的问题是ADMob并没有开屏广告,只有插屏广告,如果等用户进入界面 后再弹出插屏广告,在谷歌眼里,无意间弹出广告是违规的!
方案:将插屏广告做成开屏广告
参考《iOS-优雅的插入开屏广告》-- 不改动任何一行代码

一.创建一个对象和工程名同名
创建对象.png
二.贴代码,备注很详细
XYRPlayer.h
#import <UIKit/UIKit.h>

@interface XYRPlayer : NSObject

@end
XYRPlayer.m
#import "XYRPlayer.h"
#import <GoogleMobileAds/GADInterstitialDelegate.h>

@import GoogleMobileAds;
@interface XYRPlayer()<GADInterstitialDelegate>{
    
    UIViewController *AdViewController;
}

@property (nonatomic, strong) UIWindow* window;

@property(nonatomic, strong) GADInterstitial *interstitial;

@end

@implementation XYRPlayer

//在load 方法中,启动监听,可以做到无注入
+ (void)load{
    [self shareInstance];
}

+ (instancetype)shareInstance{
    static id instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

- (instancetype)init{
    self = [super init];
    if (self) {
        
        ///如果是没啥经验的开发,请不要在初始化的代码里面做别的事,防止对主线程的卡顿,和 其他情况
        ///应用启动, 首次开屏广告
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            ///要等DidFinished方法结束后才能初始化UIWindow,不然会检测是否有rootViewController
            [self show];
            [self CheakAd];
        }];
        ///进入后台
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            
        }];
        ///后台启动,二次开屏广告
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            [self show];
            [self CheakAd];
        }];
    }
    return self;
}



-(void)CheakAd{//这一部分的逻辑大家根据自身需求定制
    //谷歌插屏广告
    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"adshow"] intValue]!=0) {//后台控制是否显示广告
        if([[NSUserDefaults standardUserDefaults] objectForKey:@"admob_pid_chaping"]!=nil){//是否从后台获取到pid
            if(![[NSUserDefaults standardUserDefaults] boolForKey:@"VIPUser"]){//是否是工作人员,工作人员免广告
                NSArray *chapingArr=[[NSUserDefaults standardUserDefaults] objectForKey:@"admob_pid_chaping"];
                self.interstitial = [[GADInterstitial alloc] initWithAdUnitID:chapingArr[0]];
                self.interstitial.delegate=self;
                GADRequest *request = [GADRequest request];
                [self.interstitial loadRequest:request];
            }else{
                [self hide];
            }
        }else{
            [self hide];
        }
    }else{
        [self hide];
    }
}

- (void)show{
    ///初始化一个Window, 做到对业务视图无干扰。
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    AdViewController=[UIViewController new];
    window.rootViewController = AdViewController;
    window.rootViewController.view.backgroundColor = [UIColor clearColor];
    window.rootViewController.view.userInteractionEnabled = NO;
    
    ///广告布局
    [self setupSubviews:window];
    
    ///设置为最顶层,防止 AlertView 等弹窗的覆盖
    window.windowLevel = UIWindowLevelStatusBar + 1;
    
    ///默认为YES,当你设置为NO时,这个Window就会显示了
    window.hidden = NO;
    window.alpha = 1;
    
    ///防止释放,显示完后  要手动设置为 nil
    self.window = window;
}

- (void)hide{
    ///来个渐显动画
    [UIView animateWithDuration:0.3 animations:^{
        self.window.alpha = 0;
    } completion:^(BOOL finished) {
        [self.window.subviews.copy enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [obj removeFromSuperview];
        }];
        self.window.hidden = YES;
        self.window = nil;
    }];
}

///初始化显示的视图, 可以挪到具
- (void)setupSubviews:(UIWindow*)window{
    ///随便写写
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:window.bounds];
    //和启动图一样,给用户造成错觉
    imageView.image = [UIImage imageNamed:@"ADImage.png"];
    imageView.contentMode=UIViewContentModeScaleAspectFill;
    
    [window addSubview:imageView];
}

#pragma mark -GADInterstitialDelegate
- (void)interstitialDidReceiveAd:(GADInterstitial *)ad{//接收到插屏广告
    [self.interstitial presentFromRootViewController:AdViewController];
}

- (void)interstitial:(GADInterstitial *)ad didFailToReceiveAdWithError:(GADRequestError *)error{//插屏广告请求失败
    [self hide];
}

/**********************/
- (void)interstitialWillPresentScreen:(GADInterstitial *)ad{
    //插屏广告即将开始
    NSLog(@"插屏广告即将开始");
}

- (void)interstitialDidFailToPresentScreen:(GADInterstitial *)ad{
    //插屏广告失败
    NSLog(@"插屏广告失败");
}

- (void)interstitialWillDismissScreen:(GADInterstitial *)ad{
    //插屏广告即将消失
    NSLog(@"插屏广告即将消失");
    [self hide];
}

- (void)interstitialDidDismissScreen:(GADInterstitial *)ad{
    //插屏广告已经消失
    NSLog(@"插屏广告已经消失");
}

- (void)interstitialWillLeaveApplication:(GADInterstitial *)ad{
    //插屏广告即将离开APP
    NSLog(@"插屏广告即将离开APP");
}

@end
三.其他注意事项

1.一般第一次启动都无法请求到广告。

2.你需要特别注意didFinishLaunchingWithOptions里配置好谷歌广告,不然没法正常显示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //设置tabBar的字体颜色
    [self setTabBarItemFontColor];

    //请求数据
    [self loadUserData];
    
    //配置
    [self Configuration];
    
    //谷歌广告
    [self loadGoogleAd];
    
    //网络监控
    [self netWorkChangeEvent];
    
    return YES;
}

-(void)loadGoogleAd{
    // Use Firebase library to configure APIs
    [FIRApp configure];
    // Initialize Google Mobile Ads SDK
    [GADMobileAds configureWithApplicationID:@"你的admob_appid"];
}

3.CheakAd这个方法大家最好不要用,有点误导你们了,这个是我自己的需求,你们用的时候最好把这个函数删掉!不然会出现广告闪一下就消失的问题,我自己是在其他地方做了处理的,这个地方没有贴出来!

4.如果你看见的效果是先进入根视图,再出现广告,那很有可能是你少了一张伪装的启动图,就是把最大的启动图重新命名成ADImage.png,并且拖入工程中,不是放在LaunchImage中哦!(名字也不一定叫ADImage啦,你随意,但是代码里面的名字也要记得改!)

相关文章

  • iOS开发 如何将ADMob的插屏广告做成开屏广告

    需求:需要在用户进入应用时,弹出全屏广告,并且使用ADMob。问题:现在的问题是ADMob并没有开屏广告,只有插屏...

  • iOS Admob 开屏广告

    乍眼一看,google的admob里似乎找不到开屏广告的相关内容,但实际上藏在了英文文档里面。 在SDK加载完毕后...

  • 广告执行说明文档

    1.广告的类型 广告类型分为:开屏,插屏,模板,视频,自渲染 5大类。 开屏:每次进入应用,或从后台返回至应用时...

  • Google Admob 最新广告接入(一)(开屏广告)

    记录日常工作学习记录--Google Admob 广告接入(开屏类广告接入)。 首先得 注册并登陆[https:/...

  • Admob 开屏广告 AppOpenAd

    在八月份的时候,admob上架了开屏广告,这个广告样式在国内一些sdk已经是常见了,但对于我们一些个人开发者,没有...

  • iOS启动图和开屏广告图,类似网易

    iOS启动图和开屏广告图,类似网易 iOS启动图和开屏广告图,类似网易

  • XHLaunchAd

    iOS开屏广告解决方案开屏广告、启动广告解决方案-支持静态/动态图片广告/mp4视频广告代码地址:

  • 如何提高APP开屏广告的展示次数

    开屏广告位是APP上最常见的广告位,每个应用都可以开发出开屏广告位,第三方广告SDK也都支持开屏广告。开屏广告的点...

  • 如何正确使用A/B测试提升广告收入

    01 测试插屏/开屏广告不同国家展示频率 目标:增加收益同时不影响用户体验 判断指标:核心指标广告收入,辅助指标留...

  • 天意文档

    一、广告配置 1、初始化 2、api 误点击 二、使用: 1、开屏 2、插屏 3、信息流 1、无预加载信息流广告示...

网友评论

    本文标题:iOS开发 如何将ADMob的插屏广告做成开屏广告

    本文链接:https://www.haomeiwen.com/subject/ynjilxtx.html