Code Monkey home page Code Monkey logo

coderzhuxh / xhlaunchad Goto Github PK

View Code? Open in Web Editor NEW
3.7K 81.0 734.0 38.67 MB

🔥The screen opening advertising solutions - 开屏广告、启动广告解决方案-支持静态/动态图片广告,mp4视频广告,全屏/半屏广告、兼容iPhone/iPad. 【 Github下载不了/下载慢 可以访问国内下载地址: https://gitee.com/CoderZhuXH/XHLaunchAd】

License: MIT License

Objective-C 99.66% Ruby 0.34%
objective-c ios pod iphone podfile apple ipad

xhlaunchad's Introduction

Github下载不了/下载慢 可以访问国内下载地址: https://gitee.com/CoderZhuXH/XHLaunchAd

开屏广告、启动广告解决方案-支持静态/动态图片广告/mp4视频广告

AppVeyor Version Status Support Pod Platform Pod License

特性:

  • 1.支持静态/动态图片广告.
  • 2.支持mp4视频广告.
  • 3.支持全屏/半屏广告.
  • 4.支持网络及本地资源.
  • 5.兼容iPhone和iPad.
  • 6.支持广告点击事件.
  • 7.支持自定义跳过按钮,添加子视图.
  • 8.支持设置数据等待时间.
  • 9.自带图片/视频下载,缓存功能.
  • 10.支持预缓存图片及视频.
  • 11.支持设置完成动画.
  • 12.支持清除指定资源缓存.
  • 13.支持LaunchImage 和 LaunchScreen.storyboard.
  • 14.等等等...

技术交流群(群号:537476189)

常见问题

1.为什么设置了本地图片广告,却提示找不到图片资源?

  • 请将本地广告图片,直接放在工程目录,不要放在Assets里面,XHLaunchAd不是通过imageName:读取图片,而是是通过[NSBundle mainBundle] path....的方式读取本地图片的(此处涉及到内存优化)

2.为什么我启动的时候会先进入根控制器后,再显示广告页面?

  • 请确认下,你在请求广告数据之前,是否有调用[XHLaunchAd setWaitDataDuration:2];方法设置数据等待时间

3.为什么有时候启动广告倒计时出现跳秒现象或者出现卡顿现象?

  • 此问题是你APP启动时主线程阻塞造成的.
  • XHLaunchAd采用GCD定时器,倒计时不受主线程阻塞影响,但更新秒数/UI是在主线程中进行的.主线程阻塞影响UI更新.
  • 请检查你程序启动时,有没有掉用同步方法或同步请求,(例如:环信SDK同步登录等).
  • 建议打开手机-设置-开发者-弱网环境 进行调试比较容易找到阻塞原因.

4.为什么设置了缓存策略,关闭网络后,开屏广告却不显示?

  • XHLaunchAd 图片广告设置configuration.imageOption为XHLaunchAdImageDefault 或者XHLaunchAdImageRefreshCached 或者XHLaunchAdImageCacheInBackground后,都会缓存广告image,视频广告会默认缓存视频文件,断网后广告数据请求会失败,你需要在广告数据请求失败的回调里初始化XHLaunchAd,没有初始化XHLaunchAd,开屏广告是不会显示的. [XHLaunchAd cacheImageURLString]和 [XHLaunchAd cacheVideoURLString]可以获取上一次广告显示时的ImageURLString和videoUrlString.

5.如何用一张广告图,适配所有机型?

  • 图片广告:设置imageAdconfiguration.contentMode = UIViewContentModeScaleAspectFill; 视频广告:设置videoAdconfiguration.videoGravity = AVLayerVideoGravityResizeAspectFill;.
  • 广告图片/视频内容到四周保留适当安全距离,多余的会裁剪掉,例如:用8P尺寸1242*2208的广告图,在iphonex,iphonexr,iphonexs,iphonexs max上显示时,左右两侧会多出一部分,多出的的部分会裁剪掉,这一区域不要放广告内容.

