iOS開屏廣告的實現技巧

xeww0970172 8年前發布 | 27K 次閱讀 iOS開發 移動開發

一、前言

記得在創新工場的時候產品經理讓我實現這個功能,當時我想了一個方案,但是可惜最后產品不需要這個功能了。時隔1年多,新公司又要讓我寫這個東西了,這幾天我完善了一下功能,我決定開源一下這個功能,雖然市場上已經有很多應用都有這個功能了,我只是想分享一下我的實現技巧,100個人有100個想法。

二、實現思路

這兩種開屏廣告大家都見過吧?一種是半屏一種是全屏廣告。

如圖:

1、障眼秘籍:

咱們從頭開始分析。iOS啟動的時候有一個默認開屏頁,這個頁會一閃而過。我們想在這里加入廣告,一定要用到障眼法。所謂障眼法就是我們的廣告是壓在一個和默認開屏頁一抹一樣的圖片上面。當用戶看到了開屏頁后,我們用一個和開屏頁一樣的圖壓在上面,用戶還以為這個就是系統的頁面,此時上面廣告壓上,這樣就完美實現了。這里的難點是有的app這個假頁面大小和app原來的不一樣,這樣效果就不好了。這里我寫了一個獲取系統LaunchImage圖片的類,大家可以精確獲取系統默認開屏圖片,達到天衣無縫的效果。

傳送門-> GetLaunchImage

2、緩存秘籍:

以為用戶不是用一次app就再也不用了,用戶肯定會多次打開app的。雖然已經實現了障眼秘籍,但是如果網速慢圖片大,總不能讓用戶看3秒默認啟動圖吧?那樣體驗太不好了,因此還是加入緩存機制比較好。我的實現思路是,第一次不讓用戶去看這個3秒廣告了,直接略過,開一個線程去緩存這張圖片。第二次用戶再啟動app的時候,再顯示圖片,這里漸隱動畫和假啟動頁配合好,天衣無縫。這里的緩存用到了SDWebImage中的SDWebImageManager。

3、其他秘籍:

此處是執行廣告頁邏輯之前要實現的一些東西,大家可以自由發揮。我在公司項目中是按照如圖所示邏輯。github的demo簡單使用userdefault做的演示。

如圖:

三、主要實現代碼

不喜歡貼太多代碼,貼一個初始化代碼吧,主要是思路,建議直接看demo吧。

- (instancetype)initWithBgImage:(NSString *)imageUrl withClickImageAction:(void(^)())action
{
    self = [super initWithFrame:[UIScreen mainScreen].bounds];
    if (self) {

    _isImageDownloaded = NO;
    _imageClickAction = action;

    _bgImageViewDefault = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _bgImageViewDefault.contentMode = UIViewContentModeScaleToFill;
    [self addSubview:_bgImageViewDefault];
    _bgImageViewDefault.image = [GetLaunchImage getTheLaunchImage];

    _bgImageView = [[IanClickImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _bgImageView.alpha = 0.0;
    _bgImageView.contentMode = UIViewContentModeScaleToFill;
    [_bgImageView addTarget:self action:@selector(_ImageClick:)];
    [self addSubview:_bgImageView];

    _timeButton = [[UIButton alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width - 13 - 52, 20, 52, 25)];
    _timeButton.layer.cornerRadius = 25/2.0f;
    [_timeButton setClipsToBounds:YES];
    _timeButton.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.3];
    _timeButton.titleLabel.font = [UIFont systemFontOfSize:13];
    [_timeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_timeButton addTarget:self action:@selector(jumpClick:) forControlEvents:UIControlEventTouchUpInside];
    [_bgImageView addSubview:_timeButton];


    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    BOOL cachedBool = [manager cachedImageExistsForURL:[NSURL URLWithString:imageUrl]]; // 將需要緩存的圖片加載進來
    BOOL diskBool = [manager diskImageExistsForURL:[NSURL URLWithString:imageUrl]];
    if (cachedBool || diskBool) {
        _timeButton.hidden = NO;
        [self.bgImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[GetLaunchImage getTheLaunchImage]];
        _isImageDownloaded = YES;
    } else {
        _timeButton.hidden = YES;
        self.bgImageView.image = [GetLaunchImage getTheLaunchImage];
        [manager downloadImageWithURL:[NSURL URLWithString:imageUrl] options:SDWebImageRefreshCached progress:^(NSInteger receivedSize, NSInteger expectedSize) {

        } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

        }];
        _isImageDownloaded = NO;
    }


}
return self;

}</code></pre>

Demo傳送門-> https://github.com/ianisme/IanStartAdsView

如圖:

四、總結

每個人都有不同的實現方法,你的實現方法是什么呢?

 

來自:https://www.ianisme.com/ios/2339.html

 

 本文由用戶 xeww0970172 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!