现在很多APP在启动的时候都在加载广告,现在也很流行,主要是盈利啊。笔者也做了很多关于广告的事情。现在记录下自己在APP启动的时候,怎么加载广告的。

下面总结下广告加载的三种方式

1.现在很多APP的广告不是在程序启动的时候开始请求广告的,而是直接加载广告的图片链接。可以在程序启动完后给个特定的时间去请求广告,并缓存到数据库。广告平台也是建议这样做的,可以节省用户的打开程序的时间。但是这种方法是有缺点的,就是广告的时常,一般的广告的平台都是55分钟左右展示是有效的。(如果有自己的广告商,还是建议这样使用)
2.直接在启动的时候才开始去请求广告,并把广告加载出来,这个不用考虑广告的时常,但是要考虑APP的启动的时间,这样会有两个网络的请求,会比较耗时(笔者的APP也是这样的效果,我写的demo也是这样的效果)
3.在APP启动的时候直接加载广告的图片,图片是上次启动请求广告,并将广告保存到本地的(主要实用:自己有广告商)
先看下笔者的效果

Untitled.gif
其实这个上面笔者是直接present一个控制器来显示广告,当广告显示完成之后,直接dis掉的,只是把他的效果给自定义了
- (void)viewDidLoad {
[super viewDidLoad]; _imageView = [[UIImageView alloc]initWithFrame:self.view.bounds]; _imageView.image = [UIImage imageNamed:@"6"];
[self.view addSubview:_imageView]; UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, 50)];
label.text = @"七秒记忆鱼儿注,转注请署名七秒记忆的鱼儿";
label.textColor = [UIColor redColor];
label.textAlignment = NSTextAlignmentCenter; [self.view addSubview:label]; #warning 注意 必须盖住
[self.view bringSubviewToFront:_imageView];
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
OneViewController *one = [[OneViewController alloc]init];
one.myBlock = ^(BOOL isClick){
_isClick = isClick;
[_imageView removeFromSuperview];
_imageView = nil;
};
if (_isClick == NO) {
[self presentViewController:one animated:NO completion:nil];
} }
主要的操作还是实现了两个定时器来操作的,_waitRequestTimer是用来判定请求广告时间的,大于多少后直接就进入APP,_adsAccordingTimer这个定时器用来显示广告的,如果超出一定的时间加载广告也会进入APP
 - (void)viewDidLoad {
[super viewDidLoad];
self.transitioningDelegate = self;
_LaunchImage = [[UIImageView alloc]initWithFrame:self.view.bounds];
_LaunchImage.image = [UIImage imageNamed:@"6"];
[self.view addSubview:_LaunchImage];
[self requestAds];
_seconds = 6;
_waitRequestTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(Waiting) userInfo:nil repeats:YES];
}
-(void)requestAds
{
// 模拟网络请求
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self addUI];
[_waitRequestTimer invalidate];
});
}
-(void)Waiting
{
_seconds--;
if (_seconds == 0) {
[self myLog];
}
}
/**
* 添加广告上面的UI
*/
-(void)addUI{ _adsImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, width, 0.87*height)];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://i.l.inmobicdn.net/banners/FileData/290057e6-a662-411d-86bb-688b3c284460.jpeg"]];
UIImage *main_image = [UIImage imageWithData:data]; dispatch_async(dispatch_get_main_queue(), ^{
_adsImageView.image = main_image;
});
});
[_LaunchImage addSubview:_adsImageView];
/**
* 显示倒计时的时间按钮
*
*/
_time_btton = [self addButtonWithImagename:@"miaoshu" andTitle:@"5S" andFram:CGRectMake(width-70, 30, 50, 30)];
/**
* 创建倒计时
*
*/
_adsAccordingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAccord) userInfo:nil repeats:YES];
_adsAccording_Integer = 6;
}
/**
* 广告的倒计时
*/
-(void)timerAccord
{
_adsAccording_Integer--;
[_time_btton setTitle:[NSString stringWithFormat:@"%zd",_adsAccording_Integer] forState:0];
if (_adsAccording_Integer <= 0) {
[self myLog];
}
/**等于2秒时显示直接接入按钮*/
if (_adsAccording_Integer == 2) {
_jump_button = [self addButtonWithImagename:@"tiaoguo" andTitle:@"直接进入>" andFram:CGRectMake(width-150,height*0.83-60, 120, 45)];
[_jump_button setTitleColor:[UIColor whiteColor] forState:0];
_jump_button.titleLabel.font = [UIFont systemFontOfSize:15];
[_jump_button addTarget:self action:@selector(myLog) forControlEvents:UIControlEventTouchUpInside];
}
}
/**
* 点击进入按钮
*/
-(void)myLog
{
self.myBlock(YES);
[self dismissViewControllerAnimated:YES completion:^{
[_waitRequestTimer invalidate];
[_adsAccordingTimer invalidate];
}];
}
/**
* 创建广告上面的button按钮
*
* @param imageName 按钮的图片
* @param title 按钮的文字
* @param btnFram 按钮的fram
*
* @return 返回按钮
*/
-(UIButton *)addButtonWithImagename:(NSString *)imageName andTitle:(NSString *)title andFram:(CGRect)btnFram{ UIButton *button =[[UIButton alloc]initWithFrame:btnFram];
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
[button setBackgroundImage:[UIImage imageNamed:imageName] forState:0];
[button setTitle:title forState:0];
button.titleLabel.font = [UIFont systemFontOfSize: 12.0];
[button setTitleColor:[UIColor grayColor]forState:UIControlStateNormal];
[_adsImageView addSubview:button];
return button;
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
return [AAPLCrossDissolveTransitionAnimator new];
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
return [AAPLCrossDissolveTransitionAnimator new];
}