更新记录:

  • 2020.01.09 -- v3.9.10 -->1.广告点击事件代理支持返回bool值决定是否移除广告(- (BOOL)xhLaunchAd:(XHLaunchAd *)launchAd clickAtOpenModel:(id)openModel clickPoint:(CGPoint)clickPoint) 2.LaunchScreen.storyboard safeAreaInsets问题修复 3.其他bug fix
  • 2018.01.31 -- v3.9.6 -->1.添加视频广告静音属性(muted),2.显示视频广告时暂停其它APP音频播放显示完恢复,3.增加视频播放失败通知
  • 2018.01.11 -- v3.9.5 -->1.修复videoGravity修饰符错误bug...
  • 2017.12.29 -- v3.9.4 -->1.替换视频播放控制器为AVPlayerViewController 2.解决/优化在线程阻塞的情况下视频播放加载慢的问题 3.注意:此次更新后XHLaunchAd支持iOS8及以上版本,不在支持iOS7...
  • 2017.11.22 -- v3.9.0 -->1.新增部分代理方法,部分旧的代理方法做过期处理,2.几处优化...
  • 2017.11.14 -- v3.8.4 -->1.版本优化,2.bug fix...
  • 2017.10.18 -- v3.8.0 -->1.增加对LaunchScreen.storyboard支持,2.修复pod导入编译报错问题...
  • 2017.10.11 -- v3.7.1 -->1.批量缓存接口增加结果回调...
  • 2017.10.09 -- v3.7.0 -->1.增加几种清除缓存的接口,2.增加几种倒计时按钮类型,3.已知问题优化与修复...
  • 2017.09.29 -- v3.6.1 -->1.增加清除指定图片/视频缓存接口,2.优化在iPhoneX上显示效果,3.已知问题优化与修复...
  • 2017.09.18 -- v3.6.0 -->1.优化图片解码方案,2.支持设置GIF动图是否循环播放...
  • 2017.09.13 -- v3.5.8 -->增加几种显示完成的动画...
  • 2017.08.20 -- v3.5.6 -->已知问题修复及内存优化...
  • 2017.05.26 -- v3.5.4 -->修复横屏启动造成的界面问题...
  • 2017.05.02 -- v3.5.0 -->Gif动图占用内存优化...
  • 2017.04.26 -- v3.4.6 -->版本优化,bug fix...
  • 2017.02.17 -- v3.4.0 -->修复部分出现Crash Bug...
  • 2016.12.14 -- v3.2.0 -->添加subViews属性2.添加缓存检测...
  • 2016.12.03 -- v3.0.0 -->1.增加mp4视频开屏广告2.增加对本地资源支持3.增加预缓存接口4.增加更多属性及接口,具有更强的自定义性5.可设置显示完成动画类型6.可自定义跳过按钮7.拥有更优雅的接入接口8.优化缓存机制,bug fix等等...
  • 2016.11.05 -- v2.2.0 -->增加一种缓存方案:先缓存,下次显示.
  • 2016.09.13 -- v2.1.8 -->修复在Swift中使用异常.
  • 2016.09.10 -- v2.1.7 -->适配iPad,增加应用内跳转到广告详情,优化.
  • 2016.09.07 -- v2.1.5 -->修复跳过按钮类型设为None无效问题.
  • 2016.09.01 -- v2.1.4 -->广告url传nil或不合法时,按无数据处理.
  • 2016.08.22 -- v2.1.2 -->增加未检测到广告数据,设置启动页停留时间属性.
  • 2016.08.19 -- v2.1.1 -->跳过按钮bug修复.
  • 2016.08.18 -- v2.1.0 -->API微调,增加设置跳过按钮类型选项.
  • 2016.08.16 -- v2.0 -->1.修复显示广告前RootViewController闪现bug; 2.API重构,增强实用性.
  • 2016.07.18 -- v1.2 -->增加对GIF动态广告的支持.
  • 2016.07.02 -- v1.1.2 -->增加设置缓存机制选项.
  • 2016.06.17 -- v1.1 -->增加倒计时/跳过按钮.
  • 2016.06.13 -- v1.0

效果

静态/动态广告-图片/视频广告

使用方法

1.在didFinishLaunchingWithOptions中或UIApplicationDidFinishLaunching时初始化开屏广告

-1.1 添加图片开屏广告-使用本地数据

-1.1.1 使用默认配置快速初始化

//1.使用默认配置初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

    //配置广告数据
    XHLaunchImageAdConfiguration *imageAdconfiguration = [XHLaunchImageAdConfiguration defaultConfiguration];
    //广告图片URLString/或本地图片名(.jpg/.gif请带上后缀)
    imageAdconfiguration.imageNameOrURLString = @"image0.jpg";
     //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
    imageAdconfiguration.openModel = @"http://www.it7090.com";
    //显示图片开屏广告
    [XHLaunchAd imageAdWithImageAdConfiguration:imageAdconfiguration delegate:self];

-1.1.2自定义配置初始化

//2.自定义配置初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

    //配置广告数据
    XHLaunchImageAdConfiguration *imageAdconfiguration = [XHLaunchImageAdConfiguration new];
    //广告停留时间
    imageAdconfiguration.duration = 5;
    //广告frame
    imageAdconfiguration.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-150);
    //广告图片URLString/或本地图片名(.jpg/.gif请带上后缀)
    imageAdconfiguration.imageNameOrURLString = @"image0.jpg";
    //设置GIF动图是否只循环播放一次(仅对动图设置有效)
    imageAdconfiguration.GIFImageCycleOnce = NO;
    //网络图片缓存机制(只对网络图片有效)
    imageAdconfiguration.imageOption = XHLaunchAdImageRefreshCached;
    //图片填充模式
    imageAdconfiguration.contentMode = UIViewContentModeScaleToFill;
     //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
    imageAdconfiguration.openModel = @"http://www.it7090.com";
    //广告显示完成动画
    imageAdconfiguration.showFinishAnimate =ShowFinishAnimateFadein;
    //广告显示完成动画时间
    imageAdconfiguration.showFinishAnimateTime = 0.8;
    //跳过按钮类型
    imageAdconfiguration.skipButtonType = SkipTypeTimeText;
    //后台返回时,是否显示广告
    imageAdconfiguration.showEnterForeground = NO;
    
     //设置要添加的子视图(可选)
    //imageAdconfiguration.subViews = ...

    //显示图片开屏广告
    [XHLaunchAd imageAdWithImageAdConfiguration:imageAdconfiguration delegate:self]; 
    

-1.2 添加图片开屏广告-使用网络数据

