iOS启动页加载广告(带缓存)

接上一篇简单实现:https://www.jianshu.com/p/45796cf24ea4

这次要考虑的问题是:如果广告是动态获取的该如何处理?

1.先看需求:如果必须要等接口返回广告地址并下载完广告图片才能进入APP,那就只能在AppDelegate做请求的同步,阻塞主线程等广告加载完成显示后才执行后面的代码

弊端:一般都不会这么处理,必须要考虑到用户如果网络慢的情况下会一直停留在启动页

2.对图片做缓存:第一次进入APP只会下载远程广告图片在本地,下次启动再直接从缓存中读取,这样就可以排除掉网络因素

弊端:实时性不强,如果更换广告需要等到第二次启动才会展示

可以根据实际情况做选择,一般都考虑第二种,毕竟广告展示对用户来说不那么重要

下面就按第二种方案来实现:

#pragma mark 加载远程广告 
- (void)loadAD {
    //广告url
    NSString *adImageUrl = @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1486466389044&di=a7ab421bb82bd0d214bbdc5a6b79f2bf&imgtype=0&src=http%3A%2F%2Fpic.qiantucdn.com%2F58pic%2F17%2F80%2F57%2F94s58PICA7j_1024.jpg";
    
    //点击跳转地址
    NSString *adImagePushUrl = @"https://www.baidu.com/";
    
    SDWebImageManager *sdmanage = [SDWebImageManager sharedManager];
    NSURL *adUrl = [NSURL URLWithString:adImageUrl];
    
    //url是否已被缓存
    if ([sdmanage diskImageExistsForURL:adUrl]) {
        UIImage *startADImage = [sdmanage.imageCache imageFromDiskCacheForKey:adImageUrl];
        if (startADImage) {
            //自定义广告ImageView
            ADImageView *launch = [[ADImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
            launch.image = startADImage;
            //广告点击跳转
            launch.adPicTapClick = ^{
                //这里是跳转逻辑
            };
            //设置window层级
            [self.window addSubview:launch];
        }
    }
    else {
        //异步下载并缓存以供下次直接读取
        [[SDWebImageManager sharedManager] downloadImageWithURL:adUrl options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {}];
    }
}

这里结合SDWebImage库完成图片的缓存

最终效果:

未命名.gif

github完整Demo:
https://github.com/sg369326973/LoadADDemo

你可能感兴趣的:(iOS启动页加载广告(带缓存))