app启动页广告思路

最近又有做了个app启动页广告功能 虽然市面上n多的demo和方案 但我还是决定把我的也拿出来分享给大家, 因为我看了几个demo都或多或少在我的项目中有些问题。

1、广告页是设置在window的rootViewController上

2、广告页加在了系统的keywindow上

3、没有考虑特殊场景打开app时不需要显示广告页的情况

基于以上问题 我先来说说我自己的实现思路:

同样是通过后台接口配置来获取是否显示广告页已经具体的广告页图片Image,在app启动的时候调用接口请求

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

//检测数据是否有更新
[[DDAdHepler sharedManager] requestAdData];

[self checkLogin];

return YES;

}

我为什么要在注释的地方写的是 //检测数据是否有更新 因为这里确实还做了检查是否有更新的判断,因为总不能每次启动都重新下载广告图吧 具体如下:

- (void)requestAdData{
//[xxx requestAdData:[self phoneModel] callBack:^(BOOL success, id responseObject, NSError *error) {
        //读取服务器返回的JSON数据
        NSDictionary *new_json = nil;//responseObject[@"data"][@"loadPage"];
        NSString *ts = new_json[@"lastUpdateTime"];
        //读取之前保存过的JSON数据
        NSDictionary *dictionary = [self readAdJson];
        NSString *last_ts = dictionary[@"lastUpdateTime"];

        //如果最后的更新时间不同 就以服务端新返回的为准 覆盖本地的
        if(![last_ts isEqualToString:ts]){
            [self saveAdJson:new_json];
        }
 // }];
}

仔细看,实现的逻辑就是有一个lastUpdateTime标志。在请求完以后判断本地的json跟新请求的数据里关于lastUpdateTime这个标志是否被更新。只有新数据里的lastUpdateTime标志被更新才更新本地json已经重新下载广告图。

保存json到本地沙盒的方法

- (void)saveAdJson:(NSDictionary *)AdJson{
    //本地应用更新成功,字典转json, 将最新的字典信息写入沙盒
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:AdJson options:NSJSONWritingPrettyPrinted error:nil];
    BOOL saveOk = [jsonData writeToFile:[self AdJsonPath] atomically:YES];
    if(saveOk){
        [self saveAdImage:AdJson[@"picture"][@"url"]];
    }
}

下载广告图并保存到本地沙盒的方法

// 保存图片
- (void)saveAdImage:(NSString *)image_url{
    __block NSInteger retryCount = 0;
    __weak typeof(self) weak_self = self;
    self.downLoadFinishBlock = ^(BOOL success) {
        if(!success){
            retryCount ++;
            if(retryCount <= 3){
                [weak_self downLoadAdImage:image_url finishHandler:weak_self.downLoadFinishBlock];
            }
     }
    };

    [self downLoadAdImage:image_url finishHandler:self.downLoadFinishBlock];
}

#pragma mark - 下载图片
// 下载图片
- (void)downLoadAdImage:(NSString *)url finishHandler:(void(^)(BOOL success))finish{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSString *AdImageDirPath = [self AdImageDirPath];
        NSFileManager *fileManager = [NSFileManager defaultManager];

        if(![fileManager fileExistsAtPath:AdImageDirPath]){
            [fileManager createDirectoryAtPath:AdImageDirPath withIntermediateDirectories:YES attributes:nil error:nil];
        }

        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
        if(data){
            [data writeToFile:AdImageDirPath atomically:YES];
        }else{
            if(finish) finish(NO);
        }
    });
}

这里有个小小的逻辑是做了个3此重试的机制,万一不小心没down下来呢。

以上是保存广告页的逻辑代码,接下来就看看如何读取这个图片 他有什么逻辑?

细心的同学应该发现了 在app启动哪里我写了个 [self checkLogin]的方法调用。没错 这里就是要检测显示的逻辑开始。

@implementation AppDelegate (Login)

- (void)checkLogin{
    BOOL showGuidePage = [[NSUserDefaults standardUserDefaults] boolForKey:kShowGuidePage];
    ViewController *viewController = [ViewController instanceFromXib];
    if(!showGuidePage){
        GuidePageViewController *ctrl = [GuidePageViewController instanceFromXib];
        ctrl.StartAppBlock = ^(NSDictionary *dictionary) {
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kShowGuidePage];
            self.window.rootViewController = viewController;
        };
        self.window.rootViewController = ctrl;
    }else{

    //if(判断用户已登录){
        self.window.rootViewController = viewController;
        [self showAdvertisingPage];
    /* }else{
        //这里执行登录的操作 那么就会出现登录的回调
    }
    */
    }
}

看见没?你看清楚没? 我是写在了一个AppDelegate的分类里面 [self showAdvertisingPage] 这个方法调用才是真正的显示广告页。

- (void)showAdvertisingPage{

    if(!self.hiddleAd && DDAdHepler.sharedManager.showAdImage) {

        UIWindow *testWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        DDStartAdPageCtrl *VC= [[DDStartAdPageCtrl alloc] init];
        __weak typeof(VC) weakSelf = VC;
        VC.adPageSkipBlock = ^{
            [weakSelf.view removeFromSuperview];
            self.AdWindow.hidden = YES;
            self.AdWindow = nil;
        };
        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        self.AdWindow = testWindow;
        testWindow.windowLevel = UIWindowLevelAlert;
        testWindow.rootViewController = VC;
        [testWindow makeKeyAndVisible];
        [window makeKeyWindow];
    }
}

看了的人会疑惑 self.hiddleAd?? DDAdHepler.sharedManager.showAdImage??什么鬼? 不要着急,慢慢给你道来。

这两个条件是用来判断是否显示广告页的: self.hiddleAd是用于外部条件下不显示广告页的设置,比如说你是通过推送打开app的,这个时候就可以通过此参数来控制是否要显示广告页。 DDAdHepler.sharedManager.showAdImage是广告页内部本身是否显示的条件 比如说要在某个活动时间内才显示这个广告页。

看着看着 诶 self.AdWindow?又是个什么鬼。 这是我在AppDelegate设置的一个属性,为了能够全局持有自己new的testWindow。这里就说下为什么要自己新new一个window,而不是加载keywindow的原因: 在我们的项目中,打开app的时候 还有一些其他的业务需要强弹窗,这个弹窗也是加在keywindow上的。并且业务弹窗是在广告页之后,这样就会出现一个尴尬的情况,广告页之上扶着一个业务的弹窗。 所以在此自己新new一个window并且他的windowLevel设置成UIWindowLevelAlert就解决这个问题。 你试了了嘛?

还有第一个问题,为什么不直接设置window的rootViewController 你这样设置了 在切换到工程的主界面 又得重新请求主页面需要展示的所以数据,这在时间上多少有点浪费。 如果能加载window上,既展示了广告,与此同时又请求了数据,两全其美。

以上就是我的实现思路。如有不当之处,还请不吝赐教! 拜谢!!

以下是代码地址:
https://github.com/doudoudie/DDStartAdPage

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359

推荐阅读更多精彩内容