-1.2.1 使用默认配置快速初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

	//1.因为数据请求是异步的,请在数据请求前,调用下面方法配置数据等待时间.
    //2.设为2即表示:启动页将停留2s等待服务器返回广告数据,2s内等到广告数据,将正常显示广告,否则将不显示
    //3.数据获取成功,配置广告数据后,自动结束等待,显示广告
    //注意:请求广告数据前,必须设置此属性,否则会先进入window的的根控制器
    [XHLaunchAd setWaitDataDuration:2];
    
    //广告数据请求
    [Network getLaunchAdImageDataSuccess:^(NSDictionary * response) {
        
        NSLog(@"广告数据 = %@",response);
        
        //广告数据转模型
        LaunchAdModel *model = [[LaunchAdModel alloc] initWithDict:response[@"data"]];
        //配置广告数据
        XHLaunchImageAdConfiguration *imageAdconfiguration = [XHLaunchImageAdConfiguration defaultConfiguration];
        //广告图片URLString/或本地图片名(.jpg/.gif请带上后缀)
        imageAdconfiguration.imageNameOrURLString = model.content;
         //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
        imageAdconfiguration.openModel = model.openUrl;
        //显示开屏广告
        [XHLaunchAd imageAdWithImageAdConfiguration:imageAdconfiguration delegate:self];
        
    } failure:^(NSError *error) {
    }];

-1.2.2 自定义配置初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

 	//1.因为数据请求是异步的,请在数据请求前,调用下面方法配置数据等待时间.
    //2.设为2即表示:启动页将停留2s等待服务器返回广告数据,2s内等到广告数据,将正常显示广告,否则将不显示
    //3.数据获取成功,配置广告数据后,自动结束等待,显示广告
    //注意:请求广告数据前,必须设置此属性,否则会先进入window的的根控制器
    [XHLaunchAd setWaitDataDuration:2];
    
    //广告数据请求
    [Network getLaunchAdImageDataSuccess:^(NSDictionary * response) {
        
        NSLog(@"广告数据 = %@",response);
        
        //广告数据转模型
        LaunchAdModel *model = [[LaunchAdModel alloc] initWithDict:response[@"data"]];
        //配置广告数据
        XHLaunchImageAdConfiguration *imageAdconfiguration = [XHLaunchImageAdConfiguration new];
        //广告停留时间
        imageAdconfiguration.duration = model.duration;
        //广告frame
        imageAdconfiguration.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width/model.width*model.height);
        //广告图片URLString/或本地图片名(.jpg/.gif请带上后缀)
        imageAdconfiguration.imageNameOrURLString = model.content;
        //设置GIF动图是否只循环播放一次(仅对动图设置有效)
        imageAdconfiguration.GIFImageCycleOnce = NO;
        //缓存机制(仅对网络图片有效)
        //为告展示效果更好,可设置为XHLaunchAdImageCacheInBackground,先缓存,下次显示
        imageAdconfiguration.imageOption = XHLaunchAdImageDefault;
        //图片填充模式
        imageAdconfiguration.contentMode = UIViewContentModeScaleToFill;
         //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
        imageAdconfiguration.openModel = model.openUrl;
        //广告显示完成动画
        imageAdconfiguration.showFinishAnimate =ShowFinishAnimateLite;
        //广告显示完成动画时间
        imageAdconfiguration.showFinishAnimateTime = 0.8;
        //跳过按钮类型
        imageAdconfiguration.skipButtonType = SkipTypeTimeText;
        //后台返回时,是否显示广告
        imageAdconfiguration.showEnterForeground = NO;

         //设置要添加的自定义视图(可选)
         //imageAdconfiguration.subViews = ...
 
        //显示开屏广告
        [XHLaunchAd imageAdWithImageAdConfiguration:imageAdconfiguration delegate:self];
        
    } failure:^(NSError *error) {
    }];

-1.3添加视频开屏广告-使用本地数据

-1.3.1 使用默认配置快速初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

    //1.使用默认配置初始化
    XHLaunchVideoAdConfiguration *videoAdconfiguration = [XHLaunchVideoAdConfiguration defaultConfiguration];
    //广告视频URLString/或本地视频名(请带上后缀)
    videoAdconfiguration.videoNameOrURLString = @"video0.mp4";
     //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
    videoAdconfiguration.openModel = @"http://www.it7090.com";
    //显示视频开屏广告
    [XHLaunchAd videoAdWithVideoAdConfiguration:videoAdconfiguration delegate:self];

-1.3.2 自定义配置初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

	//2.自定义配置
    XHLaunchVideoAdConfiguration *videoAdconfiguration = [XHLaunchVideoAdConfiguration new];
    //广告停留时间
    videoAdconfiguration.duration = 5;
    //广告frame
    videoAdconfiguration.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
    //广告视频URLString/或本地视频名(请带上后缀)
    videoAdconfiguration.videoNameOrURLString = @"video1.mp4";
    //是否关闭音频
    videoAdconfiguration.muted = NO;
    //视频填充模式
    videoAdconfiguration.videoGravity = AVLayerVideoGravityResizeAspectFill;
    //是否只循环播放一次
    videoAdconfiguration.videoCycleOnce = NO;
     //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
    videoAdconfiguration.openModel =  @"http://www.it7090.com";
    //广告显示完成动画
    videoAdconfiguration.showFinishAnimate =ShowFinishAnimateFadein;
    //广告显示完成动画时间
    videoAdconfiguration.showFinishAnimateTime = 0.8;
    //跳过按钮类型
    videoAdconfiguration.skipButtonType = SkipTypeTimeText;
    //后台返回时,是否显示广告
    videoAdconfiguration.showEnterForeground = NO;
    
    //设置要添加的子视图(可选)
    //videoAdconfiguration.subViews = ...
    
    //显示视频开屏广告
    [XHLaunchAd videoAdWithVideoAdConfiguration:videoAdconfiguration delegate:self];
    

