iOS 廣告頁的實現


  廣告頁經常用得到,所以自己寫一個備用。因為之前也沒寫過所以借鑒了《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地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM