iOS启动广告设计与实现
2017-06-05 本文已影响120人
zaijianbali
购物类app、微博、手机百度 打开app的时候经常会出现启动广告。
-
这个启动广告如何做的呢?
-
更新机制是什么?
-
图层如何展示的?
-
图片来源呢?
我们一一解答这些问题:
首先:启动广告的 图片来源?
这个来源是本地已经缓存下来的,不然使用默认的图片了,也就是说图片要提前下载,用于下次启动使用,这点要确认。
其次,啥时候更新呢?
不可能打开应用就更新。因为打开应用的前3到5s是宝贵的,所以不可能在这段时间更新,那这个更新可以延后到5
~10s左右更新。这样就避免的流量峰值,提高了用户体验。
图层的展示问题:
我们是在window上加了一层
[[[[UIApplication sharedApplication] delegate] window] addSubview:self];
[[[[UIApplication sharedApplication] delegate] window] bringSubviewToFront:self];
[[UIApplication sharedApplication].keyWindow addSubview:self];
[[UIApplication sharedApplication].keyWindow bringSubviewToFront:self];
[UIView animateWithDuration:0.5f animations:^{
_bgImageView.alpha = 1.0f;
}];
其次这个要模块化,单独处理,只需要留调用接口就可以。
还有就是计时的和动画的关系,我们开启动画的时候,对广告点击和计时按钮点击事件都有回调;
/**
* 启动广告图的url,,必须设置,不然不启动
*/
@property (nonatomic, copy) NSString *imageUrl;
/**
* 启动广告显示的时间,,可以不设置,默认3s
*/
@property (nonatomic, assign) NSUInteger time;
/**
* 启动广告图的点击回调,跳转到广告页,
*/
@property (nonatomic, copy) ImageClickAction imageClickAction;//带参数
/**
* 启动广告图的跳过回调,可以做一些额外的数据处理
*/
@property (nonatomic, copy) AdsJumpClickAction adsJumpClickAction;
/**
* 启动广告图的正常进行,可以做一些额外的数据处理
*/
@property (nonatomic, copy) AdsCompletion adsCompletion;
- (BOOL)startShowAds;
以上是View的接口
调用如下,回调可以不写,但建议写上。
+ (void)shouldLoadAds
{
//加载广告逻辑,
if ([[[NSUserDefaults standardUserDefaults] stringForKey:ADVIERTISEMENT_DOWNLOAD_KEY] isEqualToString:@"1"])
{
ZWAdsModel *adsModel = [self adsStartImageUrl];
NSString *imageUrl = adsModel.imageUrl;
if (imageUrl)
{
ZWAdsStartView *adsStartView = [[ZWAdsStartView alloc] init];
adsStartView.imageUrl = imageUrl;
adsStartView.time = 5;
adsStartView.adsCompletion = ^(){
NSLog(@"adsCompletion");
};
adsStartView.imageClickAction = ^{
ZWAdsViewController *VC = [[ZWAdsViewController alloc] init];
VC.title = @"Ads Page";
VC.pageUrl = adsModel.pageUrl;
UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:VC];
// [navCtrl pushViewController:VC animated:YES];
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[(UINavigationController *)window.rootViewController presentViewController:navCtrl animated:YES completion:nil];
};
adsStartView.adsJumpClickAction = ^(NSInteger timeInterval) {
NSLog(@"adsJumpClickAction use time:%ld",timeInterval);
};
[adsStartView startShowAds];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//下载图片,可以单独写,与view分开
[self downloadStartImage];
});
}
else // 第一次先下载广告
{
//下载图片
[self downloadStartImage];
[[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:ADVIERTISEMENT_DOWNLOAD_KEY];
}
}
最后,入口在application: didFinishLaunchingWithOptions:需要在里面加入冷启动的判断,代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *viewCtrl = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewCtrl];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
//用户自己点击启动
if(!launchOptions)
{
NSLog(@"用户点击app启动");
//检测是否需要加载广告页,必须放在makeKeyAndVisiblev后面,否则不起作用
[ZWAdsStartManager shouldLoadAds];
}
else
{
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
//app 通过urlscheme启动
if (url) {
NSLog(@"app 通过urlscheme启动 url = %@",url);
}
UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
//通过本地通知启动
if(localNotification)
{
NSLog(@"app 通过本地通知启动 localNotification = %@",localNotification);
}
NSDictionary *remoteCotificationDic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//远程通知启动
if(remoteCotificationDic)
{
NSLog(@"app 通过远程推送通知启动 remoteCotificationDic = %@",remoteCotificationDic);
}
}
return YES;
}
做个小demo只是提供思路,具体应用需要做相应的修改,比如数据源,业务跳转等。
图片如下:
预览图
效果如下:
效果
Demo的github地址如下:
ZWAdsStart
本文解释权归:子文
如需转载请注明出处,谢谢