需求

很多app(如淘宝、美团等)在启动图加载完毕后,还会显示几秒的广告,一般都有个跳过按钮可以跳过这个广告,有的app在点击广告页之后还会进入一个广告页面,点击返回进入首页。虽然说这个广告页面对用户体验来说并不是很好,但是如果真的有这个需求,我们还是要想办法去开发,至少这比内嵌广告要友善的多。今天我们就来开发一个广告页面,效果如下。

效果图.gif

思路

1.广告页加载思路。广告页的内容要实时显示,在无网络状态或者网速缓慢的情况下不能延迟加载,或者等到首页出现了再加载广告页。所以这里我不采用网络请求广告接口获取图片地址,然后加载图片的方式,而是先将图片异步下载到本地,并保存图片名,每次打开app时先根据本地存储的图片名查找沙盒中是否存在该图片,如果存在,则显示广告页。

2.判断广告页面是否更新。无论本地是否存在广告图片,每次启动都需要重新调用广告接口,根据图片名称或者图片id等方法判断广告是否更新,如果获取的图片名称或者图片id跟本地存储的不一致,则需要重新下载新图片,并删除旧图片。

3.广告页点击。如果点击广告需要跳转广告详情页面,那么广告链接地址也需要用NSUserDefaults存储。注意:广告详情页面是从首页push进去的。

4.广告页的显示代码可以放在AppDeleate中,也可以放在首页的控制器中。如果代码是在AppDelegate中,可以通过发送通知的方式,让首页push到广告详情页。

5.广告页面的底部和启动图的底部一般都是相同的,给我们的感觉就是启动图加载完之后把广告图放在了启动图上,而且不能有偏差,比如下图淘宝启动画面。美工在制作广告图的时候要注意这点。

淘宝启动.gif

6.研究了一下淘宝的广告显示机制,删除淘宝之后重新打开不会显示广告图片,第二次打开才会显示。美团的广告图有时候显示有时候不显示,所以后台在开发广告api的时候可以增加一个字段来判断是否启用广告,如果后台关闭了广告,将沙盒中的图片删除即可。

步骤

1.判断沙盒中是否存在广告图片,如果存在,直接显示

1
2
3
4
5
6
7
NSString *filePath = [self getFilePathWithImageName:[kUserDefaults valueForKey:adImageName]];
BOOL isExist = [self isFileExistWithFilePath:filePath];
if  (isExist) { // 图片存在
AdvertiseView *advertiseView = [[AdvertiseView alloc] initWithFrame:self.window.bounds];
advertiseView.filePath = filePath;
[advertiseView show];
}

2.无论沙盒中是否存在广告图片,都需要重新调用获取广告接口,判断广告是否更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@ "application/json" ,@ "text/html" , nil];
[manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
NSArray *dataArray = responseObject[@ "data" ];
NSString *imageUrl = dataArray[0][@ "imageUrl" ];
NSArray *stringArr = [imageUrl componentsSeparatedByString:@ "/" ];
NSString *imageName = stringArr.lastObject;
NSString *filePath = [self getFilePathWithImageName:imageName];
BOOL isExist = [self isFileExistWithFilePath:filePath];
if  (!isExist){ // 如果该图片不存在,则下载新图片,删除老图片
[self downloadAdImageWithUrl:imageUrl imageName:imageName];
}
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
}];

异步下载图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
*  下载新图片
*/
- (void)downloadAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
UIImage *image = [UIImage imageWithData:data];
NSString *filePath = [self getFilePathWithImageName:imageName];  // 保存文件的名称
if  ([UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES]) { // 保存成功
NSLog(@ "保存成功" );
[self deleteOldImage]; // 保存成功后删除旧图片
[kUserDefaults setValue:imageName forKey:adImageName];
[kUserDefaults synchronize];
// 如果有广告链接,需要将广告链接也保存下来
} else {
NSLog(@ "保存失败" );
}
});
}
/**
*  删除旧图片
*/
- (void)deleteOldImage
{
NSString *imageName = [kUserDefaults valueForKey:adImageName];
if  (imageName) {
NSString *filePath = [self getFilePathWithImageName:imageName];
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:filePath error:nil];
}
}

3.广告页面的跳过按钮倒计时功能可以通过定时器或者GCD实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// GCD倒计时
- (void)startCoundown
{
__block int timeout = showtime + 1;  //倒计时时间 + 1
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0 * NSEC_PER_SEC, 0);  //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if (timeout <= 0){  //倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[self dismiss];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[_countBtn setTitle:[NSString stringWithFormat:@ "跳过%d" ,timeout] forState:UIControlStateNormal];
});
timeout--;
}
});
dispatch_resume(_timer);
}

4.为广告页面添加一个点击手势,跳转到广告页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//AdvertiseView.m
- (void)pushToAd{
[self dismiss];
[[NSNotificationCenter defaultCenter] postNotificationName:@ "pushtoad"  object:nil userInfo:nil];
}
// ViewController.m
- (void)viewDidLoad {
[ super  viewDidLoad];
self.title = @ "首页" ;
self.view.backgroundColor = [UIColor orangeColor];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushToAd) name:@ "pushtoad"  object:nil];
}
- (void)pushToAd {
AdvertiseViewController *adVc = [[AdvertiseViewController alloc] init];
[self.navigationController pushViewController:adVc animated:YES];
}

完整代码下载地址

http://download.csdn.net/detail/hbblzjy/9564652

推荐文章:http://www.jianshu.com/p/e52806516139

关于App启动加载广告页面思路相关推荐

  1. ios App启动加载广告页面思路

    需求 很多app(如淘宝.美团等)在启动图加载完毕后,还会显示几秒的广告,一般都有个跳过按钮可以跳过这个广告,有的app在点击广告页之后还会进入一个广告页面,点击返回进入首页.虽然说这个广告页面对用户 ...

  2. app中加载h5页面白屏问题

    一.问题描述:通过原生检查日志在网络不好的情况下,由于vue打包后的第三方js包加载失败导致h5页面白屏. 二.解决方案: 1.减少第三方依赖:在package.json中把不需要的包删除. 2.组件 ...

  3. app启动页数秒加载 代码_干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)

    1. 常见痛点 App 自动化测试中有些常见痛点问题,如果框架不能很好的处理,就可能出现元素定位超时找不到的情况,自动化也就被打断终止了.很容易打消做自动化的热情,导致从入门到放弃.比如下面的两个问题 ...

  4. android自动化测试弹框,干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)...

    原标题:干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理) 1. 常见痛点 App 自动化测试中有些常见痛点问题,如果框架不能很好的处理,就可能出现元素定位超时找不到的情况,自动化也就 ...

  5. iOS-APP启动页加载广告

    概述 加载广告页, 展现跳过按钮实现倒计时功能, 并判断广告页面是否更新. 详细 代码下载:http://www.demodashi.com/demo/10698.html 目前市场上很多APP(如淘 ...

  6. [html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处?

    [html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处? <link rel="apple-touch-startup-image" href=&q ...

  7. google android广告异步加载,javascript 广告后加载,加载完页面再加载广告

    先加载完页面再加载广告的原理: 网页打开的顺序都是按页面从上到下的顺序加载完成的,所以要想使广告不影响页面打开速度,就要等页面全部打开完成后,再加载JS代码.等页面加载完再加载广告其实就是将广告的 J ...

  8. android 广告效果图,Android_Android实现加载广告图片和倒计时的开屏布局,这是一个android开屏布局的实例 - phpStudy...

    Android实现加载广告图片和倒计时的开屏布局 这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比 ...

  9. webview 加载php页面内容,WebView加载优化的方法介绍

    本篇文章给大家带来的内容是关于WebView加载优化的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. WebView加载优化 当WebView的使用频率变得频繁的时候,对于其 ...

最新文章

  1. Linux下redis的安装(适用centos)
  2. 亚马逊63岁「老司机」困在算法里,工作4年却因机器评分太低被开除!
  3. HTTP2 基础知识点总结
  4. day04_07-三个函数的区别
  5. 第三章 PLSQL Developer 安装前oracleclient客户端的配置,在用plsql 连接oracle服务器
  6. 《数据中台实战》:如何通过标签平台圈出产品高价值用户?
  7. [转]理解ThreadLocal
  8. CLion设置背景图片(Pycharm等)
  9. Aspose.Total 企业案例:MiniTool 使用 Aspose.Total API 将文档预览、渲染和转换为 TIFF、PDF 等格式
  10. Python网络之数据库
  11. Ubuntu下编译pcsx2要用到的包
  12. 深入理解多线程(四)—— Moniter的实现原理
  13. php 8进制,PHP中的进制转换
  14. DDR布局布线规则与过程
  15. 嵌入式C语言自我修养——从芯片、编译器到操作系统
  16. 安徽事业单位考试计算机基本知识,2017安徽事业单位考试备考资料:计算机知识(计算机操作系统)...
  17. linux cs go鼠标灵敏度,CSGO鼠标调试方法 选择适合自己的鼠标速度
  18. M103: Basic Cluster Administration chapter 0 Introduction学习记录
  19. dma-buf 由浅入深(二) —— kmap / vmap
  20. 成为SaaS运维工程师:Django学习_制作微博网页

热门文章

  1. 海思Hi3516EV300开发板防雷防静电图
  2. 【转】无线路由器信道怎么设置
  3. 主板和显示器对于游戏建模的重要性,还不知道,就被别人超了!
  4. 工厂数字孪生模型制作软件
  5. 【圆舞曲之数】CSP题目 C++实现
  6. Java 数组常用方法大全
  7. 苹果笔记本无线网无法连接服务器,电脑老是连不上无线网咋回事
  8. WEB前端 -- JavaScript获取cookie
  9. 在控制台使用js获取cookie信息
  10. 牛批牛批!GitHub开源仿抖音国际版,火爆全网!