-1.4添加视频开屏广告-使用网络数据

-1.4.1 使用默认配置快速初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

    //1.因为数据请求是异步的,请在数据请求前,调用下面方法配置数据等待时间.
    //2.设为2即表示:启动页将停留2s等待服务器返回广告数据,2s内等到广告数据,将正常显示广告,否则将不显示
    //3.数据获取成功,配置广告数据后,自动结束等待,显示广告
    //注意:请求广告数据前,必须设置此属性,否则会先进入window的的根控制器
    [XHLaunchAd setWaitDataDuration:2];
    
    //广告数据请求
    [Network getLaunchAdVideoDataSuccess:^(NSDictionary * response) {
        
        NSLog(@"广告数据 = %@",response);
        
        //广告数据转模型
        LaunchAdModel *model = [[LaunchAdModel alloc] initWithDict:response[@"data"]];
        
        //配置广告数据
        XHLaunchVideoAdConfiguration *videoAdconfiguration = [XHLaunchVideoAdConfiguration defaultConfiguration];
        //注意:视频广告只支持先缓存,下次显示(看效果请二次运行)
        videoAdconfiguration.videoNameOrURLString = model.content;
         //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
        videoAdconfiguration.openModel = model.openUrl;
        [XHLaunchAd videoAdWithVideoAdConfiguration:videoAdconfiguration delegate:self];
        
    } failure:^(NSError *error) {
    }];

-1.4.2 自定义配置初始化

    //设置你工程的启动页使用的是:LaunchImage 还是 LaunchScreen.storyboard(不设置默认:LaunchImage)
    [XHLaunchAd setLaunchSourceType:SourceTypeLaunchImage];

 	//1.因为数据请求是异步的,请在数据请求前,调用下面方法配置数据等待时间.
    //2.设为2即表示:启动页将停留2s等待服务器返回广告数据,2s内等到广告数据,将正常显示广告,否则将不显示
    //3.数据获取成功,配置广告数据后,自动结束等待,显示广告
    //注意:请求广告数据前,必须设置此属性,否则会先进入window的的根控制器
    [XHLaunchAd setWaitDataDuration:2];
    
    //广告数据请求
    [Network getLaunchAdVideoDataSuccess:^(NSDictionary * response) {
        
        NSLog(@"广告数据 = %@",response);
        
        //广告数据转模型
        LaunchAdModel *model = [[LaunchAdModel alloc] initWithDict:response[@"data"]];
        
        //配置广告数据
        XHLaunchVideoAdConfiguration *videoAdconfiguration = [XHLaunchVideoAdConfiguration new];
        //广告停留时间
        videoAdconfiguration.duration = model.duration;
        //广告frame
        videoAdconfiguration.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width/model.width*model.height);
        //广告视频URLString/或本地视频名(请带上后缀)
        //注意:视频广告只支持先缓存,下次显示(看效果请二次运行)
        videoAdconfiguration.videoNameOrURLString = model.content;
        //是否关闭音频
        videoAdconfiguration.muted = NO;
        //视频填充模式
        videoAdconfiguration.videoGravity = AVLayerVideoGravityResizeAspectFill;
        //是否只循环播放一次
        videoAdconfiguration.videoCycleOnce = NO;
         //广告点击打开页面参数(openModel可为NSString,模型,字典等任意类型)
        videoAdconfiguration.openModel = model.openUrl;
        //广告显示完成动画
        videoAdconfiguration.showFinishAnimate =ShowFinishAnimateFadein;
        //广告显示完成动画时间
        videoAdconfiguration.showFinishAnimateTime = 0.8;
        //后台返回时,是否显示广告
        videoAdconfiguration.showEnterForeground = NO;
        //跳过按钮类型
        videoAdconfiguration.skipButtonType = SkipTypeTimeText;

        //设置要添加的自定义视图(可选)
        //videoAdconfiguration.subViews = ...

        [XHLaunchAd videoAdWithVideoAdConfiguration:videoAdconfiguration delegate:self];
        
    } failure:^(NSError *error) {
    }];

-1.5.0 显示完成动画支持以下效果

/** 显示完成动画类型 */
typedef NS_ENUM(NSInteger , ShowFinishAnimate) {
    /** 无动画 */
    ShowFinishAnimateNone = 1,
    /** 普通淡入(default) */
    ShowFinishAnimateFadein = 2,
    /** 放大淡入 */
    ShowFinishAnimateLite = 3,
    /** 左右翻转(类似网易云音乐) */
    ShowFinishAnimateFlipFromLeft = 4,
    /** 下上翻转 */
    ShowFinishAnimateFlipFromBottom = 5,
    /** 向上翻页 */
    ShowFinishAnimateCurlUp = 6,
};

-1.6.0 跳过按钮支持以下类型

