現(xiàn)在很多App都有加載頁廣告的功能,正好我們項(xiàng)目也需要這樣的功能,就寫了一個(gè),現(xiàn)在把實(shí)現(xiàn)的過程和思路寫出來,如果對(duì)你有幫助我會(huì)很開心,如果你覺得我哪兒寫的不夠好,還懇求各位大神能夠幫忙指出.
首先,根據(jù)我們app的需求,如果用戶是第一次使用app沒有加載頁也沒有歡迎頁面,直接彈出登錄界面,如果用戶已經(jīng)登錄過了那么進(jìn)入app的時(shí)候會(huì)先看到5秒鐘的廣告頁面然后再進(jìn)入app的主頁面,點(diǎn)擊廣告的話會(huì)進(jìn)入一個(gè)網(wǎng)頁,返回就是主頁面了.好了,需求就是這樣,那么就開始動(dòng)手實(shí)現(xiàn)咯.
在AppDelegate.m中
我們的用戶如果成功登錄過的話那么將用戶的token保存在本地,我根據(jù)是否有token來判斷用戶是否是第一次登錄.然后就有了如下的代碼
if (![KKUser user].token.length) {
NavController *nav = [MainStoryboard instantiateViewControllerWithIdentifier:@"nav"];
[[KKUser user]clearSelf];//初始化本地?cái)?shù)據(jù)庫(kù)
self.window.rootViewController = nav;
}else
{
LaunchController *vc = [MeStoryBoard instantiateViewControllerWithIdentifier:@"launch"];
_window.rootViewController = vc;
WEAKSELF
[vc setLaunchblock:^{
NavController *nav = [MainStoryboard instantiateViewControllerWithIdentifier:@"nav"];
weakSelf.window.rootViewController = nav;
}];
}
我來解釋一下這部分代碼吧,如果用戶是第一個(gè)登錄,就將主頁面設(shè)為根視圖,可是不應(yīng)該是登錄界面嗎?我是在主頁面判斷token再?gòu)棾鲎?cè)頁面
//如果沒有token則彈出登陸界面
if (![KKUser user].token.length) {
LoginNavController *LoginNav = [LoginStoryBoard instantiateViewControllerWithIdentifier:@"loginnav"];
[self presentViewController:LoginNav animated:NO completion:nil];
return;
}
如果已經(jīng)有token了,那么就進(jìn)入將廣告頁面也設(shè)為根視圖,那里有一個(gè)block,就是在廣告頁面過了5秒或者點(diǎn)擊廣告圖片之后執(zhí)行這個(gè)block,將主頁面設(shè)為根視圖.
具體可以看看LaunchController中的代碼.
LaunchController.h
#import "LaunchController.h"
typedef void(^launchBlock)();
@interface LaunchController : UIViewController
@property (nonatomic, copy)launchBlock launchblock;
@end
這里只創(chuàng)建了一個(gè)block.
LaunchController.m
- (void)viewDidLoad {
[super viewDidLoad];
_isClickAd = NO;
[[UIApplication sharedApplication]setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
if ([KKUser user].AdList.count) {
NSInteger i = arc4random() % [KKUser user].AdList.count;
NSDictionary *dic = [KKUser user].AdList[i];
_model.pic = [dic safeStringForKey:@"pic"];
_model.Id = [dic safeStringForKey:@"id"];
_model.link = [dic safeStringForKey:@"link"];
_model.activityId = [NSString stringWithFormat:@"%ld",[dic safeIntegerForKey:@"activityId"]];
_model.name = [dic safeStringForKey:@"activityName"];
[_adImageView setWithportrait:_model.pic];
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:5];
}else
{
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1];
}
}
我在主頁面的時(shí)候會(huì)獲取廣告的數(shù)組,然后放在本地的叫AdList里面,進(jìn)入廣告加載頁的時(shí)候先判斷本地的AdList里面是否有數(shù)據(jù),如果有就隨機(jī)抽一個(gè)model出來,作為這個(gè)廣告頁面要顯示的數(shù)據(jù),并在5秒后執(zhí)行block,如果因?yàn)榫W(wǎng)絡(luò)原因沒有獲取到廣告數(shù)據(jù)那么就在一秒后執(zhí)行Block.
這里有一個(gè)_isClickAd屬性,作用就是判斷是否點(diǎn)擊了廣告,如果點(diǎn)擊了廣告就不再延時(shí)執(zhí)行block,延時(shí)方法如下.
- (void)delayMethod{
if (!_isClickAd) {
self.launchblock();
[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}
}
點(diǎn)擊廣告的方法
- (IBAction)clickADimage:(id)sender {
if (_model.link.length) {
_isClickAd = YES;
self.launchblock();
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];//顯示狀態(tài)欄
NSNotification *notification =[NSNotification notificationWithName:@"pushToAdWeb" object:nil userInfo:@{@"link":_model.link,@"name":_model.name}];
[[NSNotificationCenter defaultCenter] postNotification:notification];//發(fā)送通知,讓主頁面push到廣告頁面
});
}
}
這里就是點(diǎn)擊了廣告頁面后,如果廣告鏈接為空,那么不執(zhí)行任何操作(當(dāng)我們的廣告活動(dòng)結(jié)束后, 我們后臺(tái)就只給個(gè)加載的圖片不給鏈接),如果有鏈接的話,那么將_isClickAd設(shè)為YES,這樣就不會(huì)在5秒后再一次執(zhí)行block.然后執(zhí)行block,將主頁面設(shè)為根視圖,并馬上給主視圖發(fā)個(gè)通知讓它push到廣告頁面.
好了,我的思路差不多就是這樣,如果你覺得有哪兒不夠好的請(qǐng)指出,謝謝.祝大家天天開心??