下载完整的demo那就猛戳这里

文/七秒记忆的鱼儿(简书作者)
原文链接:http://www.jianshu.com/p/6d613c957a36
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOSAPP启动时实现加载广告的更多相关文章

  1. Tomcat启动时自动加载Servlet

    1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet ...

  2. 如何让openvpn在windows启动时自动加载

    在非常需要vpn的人群中,他们几乎一整天都连接着vpn,但是每次开机都要连接vpn的过程有时候比较繁琐对于新手而言.这篇文章主要是说明如何在windows启动时自动加载openvpn自动连接,该教程适 ...

  3. [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)

    启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...

  4. Spring Web项目spring配置文件随服务器启动时自动加载

    前言:其实配置文件不随服务器启动时加载也是可以的,但是这样操作的话,每次获取相应对象,就会去读取一次配置文件,从而降低程序的效率,而Spring中已经为我们提供了监听器,可监听服务器是否启动,然后在启 ...

  5. Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题

    Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题 以前是正常的,后来在 server.xml 文件的 <Host> </Host> ...

  6. 基于spring的web项目启动时预加载数据到ServletContext

    1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...

  7. Tomcat启动时自动加载一个类

    有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  8. 如何在tomcat启动时自动加载一个类

    有时候在开发web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  9. CentOS启动时自动加载内核模块

    要想在CentOS中自动加载内核模块,需要在/etc/sysconfig/modules/目录中增加一个脚本,在此脚本中加载所需的模块. 下面是我所用的一个名为8021q.modules的脚本,用来在 ...

随机推荐

  1. vs2010更改默认环境设置

    今天刚刚装vs2010手欠点击了新建团队项目,在百度上各种查找说让我去 visual studio tools的命令提示中进行 devenv命令行修改 ResetString但是没找到我设置文件的路径 ...

  2. Java反射的小故事

    Java反射的小故事: 首先定义一个Java类 package com.xiaoysec.test; public class Person { private String name; privat ...

  3. C++的常量折叠(二)

    前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现结果输出的就不一样了,下面来说一下volatile这个关键字. C/C++中的volati ...

  4. SqlHelp

    using System.Configuration;using System.Data; public class SqlHelp { private static string connectio ...

  5. [cocos2d-x] 让精灵响应触摸 并把方向旋转到相对应的角度

    在cocos2d-x里面  想要把一个精灵从原位置移动到用户所触摸到的点 , 并且把精灵的方向旋转相对应的弧度,可以参考一下我的做法 我这里的精灵是用一条鱼, 用户触摸后鱼就移动到所触摸的点, 并且移 ...

  6. PHP学习笔记7-JSON数据操作

    JSON,全称是JavaScript Object Notation.它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换 ...

  7. FPGA知识大梳理(四)FPGA中的复位系统大汇总

    本文整合特权(吴厚航)和coyoo(王敏志)两位大神的博文.我也很推崇这两位大神的书籍,特权的书籍要偏基础一下,大家不要一听我这么说就想买coyoo的.我还是那一句话,做技术就要step by ste ...

  8. Qt控制台和带窗口的区别_mickelfeng_新浪博客

    Qt控制台和带窗口的区别_mickelfeng_新浪博客     t控制台和带窗口的区别    (2012-04-30 10:50:53)    标签:    杂谈        分类: C/C    ...

  9. HDU4099(斐波那契数列与字典树)

    题目:Revenge of Fibonacci 题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000. 解析 ...

  10. 关于css里的class和id

    id 是唯一的 权重100 相当于身份证 只能有一张. class 可以多个元素都拥有 权重10 就相当于电影票 你有我也有. 用法如下 <divid="box">变颜 ...