/** 跳过按钮类型 */
typedef NS_ENUM(NSInteger,SkipType) {
    SkipTypeNone      = 1,//
    /** 方形 */
    SkipTypeTime      = 2,//方形:倒计时
    SkipTypeText      = 3,//方形:跳过
    SkipTypeTimeText  = 4,//方形:倒计时+跳过 (default)
    /** 圆形 */
    SkipTypeRoundTime = 5,//圆形:倒计时
    SkipTypeRoundText = 6,//圆形:跳过
    SkipTypeRoundProgressTime = 7,//圆形:进度圈+倒计时
    SkipTypeRoundProgressText = 8,//圆形:进度圈+跳过
};

2.点击事件

/**
 广告点击事件回调(return YES移除广告,NO不移除广告)
 */
-(BOOL)xhLaunchAd:(XHLaunchAd *)launchAd clickAtOpenModel:(id)openModel clickPoint:(CGPoint)clickPoint{
    
    NSLog(@"广告点击事件");
    
    //openModel即配置广告数据设置的点击广告时打开页面参数(configuration.openModel)
    
    if(openModel == nil) return NO;
    
    WebViewController *VC = [[WebViewController alloc] init];
    NSString *urlString = (NSString *)openModel;
    VC.URLString = urlString;
    //此处不要直接取keyWindow
    UIViewController* rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;
    [rootVC.myNavigationController pushViewController:VC animated:YES];
    
    return YES;//YES移除广告,NO不移除广告
}

3.自定义跳过按钮

//1.XHLaunchImageAdConfiguration 和XHLaunchVideoAdConfiguration 均有一个configuration.customSkipView 属性
//2.自定义一个skipView 赋值给configuration.customSkipView属性 便可替换默认跳过按钮 如下:
configuration.customSkipView = [self customSkipView];

-(UIView *)customSkipView
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.backgroundColor =[UIColor orangeColor];
    button.layer.cornerRadius = 5.0;
    button.layer.borderWidth = 1.5;
    button.layer.borderColor = [UIColor lightGrayColor].CGColor;
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont systemFontOfSize:14];
    CGFloat y = XH_IPHONEX ? 54 : 30;
    button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width-100,y, 85, 30);
    [button addTarget:self action:@selector(skipAction) forControlEvents:UIControlEventTouchUpInside];
    return button;
}

-(void)skipAction
{
     //移除广告
    [XHLaunchAd removeAndAnimated:YES];
}

/**
 *  代理方法 - 倒计时回调
 *
 *  @param launchAd XHLaunchAd
 *  @param duration 倒计时时间
 */
-(void)xhLaunchAd:(XHLaunchAd *)launchAd customSkipView:(UIView *)customSkipView duration:(NSInteger)duration
{
    UIButton *button = (UIButton *)customSkipView;//此处转换为你之前的类型
    //设置自定义跳过按钮倒计时
    [button setTitle:[NSString stringWithFormat:@"自定义%lds",duration] forState:UIControlStateNormal];
}

4.批量下载缓存接口(如果你需要提前批量下载并缓存广告图片或视频请调用下面方法)

/**
 *  批量下载并缓存image(异步) - 已缓存的image不会再次下载缓存
 *
 *  @param urlArray image URL Array
 */
+(void)downLoadImageAndCacheWithURLArray:(NSArray <NSURL *> * )urlArray;

/**
 批量下载并缓存image,并回调结果(异步)- 已缓存的image不会再次下载缓存

 @param urlArray image URL Array
 @param completedBlock 回调结果为一个字典数组,url:图片的url字符串,result:0表示该图片下载缓存失败,1表示该图片下载并缓存完成或本地缓存中已有该图片
 */
+(void)downLoadImageAndCacheWithURLArray:(nonnull NSArray <NSURL *> * )urlArray completed:(nullable XHLaunchAdBatchDownLoadAndCacheCompletedBlock)completedBlock;

/**
 *  批量下载并缓存视频(异步) - 已缓存的视频不会再次下载缓存
 *
 *  @param urlArray 视频URL Array
 */
+(void)downLoadVideoAndCacheWithURLArray:(NSArray <NSURL *> * )urlArray;

/**
 批量下载并缓存视频,并回调结果(异步) - 已缓存的视频不会再次下载缓存
 
 @param urlArray 视频URL Array
 @param completedBlock 回调结果为一个字典数组,url:视频的url字符串,result:0表示该视频下载缓存失败,1表示该视频下载并缓存完成或本地缓存中已有该视频
 */
+(void)downLoadVideoAndCacheWithURLArray:(nonnull NSArray <NSURL *> * )urlArray completed:(nullable XHLaunchAdBatchDownLoadAndCacheCompletedBlock)completedBlock;

5.检测是否已缓存

/**
 *  是否已缓存在该图片
 *
 *  @param url image url
 *
 *  @return BOOL
 */
+(BOOL)checkImageInCacheWithURL:(NSURL *)url;

/**
 *  是否已缓存该视频
 *
 *  @param url video url
 *
 *  @return BOOL
 */
+(BOOL)checkVideoInCacheWithURL:(NSURL *)url;

6.缓存/清理相关

/**
 *  清除XHLaunch本地所有缓存
 */
+(void)clearDiskCache;

/**
 清除指定Url的图片本地缓存(异步)

 @param imageUrlArray 需要清除缓存的图片Url数组
 */
+(void)clearDiskCacheWithImageUrlArray:(NSArray<NSURL *> *)imageUrlArray;

