在开发一个电商型的APP,大都会遇见设计广告页的需求。根据领导的喜好,广告的显示机制有个别的差异。有的很简单,有的很复杂。我记录一下我的整个过程。
我定义了一个工具类VersionManager : NSObject在里面我写了实现广告页的整个过程,到时候在APPdelegate里面直接调用就可以了。
a.检查广告的方法
+(void)checkSplashPic{
[UIApplication sharedApplication].statusBarHidden = NO;
SplashAdvertModel *splash = [UserTool readSplashAdvert];
if (splash.ImagePath.length > 0) {
UIImage *advert = [UIImage imageWithContentsOfFile:[kImageDirPath stringByAppendingPathComponent:[[splash.ImagePath pathComponents] lastObject]]];
if (advert) {//如果图片已经下载好
NSDate *startDate = [NSDate dateWithTimeIntervalSince1970:[splash.StartTime integerValue]];
NSDate *endDate = [NSDate dateWithTimeIntervalSince1970:[splash.EndTime integerValue]];
NSDate *now = [NSDate date];
if ([now compare:startDate] == NSOrderedDescending && [now compare:endDate] == NSOrderedAscending && [splash.IfDisplay isEqualToString:@"1"]) {
[[VersionManager sharedInstance] showSplashView:advert];
}
}else{
//图片没有下载好,再下载一次
NSString *imagePath = [kImageDirPath stringByAppendingPathComponent:[[splash.ImagePath pathComponents] lastObject]];
dispatch_queue_t queue = dispatch_queue_create("imageQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:splash.ImagePath]];
if (imageData) {
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:kImageDirPath isDirectory:nil]) {
[manager createDirectoryAtPath:kImageDirPath withIntermediateDirectories:YES attributes:nil error:nil];
}
[imageData writeToFile:imagePath atomically:YES];
}
});
}
}
//更新闪屏页广告设置缓存
[HTTPTool getSplashAdvertSuccess:^(NSDictionary *dict) {
NSDictionary *splashDict = dict[@"home_list"];
if (splashDict.allKeys.count > 0) {
SplashAdvertModel *model = [SplashAdvertModel splashAdvertWithDict:splashDict];
SplashAdvertModel *oldModel = [UserTool readSplashAdvert];
if ([model.ImagePath isEqualToString:oldModel.ImagePath]) {//比较图片链接
//相同图片
}else{
NSString *oldImagePath = [kImageDirPath stringByAppendingPathComponent:[[oldModel.ImagePath pathComponents] lastObject]];
NSFileManager *fileMgr = [NSFileManager defaultManager];
BOOL bRet = [fileMgr fileExistsAtPath:oldImagePath];
if (bRet) {
[fileMgr removeItemAtPath:oldImagePath error:nil];
}
[UserTool saveSplashAdvert:model];
NSString *newImagePath = [kImageDirPath stringByAppendingPathComponent:[[model.ImagePath pathComponents] lastObject]];
dispatch_queue_t queue = dispatch_queue_create("imageQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:model.ImagePath]];
if (imageData) {
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:kImageDirPath isDirectory:nil]) {
[manager createDirectoryAtPath:kImageDirPath withIntermediateDirectories:YES attributes:nil error:nil];
}
[imageData writeToFile:newImagePath atomically:YES];
CLLog(@"%@",@"更新splash图片");
}
});
}
}else{
//网络链接失败,或图片置空
[UserTool deleteSplashData];
}
}failure:^(NSError *error) {
CLLog(@"%@",error);
}];
b.如何展示广告页的方法
-(void)showSplashView:(UIImage *)image{
//根据过期时间,设置广告弹窗的时间,过期再重置
if ([SWTTimerManager timerMangerNotUpdateForHour:kCheckSplashAdvertLimitInterval andTag:@"splashAdvert"]){//没过期,那就显示3秒
_closeSEC = 2;
}else{//过期
_closeSEC = kSplashTimer;
}
[UIApplication sharedApplication].statusBarHidden = YES;
[self.boardView removeFromSuperview];
UIView *view = [[UIApplication sharedApplication].windows lastObject];
UIView *boardView = [[UIView alloc] initWithFrame:view.bounds];
_boardView = boardView;
[view addSubview:boardView];
UIImageView *advert = [[UIImageView alloc] init]; //加载图片
advert.image = image;
[boardView addSubview:advert];
[advert mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.equalTo(boardView);
}];
advert.userInteractionEnabled = YES;
UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(goToAdvertLink)];
[advert addGestureRecognizer:tap];
//设置关闭按钮
UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_closeBtn = closeBtn;
[boardView addSubview:closeBtn];
[closeBtn setTitle:[NSString stringWithFormat:@"%ld秒关闭",_closeSEC + 1] forState:UIControlStateNormal];
[closeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
closeBtn.backgroundColor = RGB(200, 200, 200);
closeBtn.titleLabel.font = FontWithName(14);
closeBtn.layer.cornerRadius = 5;
closeBtn.layer.masksToBounds = YES;
closeBtn.alpha = 0.7;
[closeBtn addTarget:self action:@selector(closeSplashView) forControlEvents:UIControlEventTouchUpInside];
[closeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(boardView).offset(-30);
make.top.equalTo(boardView).offset(35);
make.size.mas_equalTo(CGSizeMake(70, 30));
}];
[_splashTimer invalidate];
_splashTimer = nil;
WEAKSELF
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[weakSelf changeBtnTimer];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeBtnTimer) userInfo:nil repeats:YES];
weakSelf.splashTimer = timer;
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
});}
c.跟换按钮上跳动的时间的方法
-(void)changeBtnTimer{
if (_closeSEC <= 0) {
[self closeSplashView];
}else{
[_closeBtn setTitle:[NSString stringWithFormat:@"%ld秒关闭",(long)_closeSEC] forState:UIControlStateNormal];
_closeSEC -- ;
}}
d.关闭闪屏广告的方法
-(void)closeSplashView{
[UIApplication sharedApplication].statusBarHidden = NO;
[_splashTimer invalidate];
_splashTimer = nil;
[_closeBtn setTitle:@"0秒关闭" forState:UIControlStateNormal];
WEAKSELF
[UIView animateWithDuration:0.5 animations:^{
weakSelf.boardView.alpha = 0.01;
} completion:^(BOOL finished) {
[weakSelf.boardView removeFromSuperview];
}];}
然后基本过程就完成了,你只需要在使用的地方写上//闪屏广告 [VersionManager checkSplashPic];
这句话,比如你想程序启动的时候展示,那就写在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}
中,如果你想在后台每次打开都有,那就写在- (void)applicationWillEnterForeground:(UIApplication *)application{}
即可,我把2中效果连在一起展示一下
Untitled.gif
不过现在有很多第三方,直接拿来用就好了。我只是闲的无聊,随便写写