iOS启动广告设计与实现

作者: zaijianbali | 来源:发表于2017-06-05 19:53 被阅读120次

    购物类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

    本文解释权归:子文

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

    来杯可乐催更吧

    请子文喝可乐

    相关文章

      网友评论

        本文标题:iOS启动广告设计与实现

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