/**
 清除指定Url除外的图片本地缓存(异步)
 
 @param exceptImageUrlArray 此url数组的图片缓存将被保留,不会被清理
 */
+(void)clearDiskCacheExceptImageUrlArray:(NSArray<NSURL *> *)exceptImageUrlArray;

/**
 清除指定Url的视频本地缓存(异步)

 @param videoUrlArray 需要清除缓存的视频url数组
 */
+(void)clearDiskCacheWithVideoUrlArray:(NSArray<NSURL *> *)videoUrlArray;

/**
 清除指定Url除外的视频本地缓存(异步)
 
 @param exceptVideoUrlArray 此url数组的视频缓存将被保留,不会被清理
 */
+(void)clearDiskCacheExceptVideoUrlArray:(NSArray<NSURL *> *)exceptVideoUrlArray;


/**
 *  获取XHLaunch本地缓存大小(M)
 */
+(float)diskCacheSize;

/**
 *  缓存路径
 */
+(NSString *)xhLaunchAdCachePath;

7.其它代理方法

/**
 *  图片本地读取/或下载完成回调
 *
 *  @param launchAd  XHLaunchAd
 *  @param image 读取/下载的image
 *  @param imageData 读取/下载的imageData
 */
-(void)xhLaunchAd:(XHLaunchAd *)launchAd imageDownLoadFinish:(UIImage *)image imageData:(NSData *)imageData;
{
    NSLog(@"图片下载完成/或本地图片读取完成回调");
}
/**
 *  视频下载完成回调
 *
 *  @param launchAd XHLaunchAd
 *  @param pathURL  视频保存在本地的path
 */
-(void)xhLaunchAd:(XHLaunchAd *)launchAd videoDownLoadFinish:(NSURL *)pathURL
{
    NSLog(@"video下载/加载完成/保存path = %@",pathURL.absoluteString);
}

/**
 *  视频下载进度回调
 */
-(void)xhLaunchAd:(XHLaunchAd *)launchAd videoDownLoadProgress:(float)progress total:(unsigned long long)total current:(unsigned long long)current
{
    NSLog(@"总大小=%lld,已下载大小=%lld,下载进度=%f",total,current,progress);
    
}
/**
 *  广告显示完成
 */
-(void)xhLaunchAdShowFinish:(XHLaunchAd *)launchAd
{
    NSLog(@"广告显示完成");
}

/**
 如果你想用SDWebImage等框架加载网络广告图片,请实现此代理(注意:实现此方法后,图片缓存将不受XHLaunchAd管理)
 
 @param launchAd          XHLaunchAd
 @param launchAdImageView launchAdImageView
 @param url               图片url
 */
-(void)xhLaunchAd:(XHLaunchAd *)launchAd launchAdImageView:(UIImageView *)launchAdImageView URL:(NSURL *)url
{
    [launchAdImageView sd_setImageWithURL:url];

}

依赖

1.本库依赖于:FLAnimatedImage

安装

1.手动添加:

  • 1.将 XHLaunchAd 文件夹添加到工程目录中
  • 2.导入 XHLaunchAd.h

2.CocoaPods:

  • 1.在 Podfile 中添加 pod 'XHLaunchAd'
  • 2.执行 pod install 或 pod update
  • 3.导入 XHLaunchAd.h

3.Tips

  • 1.如果发现pod search XHLaunchAd 搜索出来的不是最新版本,需要在终端执行pod repo update命令更新本地spec缓存(需要几分钟),然后再搜索就可以了
  • 2.如果你发现你执行pod install后,导入的不是最新版本,请删除Podfile.lock文件,在执行一次 pod install
  • 3.如果在使用过程中遇到BUG,希望你能Issues我,谢谢(或者尝试下载最新的代码看看BUG修复没有)

系统要求

  • 该项目最低支持 iOS 8.0 和 Xcode 8.0

许可证

XHLaunchAd 使用 MIT 许可证,详情见 LICENSE 文件

xhlaunchad's People

Contributors

coderzhuxh avatar devcxm avatar it7090 avatar lisonfan avatar tisoncai avatar tpctt avatar xuzhou524 avatar yiios avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xhlaunchad's Issues

persent到web页面,dismiss后发现倒计时还在

点击广告页进入一个h5页面后,回来发现倒计时还是刚刚那秒数 按道理说 如果dismiss掉h5后 时间已经过了设置的秒数 应该自动跳过,而不是timer还在那一直等待吧~

崩溃

iPad 和 pro真机测试就崩溃,模拟器就不会,lunchImage也有,会崩溃在 UIViewController *LaunchScreenSb = [[UIStoryboard storyboardWithName:UILaunchStoryboardName bundle:nil] instantiateInitialViewController]

图片缓存备份问题

你好,刚刚阅读了您的源码,有一点不理解,请教一下。
你缓存的图片 存在于Library/XHLaunchAdCache 目录下,这个目录会被icloud 备份的吧?这是你设计如此,还说没有做这方面的考虑呢?

启动闪退频率过高

项目中上线监测捕捉闪退异常信息,好一部分是框架引起的,希望改进,同时祝框架越来越好
01ffbfc3359c97966833cf03fc36a51c
复现跟踪,打印po _waitDataTimer 输出为nil
框架使用的是最新的

请看

