現在很多App都有加載頁廣告的功能,正好我們項目也需要這樣的功能,就寫了一個,現在把實現的過程和思路寫出來,如果對你有幫助我會很開心,如果你覺得我哪兒寫的不夠好,還懇求各位大神能夠幫忙指出.
首先,根據我們app的需求,如果用戶是第一次使用app沒有加載頁也沒有歡迎頁面,直接彈出登錄界面,如果用戶已經登錄過了那么進入app的時候會先看到5秒鐘的廣告頁面然后再進入app的主頁面,點擊廣告的話會進入一個網頁,返回就是主頁面了.好了,需求就是這樣,那么就開始動手實現咯.
在AppDelegate.m中
我們的用戶如果成功登錄過的話那么將用戶的token保存在本地,我根據是否有token來判斷用戶是否是第一次登錄.然后就有了如下的代碼
if (![KKUser user].token.length) {
NavController *nav = [MainStoryboard instantiateViewControllerWithIdentifier:@"nav"];
[[KKUser user]clearSelf];//初始化本地數據庫
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;
}];
}
我來解釋一下這部分代碼吧,如果用戶是第一個登錄,就將主頁面設為根視圖,可是不應該是登錄界面嗎?我是在主頁面判斷token再彈出注冊頁面
//如果沒有token則彈出登陸界面
if (![KKUser user].token.length) {
LoginNavController *LoginNav = [LoginStoryBoard instantiateViewControllerWithIdentifier:@"loginnav"];
[self presentViewController:LoginNav animated:NO completion:nil];
return;
}
如果已經有token了,那么就進入將廣告頁面也設為根視圖,那里有一個block,就是在廣告頁面過了5秒或者點擊廣告圖片之后執行這個block,將主頁面設為根視圖.
具體可以看看LaunchController中的代碼.
LaunchController.h
#import "LaunchController.h"
typedef void(^launchBlock)();
@interface LaunchController : UIViewController
@property (nonatomic, copy)launchBlock launchblock;
@end
這里只創建了一個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];
}
}
我在主頁面的時候會獲取廣告的數組,然后放在本地的叫AdList里面,進入廣告加載頁的時候先判斷本地的AdList里面是否有數據,如果有就隨機抽一個model出來,作為這個廣告頁面要顯示的數據,并在5秒后執行block,如果因為網絡原因沒有獲取到廣告數據那么就在一秒后執行Block.
這里有一個_isClickAd屬性,作用就是判斷是否點擊了廣告,如果點擊了廣告就不再延時執行block,延時方法如下.
- (void)delayMethod{
if (!_isClickAd) {
self.launchblock();
[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}
}
點擊廣告的方法
- (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];//顯示狀態欄
NSNotification *notification =[NSNotification notificationWithName:@"pushToAdWeb" object:nil userInfo:@{@"link":_model.link,@"name":_model.name}];
[[NSNotificationCenter defaultCenter] postNotification:notification];//發送通知,讓主頁面push到廣告頁面
});
}
}
這里就是點擊了廣告頁面后,如果廣告鏈接為空,那么不執行任何操作(當我們的廣告活動結束后, 我們后臺就只給個加載的圖片不給鏈接),如果有鏈接的話,那么將_isClickAd設為YES,這樣就不會在5秒后再一次執行block.然后執行block,將主頁面設為根視圖,并馬上給主視圖發個通知讓它push到廣告頁面.
好了,我的思路差不多就是這樣,如果你覺得有哪兒不夠好的請指出,謝謝.祝大家天天開心??