iOS学霸笔记程序员牛叉的demo

iOS启动广告设计与实现

2017-06-05  本文已影响120人  zaijianbali

购物类app、微博、手机百度 打开app的时候经常会出现启动广告。

我们一一解答这些问题:

首先:启动广告的 图片来源?

这个来源是本地已经缓存下来的,不然使用默认的图片了,也就是说图片要提前下载,用于下次启动使用,这点要确认。

其次,啥时候更新呢?

不可能打开应用就更新。因为打开应用的前3到5s是宝贵的,所以不可能在这段时间更新,那这个更新可以延后到5
~10s左右更新。这样就避免的流量峰值,提高了用户体验。

图层的展示问题:

我们是在window上加了一层

  [[[[UIApplication sharedApplication] delegate] window] addSubview:self];
    [[[[UIApplication sharedApplication] delegate] window] bringSubviewToFront:self];
    [[UIApplication sharedApplication].keyWindow addSubview:self];
    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:self];
    [UIView animateWithDuration:0.5f animations:^{
        _bgImageView.alpha = 1.0f;
    }];

其次这个要模块化,单独处理,只需要留调用接口就可以。

还有就是计时的和动画的关系,我们开启动画的时候,对广告点击和计时按钮点击事件都有回调;


/**
 * 启动广告图的url,,必须设置,不然不启动
 */
@property (nonatomic, copy) NSString *imageUrl;

/**
 * 启动广告显示的时间,,可以不设置,默认3s
 */
@property (nonatomic, assign) NSUInteger time;

/**
 * 启动广告图的点击回调,跳转到广告页,
 */
@property (nonatomic, copy) ImageClickAction imageClickAction;//带参数
/**
 * 启动广告图的跳过回调,可以做一些额外的数据处理
 */
@property (nonatomic, copy) AdsJumpClickAction adsJumpClickAction;
/**
 * 启动广告图的正常进行,可以做一些额外的数据处理
 */
@property (nonatomic, copy) AdsCompletion adsCompletion;


- (BOOL)startShowAds;

以上是View的接口

调用如下,回调可以不写,但建议写上。

+ (void)shouldLoadAds
{
    //加载广告逻辑,
    if ([[[NSUserDefaults standardUserDefaults] stringForKey:ADVIERTISEMENT_DOWNLOAD_KEY] isEqualToString:@"1"])
    {
        ZWAdsModel *adsModel = [self adsStartImageUrl];

        NSString *imageUrl = adsModel.imageUrl;
        if (imageUrl)
        {
            ZWAdsStartView *adsStartView = [[ZWAdsStartView alloc] init];

            adsStartView.imageUrl = imageUrl;
            adsStartView.time = 5;
            adsStartView.adsCompletion = ^(){
                NSLog(@"adsCompletion");
            };

            adsStartView.imageClickAction = ^{
                ZWAdsViewController *VC = [[ZWAdsViewController alloc] init];
                VC.title = @"Ads Page";
                VC.pageUrl = adsModel.pageUrl;
                UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:VC];
                //    [navCtrl pushViewController:VC animated:YES];

                UIWindow *window = [UIApplication sharedApplication].keyWindow;
                [(UINavigationController *)window.rootViewController presentViewController:navCtrl animated:YES completion:nil];
            };
            adsStartView.adsJumpClickAction = ^(NSInteger timeInterval) {
                NSLog(@"adsJumpClickAction use time:%ld",timeInterval);
            };


            [adsStartView startShowAds];
        }
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            //下载图片,可以单独写,与view分开
            [self downloadStartImage];
        });
    }
    else // 第一次先下载广告
    {
        //下载图片
        [self downloadStartImage];
        [[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:ADVIERTISEMENT_DOWNLOAD_KEY];
    }
}

最后,入口在application: didFinishLaunchingWithOptions:需要在里面加入冷启动的判断,代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  
    ViewController *viewCtrl = [[ViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewCtrl];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
  
    
    //用户自己点击启动
    if(!launchOptions)
    {
        NSLog(@"用户点击app启动");
        //检测是否需要加载广告页,必须放在makeKeyAndVisiblev后面,否则不起作用
        [ZWAdsStartManager shouldLoadAds];
    }
    else
    {
        NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
        //app 通过urlscheme启动
        if (url) {
            NSLog(@"app 通过urlscheme启动 url = %@",url);
        }
        UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
        //通过本地通知启动
        if(localNotification)
        {
            NSLog(@"app 通过本地通知启动 localNotification = %@",localNotification);
        }
        NSDictionary *remoteCotificationDic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        //远程通知启动
        if(remoteCotificationDic)
        {
            NSLog(@"app 通过远程推送通知启动 remoteCotificationDic = %@",remoteCotificationDic);
        }
    }
  
    return YES;
}

做个小demo只是提供思路,具体应用需要做相应的修改,比如数据源,业务跳转等。

图片如下:


预览图

效果如下:
效果

Demo的github地址如下:
ZWAdsStart

本文解释权归:子文

如需转载请注明出处,谢谢

来杯可乐催更吧

请子文喝可乐
上一篇下一篇

猜你喜欢

热点阅读