网络请求下来关于广告的url,此时你就开始倒计时出现广告了,但是网络慢的情况下,是个白板,还没有加载出来图片,但是倒计时已经开始了
我设置时长是5s,很多时候都是倒计时到3s的时候才出来广告图片

是不是应该监测图片加载不下来,就不开始倒计时,知道图片开始展示出来才开始倒计时

adImgView懒加载方法,没设置contentmode

-(UIImageView *)adImgView
{
    if(_adImgView==nil)
    {
        _adImgView = [[UIImageView alloc] initWithFrame:_adFrame];
        _adImgView.userInteractionEnabled = YES;
        _adImgView.alpha = 0.2;
        _adImgView.contentMode = UIViewContentModeScaleAspectFill;  // -->newly
        _adImgView.clipsToBounds = YES;  // -->newly
        UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
        [_adImgView addGestureRecognizer:tap];
    }
    return _adImgView;
}

当然,这不算是什么issue哈,只是个人比较习惯这样,不然某些图片被缩放变形了,看着怪怪的

开屏广告是加在keyWindow上的,如果创建一个新的window用于放置开屏广告会更好

直接加在keyWindow会对于集成造成一些不是太友好的影响,因为我们公司的项目,对于keyWidow有他自己的业务逻辑了,这样会造成一定的侵入。
其实大家一般盖视图,习惯在 KeyWindow 上直接AddSubview, 其实这是不好的。首先KeyWindow 会被AlertView覆盖, 还有可能别的业务代码也进行了AddSubview 这样就会把你的广告给覆盖了

applicationDidBecomeActive写到这里,会闪

怎么写到这里会闪呢??
本意是自已写一个时间进去,
大于某一个时间,就显示广告.
因为好多用户打开APP后,是不会主动关的.
如果写在didFinishLaunchingWithOptions里边,真不好说他几天才能看到一次.
但写到applicationDidBecomeActive里边,
后闪launchImage这个图.
applicationWillEnterForeground这里我也试了.都一样

另外,总是会显示不默认设置的launchImage的图.
这个能不能在已经有广告图时,就不再显示了??
或者我哪设的不对??

崩溃

-[XHLaunchAd .cxx_destruct],请问这个什么原因?

建议

请问,是否可增加一个几秒内图片未下载完成,跳转到rootViewController,而不是直接开始计数

缓存的问题

伙计,启动的时候加载的广告图片,不应该都缓存吧,如果我每天更新广告URL,那么会使手机缓存增加的,这个问题你怎么处理?我觉得只需要缓存一张广告就行了,更新了替换掉原来的图片就行了,不应该是都缓存,你觉得呢?

第四种缓存机制有问题

后台缓存本次不显示,缓存OK后下次再显示,这种缓存机制,没有显示图片,但是却显示了倒计时

如果app支持landscape的话,好像启动画面显示不出来

如果app的device orientation是Landscape left/right的,Launch Image source是竖屏显示的,但是用以下的代码显示不出来广告,广告的数据源是肯定没问题的。
XHLaunchImageAdConfiguration *imageAdconfiguration = [XHLaunchImageAdConfiguration defaultConfiguration];
imageAdconfiguration.duration=6;
imageAdconfiguration.imageNameOrURLString = @“图片的源”;
imageAdconfiguration.openURLString = @“链接的源”;
//显示图片开屏广告
[XHLaunchAd imageAdWithImageAdConfiguration:imageAdconfiguration delegate:self];

个别崩溃情况

