思路:
1.广告页加载思路。广告页的内容要实时显示,在无网络状态或者网速缓慢的情况下不能延迟加载,或者等到首页出现了再加载广告页。所以这里我不采用网络请求广告接口获取图片地址,然后加载图片的方式,而是先将图片异步下载到本地,并保存图片名,每次打开app时先根据本地存储的图片名查找沙盒中是否存在该图片,如果存在,则显示广告页。
2.广告页的显示代码可以放在AppDeleate中,启动的时候加载在window上。
代码:
//每次启动时更新图片
-(void)updataAdImage{
NSString *urlString = @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1492585475831&di=1187f056c739de81b721ffc23854c9bf&imgtype=0&src=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%2F201605%2F08%2F20160508131028_ZYAnN.jpeg";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage *image = [UIImage imageWithData:data]; // 取得图片
if (image) {
// 本地沙盒目录
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 得到本地沙盒中名为"AdImage"的路径,"AdImage"是保存的图片名
NSString *imageFilePath = [path stringByAppendingPathComponent:@"AdImage"];
// 将取得的图片写入本地的沙盒中,其中0.5表示压缩比例,1表示不压缩,数值越小压缩比例越大
BOOL success = [UIImageJPEGRepresentation(image, 1.0) writeToFile:imageFilePath atomically:YES];
if (success){
NSLog(@"写入本地成功");
}
}
}
//首次打开app是不用调用广告页的
-(void)setAdPage{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *imageFilePath = [path stringByAppendingPathComponent:@"AdImage"];
//判断是否存在这个文件
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL result = [fileManager fileExistsAtPath:imageFilePath];
if(result){
AdvertiseView *advertiseView = [[AdvertiseView alloc] initWithFrame:self.window.bounds];
[advertiseView show];
}
}
以下是AdvertiseView的.h与.m文件
#import@interface AdvertiseView : UIView
@property(nonatomic,strong)UIImageView *imageView;
@property(nonatomic,strong)UIButton *countBtn;
-(void)show;
@end
#import "AdvertiseView.h"
@implementation AdvertiseView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_imageView=[[UIImageView alloc]initWithFrame:frame];
// 本地沙盒目录
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *imageFilePath = [path stringByAppendingPathComponent:@"AdImage"];
_imageView.image=[[UIImage alloc]initWithContentsOfFile:imageFilePath];
[self addSubview:_imageView];
_countBtn=[[UIButton alloc]initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-80, 40, 60, 30)];
_countBtn.backgroundColor=[[UIColor grayColor] colorWithAlphaComponent:0.5];
_countBtn.clipsToBounds=YES;
[_countBtn.titleLabel setFont:[UIFont systemFontOfSize:15]];
_countBtn.layer.cornerRadius=5;
[_countBtn setTitle:[NSString stringWithFormat:@"跳过%d",4] forState:UIControlStateNormal];
[_countBtn addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:_countBtn];
[self startCoundown];
}
return self;
}
// GCD倒计时
- (void)startCoundown
{
__block int timeout = 4;//倒计时
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);
}
-(void)show{
[[UIApplication sharedApplication].keyWindow addSubview:self];
}
-(void)dismiss{
[self removeFromSuperview];
}
@end