廣告頁經常用得到,所以自己寫一個備用。因為之前也沒寫過所以借鑒了《iOS-APP啟動頁加載廣告》的思路。我自己在她的基礎上改了一些東西,廢話少說,先上效果圖:
大概算思路吧:1、封裝一個ADView類(一個廣告頁類)一張圖片、一個倒計時按鈕。負責廣告頁的展示。
2、封裝一個ADImageHandle,廣告處理類,負責處理廣告圖片的更新、下載、保存、刪除舊圖。
程序流程:第一次程序啟動時的廣告顯示沒能實現,這邊相當於顯示的是已經保存下來的圖片,如果有更新就下載保存新的圖片刪除舊的圖片,下一次打開還是顯示保存的圖片。
核心代碼:
1. ADView頁面的封裝
1 // 2 // ADView.h 3 // Demo 4 // 5 6 7 #import <UIKit/UIKit.h> 8 9 @protocol LFAdViewDelegate <NSObject> 10 - (void) pushAd; 11 @end 12 13 @interface ADView : UIView 14 @property (nonatomic, weak) id<LFAdViewDelegate> delegate; //用來實現點擊跳轉廣告頁 15 @property (nonatomic, copy) NSString *adImagePath; //廣告圖片存儲的路徑 16 17 /** 18 顯示廣告頁 19 */ 20 - (void) show; 21 @end
1 //頁面實現 2 @interface ADView () 3 @property (nonatomic, strong) UIImageView *adImageView; 4 @property (nonatomic, strong) UIButton *pushBtn; //跳過button 5 @property (nonatomic, strong) NSTimer *timer; //定時器倒計時 6 @end 7 8 //倒計時5s 9 static NSUInteger AdCount = 5; 10 11 @implementation ADView 12 13 14 - (instancetype)initWithFrame:(CGRect)frame{ 15 if (self = [super initWithFrame:frame]) { 16 [self configuareWithFrame:frame]; 17 } 18 return self; 19 } 20 21 - (void) configuareWithFrame:(CGRect)frame { 22 _adImageView = [[UIImageView alloc] initWithFrame:frame]; 23 _adImageView.userInteractionEnabled = YES; 24 // _adImageView.image = [UIImage imageNamed:@"2222.jpg"]; 25 _adImageView.contentMode = UIViewContentModeScaleAspectFill; 26 _adImageView.clipsToBounds = YES; 27 [self addSubview:_adImageView]; 28 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(linkAD)]; 29 [_adImageView addGestureRecognizer:tap]; 30 31 _pushBtn = [[UIButton alloc] init]; 32 [_pushBtn setTitle:[NSString stringWithFormat:@"跳過 %lus",(unsigned long)AdCount]forState:UIControlStateNormal]; 33 _pushBtn.titleLabel.font = [UIFont systemFontOfSize:15]; 34 _pushBtn.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5]; 35 [_pushBtn setContentEdgeInsets:UIEdgeInsetsMake(5, 10, 5, 10)]; 36 _pushBtn.layer.cornerRadius = 4.0; 37 [_pushBtn addTarget:self action:@selector(removeAdView) forControlEvents:UIControlEventTouchUpInside]; 38 [self addSubview:_pushBtn]; 39 [_pushBtn mas_makeConstraints:^(MASConstraintMaker *make) { 40 make.right.equalTo(@(-50)); 41 make.top.equalTo(@(75)); 42 }]; 43 44 }
1 //定時器的實現 2 - (void)startTimer 3 { 4 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) { 5 [self ticktock]; 6 }]; 7 } 8 9 - (void)ticktock 10 { 11 if(!AdCount){//計時器為0 12 [self removeAdView]; 13 return; 14 } 15 [_pushBtn setTitle:[NSString stringWithFormat:@"跳過 %@s",@(AdCount--)] forState:UIControlStateNormal]; 16 [_pushBtn sizeToFit]; 17 }
1 //廣告頁的顯示 2 - (void) show 3 { 4 //啟動計時器 5 [self startTimer]; 6 //展示頁面 7 UIWindow *window = [UIApplication sharedApplication].keyWindow; 8 [window addSubview:self]; 9 }
2. ADImageHandle類,只暴露出一個+ (void)setupWithVC:(id)vc的方法,操作全部內部實現。
1 #import <Foundation/Foundation.h> 2 3 @interface ADImageHandle : NSObject 4 5 /** 6 設置廣告頁 7 8 @param vc 跳廣告鏈接我是在ADView上寫了一個協議,然后給VC去代理實現的,所以這邊要傳個VC, 9 如果不想傳也可以用個通知的方式實現,在點擊廣告的時候發個通知的,在你的第一個VC里面接收通知然后跳轉廣告頁。 10 */ 11 + (void)setupWithVC:(id)vc; 12 13 @end
1 + (void) setupWithVC:(id)vc 2 { 3 ![self imageIsExsist]?:[self ADViewShowWithImagePath:[[self getImageFilePath]stringByAppendingString:SMUserDefaultGet(kADImageName)]setDelegateVC:vc]; 4 5 [self getADImageData]; 6 }
1 /** 2 廣告接口,一般來說,這里應該是訪問廣告類的接口,返回的應該會有一個imageURL和一個廣告跳轉的ADURL, 3 在這里對這兩個進行處理,再根據imageURL把圖片名字截取出來,跟保存的imageName進行對比,一樣的就不操作,不一樣就開始下載圖片, 4 下載完成的時候更新imageName的值,並刪除舊照片。 5 Attention:第一次我是沒有顯示廣告的 6 */ 7 + (void)getADImageData 8 { 9 NSArray *imageList = @[ 10 @"http://images.cnblogs.com/cnblogs_com/fenglee594/1173372/o_WechatIMG189.jpg", 11 @"http://images.cnblogs.com/cnblogs_com/fenglee594/1173372/o_2222.jpg", 12 @"http://images.cnblogs.com/cnblogs_com/fenglee594/1173372/o_WechatIMG1.jpg", 13 @"http://images.cnblogs.com/cnblogs_com/fenglee594/1173372/o_WechatIMG2.jpg", 14 ]; 15 NSString *imageUrl = imageList[arc4random() % imageList.count]; 16 NSString *imageName = [[imageUrl componentsSeparatedByString:@"/"] lastObject]; 17 NSString * exsistImageName = SMUserDefaultGet(kADImageName); 18 19 //第一次獲取的exsistImageName是為nil的,這時候直接是下載 20 [imageName isEqualToString:exsistImageName]?:[self downloadImageWithUrl:imageUrl ImageName:imageName DeleteOldImage:exsistImageName]; 21 }
1 /** 2 異步下載廣告圖片 3 4 @param imageUrl 圖片URL 5 @param imageName 圖片保存的名字 6 @param oldImage 舊圖片的名字 7 */ 8 + (void) downloadImageWithUrl:(NSString *)imageUrl 9 ImageName:(NSString *)imageName 10 DeleteOldImage:(NSString *)oldImage 11 { 12 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 13 NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]; 14 UIImage *image = [UIImage imageWithData:imageData]; 15 NSString *filePath = [[self getImageFilePath] stringByAppendingString:imageName]; 16 if ([UIImageJPEGRepresentation(image, 1) writeToFile:filePath atomically:YES]) { 17 //保存完圖片就更新ImageName,並刪除舊的圖片 18 SMUserDefaultSet(kADImageName, imageName); 19 [self deleteOldImage:oldImage]; 20 } 21 }); 22 23 }
1 /** 2 設置廣告頁的顯示和代理VC 3 4 @param imagePath 加載的廣告圖片路徑 5 @param vc 代理VC 6 */ 7 + (void) ADViewShowWithImagePath:(NSString *)imagePath 8 setDelegateVC:(id )vc 9 { 10 ADView *adView = [[ADView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 11 adView.adImagePath = imagePath; 12 adView.delegate = vc; 13 [adView show]; 14 }
1 /** 2 判斷圖片是否存在 3 4 @return yes 存在 no 不存在 5 */ 6 + (BOOL) imageIsExsist 7 { 8 if (!SMUserDefaultGet(kADImageName)) { 9 return NO; 10 } 11 BOOL isDir = NO; 12 if ([kFileManager fileExistsAtPath:[[self getImageFilePath] stringByAppendingString:SMUserDefaultGet(kADImageName)] isDirectory:&isDir]){ 13 return YES; 14 } else { 15 return NO; 16 } 17 }
3. 在AppDelegate中的使用
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Override point for customization after application launch. 3 self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 4 ViewController *vc = [[ViewController alloc] init]; 5 UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc]; 6 self.window.rootViewController = nc; 7 [self.window makeKeyAndVisible]; 8 9 //設置廣告頁 10 [ADImageHandle setupWithVC:vc]; 11 12 return YES; 13 }
主要代碼就是以上這些了,感覺有很多表述不清啊,不喜勿噴,歡迎討論。
最后附上Demo地址