上架后有个别用户发生闪退在:-(void)startSkipDispathTimer
if(duration == 0) {
dispatch_source_cancel(_skipTimer);这里

用了友盟的统计,不知道是不是有冲突
default

初始化的图片类型,出现视频问题

这是我写的初始化代码

#pragma mark- 开屏广告相关
-(void)setupXHLaunchAd
{
    AdImage *item = [AdImage searchSingleWithWhere:nil orderBy:nil];
    
    if (item != nil) {
        //1.因为数据请求是异步的,请在数据请求前,调用下面方法配置数据等待时间.
        //2.设为3即表示:启动页将停留3s等待服务器返回广告数据,3s内等到广告数据,将正常显示广告,否则将自动进入window的RootVC
        //3.数据获取成功,初始化广告时,自动结束等待,显示广告
        [XHLaunchAd setWaitDataDuration:3];//请求广告数据前,必须设置
        
        //配置广告数据
        XHLaunchImageAdConfiguration *imageAdconfiguration = [XHLaunchImageAdConfiguration new];
        imageAdconfiguration.duration = item.show_time;

        //imageAdconfiguration.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width/model.width*model.height);
        imageAdconfiguration.imageNameOrURLString = [NSString linkUrl:item.imgurl];
        imageAdconfiguration.imageOption = XHLaunchAdImageDefault;
        imageAdconfiguration.contentMode = UIViewContentModeScaleToFill;
        imageAdconfiguration.openURLString = item.link_id;
        imageAdconfiguration.showFinishAnimate =ShowFinishAnimateFadein;
        imageAdconfiguration.skipButtonType = SkipTypeTimeText;
        imageAdconfiguration.showEnterForeground = NO;
        
        [XHLaunchAd imageAdWithImageAdConfiguration:imageAdconfiguration delegate:self];
    }
    
    //重新下载广告数据
    [[APIClient sharedClient] startImgsWithTag:self call:^(AdImage *item, APIObject *info) { }];
    
}

以下是检测到的卡顿信息。我在初始化时没有使用视频方式,使用的图片,但卡顿出现了视频信息

libsystem_kernel.dylib	semaphore_wait_trap + 8
1 libdispatch.dylib	__dispatch_semaphore_wait_slow + 191
2 HomeSharing	-[HSCloudClient canShowCloudMusic] + 347
3 MediaPlayer	-[MPMediaLibraryDataProviderML3 systemFilterPredicatesWithGroupingType:cloudTrackFilteringType:subscriptionFilteringOptions:] + 339
4 MediaPlayer	-[MPMediaLibraryDataProviderML3 ML3SystemFilterPredicatesWithGroupingType:cloudTrackFilteringType:subscriptionFilteringOptions:additionalFilterPredicates:] + 95
5 MediaPlayer	-[MPMediaLibraryDataProviderML3 setLibraryEntityFilterPredicatesWithCloudFilteringType:additionalFilterPredicates:] + 55
6 MediaPlayer	-[MPMediaLibrary setLibraryFilterPredicates] + 165
7 MediaPlayer	-[MPMediaLibrary init] + 723
8 MediaPlayer	___36+[MPMediaLibrary deviceMediaLibrary]_block_invoke + 67
9 libdispatch.dylib	__dispatch_client_callout + 23
10 libdispatch.dylib	__dispatch_barrier_sync_f_invoke + 57
11 MediaPlayer	+[MPMediaLibrary deviceMediaLibrary] + 31
12 MediaPlayer	+[MPMediaLibrary defaultMediaLibrary] + 221
13 MediaPlayer	-[MPAVController preferredLanguages] + 89
14 MediaPlayer	-[MPAVController _connectAVPlayer] + 1019
15 MediaPlayer	___37-[MPAVController setPlaylistManager:]_block_invoke + 163
16 MediaPlayer	MPLogActivity + 70
17 MediaPlayer	-[MPAVController setPlaylistManager:] + 127
18 MediaPlayer	-[MPAVController _playlistManager] + 111
19 MediaPlayer	-[MPAVController _setActionAtEndAttributeForState:] + 73
20 MediaPlayer	-[MPMoviePlayerControllerNew init] + 299
21 MediaPlayer	-[MPMoviePlayerController initWithContentURL:] + 189
22 FaceCard	0x00066000 + 2721971
23 FaceCard	0x00066000 + 2721733
24 FaceCard	0x00066000 + 2701609
25 FaceCard	0x00066000 + 2705805
26 UIKit	-[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 541
27 UIKit	-[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 205
28 UIKit	-[UIViewAnimationState animationDidStop:finished:] + 79
29 QuartzCore	CA::Layer::run_animation_callbacks(void*) + 253
30 libdispatch.dylib	__dispatch_client_callout + 23
31 libdispatch.dylib	__dispatch_main_queue_callback_4CF$VARIANT$mp + 1525
32 CoreFoundation	___CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
33 CoreFoundation	___CFRunLoopRun + 1575
34 CoreFoundation	CFRunLoopRunSpecific + 520
35 CoreFoundation	CFRunLoopRunInMode + 108
36 GraphicsServices	GSEventRunModal + 160
37 UIKit	UIApplicationMain + 144
38 FaceCard	0x00066000 + 1030341

点击跳过BUG

点击跳过进入VC ,倒数秒到了会再进入一次VC

总是崩溃,不知道啥原因了

2016-11-07 01:21:22.248 chu[91598:15125509] -[XHLaunchAd viewControllers]: unrecognized selector sent to instance 0x7f9b74d79060
2016-11-07 01:21:22.310 chu[91598:15125509] NSScanner: nil string argument
2016-11-07 01:21:22.311 chu[91598:15125509] NSScanner: nil string argument
libc++abi.dylib: terminate_handler unexpectedly threw an exception

用的UITabBarController
但也没有啥特别设置呀.

能增加后台缓存图片?

能不能增加这种功能?
第一次运行时预先在后台缓存好图片,因为网速不好的话图片加载会比较慢。

bug: 设置skipType类型为SkipTypeNone无效

设置skipType为SkipTypeNone,跳过、读秒依然存在。通过阅读源码,发现是
image这句判断有误。建议修改为:
BOOL isSetSkipType = _skipType!= SkipTypeNone || _skipType!= SkipTypeTime || _skipType != SkipTypeText || _skipType!= SkipTypeTimeText; if(!isSetSkipType) _skipType = SkipTypeTimeText;

swift的写法要求

能够展示swift语法的写法吗?
因为我是用swift写然后import objective-c来用的
因为我不太会objective-c所以不会翻译至swift
T.T拜托你了,大大
谢谢你先~~~

screen shot 2016-11-02 at 6 29 52 pm

广告结束后window上覆盖了一层view

在结束广告之后,window上被覆盖了一层view,导致根视图所有的东西都无法点击.我尝试找了找,没有找到这个view的意义,也没有找到位置,但找到了治标不治本的解决方案.
image
解决方案就是干掉这个view呗,用作者给的协议.
image

点击查看详情返回后倒计时 还存在

在demo中使用 xcode8 ios10运行项目,进入广告详情,在点击关闭,还是存在倒计时,有什么方法可以在进入详情后关闭详情页 直接进入 主页面吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.