App广告管理

作者: 毅个天亮 | 来源:发表于2017-08-10 12:04 被阅读72次

    需求

    • 首次启动广告
    • 热启动广告(App进入后台后,再次进入前台)
    • 热启动时间间隔控制 (App在后台的时间)
    • 每次运行期间广告显示次数控制 (单次运行期间允许显示广告次数)
    • 每天总的广告显示次数控制 (每天允许显示广告次数)
    • 区分热启动与App在前台解锁手机

    App在前台,用户锁屏相当于进入后台,解锁后App进入前台,都会执行UIApplication对应的代理方法。
    一些App的非首次启动广告,解锁后App在前台的情况下也会显示,比如微博。

    一般广告会有倒计时与跳过按钮,这里只是一个简易的效果,只有一张图片:


    ADShow.gif

    实现与代码封装

    设计

    广告的管理控制属于一个单独的逻辑模块,可以单独封装一个类,以单例的形式存在。
    相比直接将代码写在AppDelegate的各个代理方法中,这样封装可以更好的复用代码,也能让AppDelegate不至于太臃肿复杂。

    解锁判断

    对于解锁状态的判断,已经不能通过CFNotificationCentercom.apple.springboard.lockstate等通知进行判断了,否则可能在上传App或者上架过程被拒。
    可以在应用即将进入前台时,可以结合UIApplicationState和屏幕亮度来判断:

    UIApplicationState state = [[UIApplication sharedApplication] applicationState];
    CGFloat screenBrightness = [[UIScreen mainScreen] brightness];
    BOOL isFromLockScreen = (state == UIApplicationStateInactive) || 
                            (state == UIApplicationStateBackground && screenBrightness <= 0.0);
    
    统计控制

    后台时间和每次运行显示的广告次数可以用变量统计;每天的显示次数则可以存入NSUserDefault

    封装

    只将一些控制选项暴露给外部:

    @class KMADManager;
    
    typedef BOOL(^ShowADFilter)(KMADManager *manager, BOOL isFirstLaunch, BOOL reachTimeThreshold, BOOL reachMaxSessionTime, BOOL reachMaxDailyTime);
    
    typedef void(^ShowADAction)(KMADManager *manager, BOOL isFirstLaunch);
    
    @interface KMADManager : NSObject
    
    /// should exclude app active from screen unlock or not, default YES
    @property (nonatomic, assign) BOOL excludeFromScreenLock;
    
    /// time interval in seconds between background and foreground, default to 300s(5 minus)
    @property (nonatomic, assign) NSTimeInterval timeThreshold;
    
    /// current session AD show times
    @property (nonatomic, assign, readonly) NSUInteger sessionShowTimes;
    
    /// current daily AD show times
    @property (nonatomic, assign, readonly) NSUInteger dailyShowTimes;
    
    /// max time of showing AD per session(APP run one time), default to NSUIntegerMax
    @property (nonatomic, assign) NSUInteger maxSessionShowTimes;
    
    /// max time of showing AD per day, default to NSUIntegerMax
    @property (nonatomic, assign) NSUInteger maxDailyShowTimes;
    
    /// if exists, will use the return value of this block to determine should show a AD or not.
    @property (nonatomic, copy) ShowADFilter showADFilter;
    
    /// execute this block when an AD should be shown
    @property (nonatomic, copy) ShowADAction showADAction;
    
    + (KMADManager *)sharedInstace;
    
    @end
    

    这样外部在调用时,只需做简单的设置和显示广告即可:

    KMADManager *mag = [KMADManager sharedInstace];
    mag.maxDailyShowTimes = 5;
    mag.maxSessionShowTimes = 3;
    mag.excludeFromScreenLock = NO;
    mag.timeThreshold = 3 * 60; // 3 minus
    mag.showADAction = ^(KMADManager *manager, BOOL isFirstLaunch) {
        // here, code to show your AD
        // e.g.
        NSString *imageName = [NSString stringWithFormat:@"ad%@.jpg",@(manager.dailyShowTimes)];
        UIImage *image = [UIImage imageNamed:imageName];
        if (image) {
            [ADHelper showADWithImage:image];
        }
    };
    
    集成pod

    上面的代码已经做成了pod

    pod 'KMADManager', '~> 0.1.0'
    

    如果还不知道怎么创建自己的pod,可以参考 CocoaPods创建自己的开源库和私有库

    广告显示

    可以单独封装一个类,里面使用UIWindow或者UIView来显示广告。

    相关文章

      网友评论

        本文标题:App广告管理

        本文链接:https://www.haomeiwen.com/subject/zgzcrxtx.html