转载至:https://my.oschina.net/zhxx/blog/910836

开屏广告作为app启动时映入用户眼帘的第一界面,其重要性不言而喻。 因项目中开屏广告插件中业务越来越多,原来的的方式也已经无法满足需求。

开屏广告要实现要求:

1.正常开屏时显示开屏广告,且不能显示状态栏,如果有开机引导图则先显示广告后显示引导图 如果还有其他的子view 则按顺序往后排。

2.app进入后台一段时间后再次进入前台也需要显示广告,而且广告不会被 Alert以外的其他视图(比如加在keywindow上的弹窗浮层等)挡住。

3.从3D touch ,通知栏唤起app时可以正常显示广告。

4.唤起app时如果当前的 keywindow是横向(例如我们项目里从 h5页面唤起 AR看车页面时,AR会强制旋转屏幕)的,可以正常显示广告(广告依然是竖直显示)。

5.点击跳过直接进入app首页,或者点击广告进入广告落地页,从广告页返回则直接返回到app首页。

在网上也查找了不少资料,其中大部分都是把开屏广告直接加载到keywindow上。首先前提条件我们项目 开屏广告是个单独的插件,其次我们项目里是设置了

Viewcontroller-based status bar appearance 这个属性为YES 的,so 状态栏的显示与隐藏需要调用ViewController的

    - (BOOL)prefersStatusBarHidden{  return YES;//隐藏  }  

这个方法来控制状态栏, 如果创建了view加在keywindow上,则状态栏的状态则不方便控制,再者当keywindow 强制被旋转式,要让view的子视图也跟着旋转也是件麻烦事。

或者是启动时把开屏广告作为 rootVC,广告结束之后在切换rootVC为tabbar 。还有一种是通过切换keyiwindow 的方式实现 。以上两种方法我也都做了尝试,可以满足部分需求,但是都无法完美的解决以上开屏的需求。

后台偶然的机会看到 window 的makeKeyAndVisibale方法的注解

- (void)makeKeyAndVisible;

Description

Shows the window and makes it the key window.

This is a convenience method to show the current window and position it in front of all other windows at the same level or lower. If you only want to show the window, change its hidden property to NO.

重点在最后一句: If you only want to show the window, change its hidden property to NO.  。

如果我们想显示window just set its hidden属性为 NO 即可。 也就是我们创建的window 默认隐藏的,当我调用 makeKeyAndVisible时,这个window才会成为keywindow并且可见。也就是说虽然app中只能有一个keywindow 但是可以有多个 window同时存在通过控制window的 level来控制显示的层级。window 的层级有下面几种:

typedef CGFloat UIWindowLevel; windowlevel 其实是浮点型的值
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; // 默认值  值为1000.00
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; //  Alert window所在层级 值为3000.00
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar // 状态栏层级 值 2000.00 

程序的keywindow的window level 是默认的 wndowLevelNormal 。

众所周知开屏广告其实是在app启动之后,盖在了程序主界面之上 。 既然keywindow 的windowLevel 是normal 的,那么我们就可以在app启动之后再创建一个window并设置windowLevel 比normal 高,这样就会盖住kewindow 显示广告了,在广告流程结束之后再把这个window 隐藏即可。

使用这种方式还有一个最大的优点,由于这是一个单独的window,我们可以绑定一个 rootViewController,把开屏广告的view加在该rootViewController上,viewController有着完整可控的生命周期,并且可以通过 - (BOOL)prefersStatusBarHidden  方法控制状态栏的显示与隐藏, 通过

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 控制屏幕的方向,除此之外,因为他是一个单独的window,并没有加在keywindow上或者是其他视图上,只是window level 不同,不会对其他的业务线产生影响,简直是一举多得!!!

下面列举出需要注意的几点:

1. 广告的window level 需要设置为 UIWindowLevelStatusBar - 1 ,不能比 statusBar的windowLevel高,否则当即有广告又有引导图的情况下,点击广告跳转到广告落地页(落地页要显示状态栏的),由于windowLevel比statusBar的高,会导致状态栏无法显示。

2.广告window的rootVC应该只支持垂直方向,此时rootVC的子view在屏幕旋转的时候仍会按照垂直方向的frame布局。

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {return UIInterfaceOrientationMaskPortrait;
}

3.需要特别注意: 在PLUS系列的手机,由于PLUS系列的手机在横屏的时候 手机的整个界面都会跟着旋转(非PLUS系列手机好像不会)  ,如果PLUS系列手机是在横屏状态下启动的app,此时 viewDidLoad中 view.frame.size.width = MAX(屏幕宽,屏幕高) ,也就是说 view的宽等于手机垂直状态下的高了,拿7PLUS举个例子:此时 view.frame = (0,0,736,414) ,在掉用过  - (UIInterfaceOrientationMask)supportedInterfaceOrientations  方法之后,由于该rootVC只支持垂直方向此时 view的frame才是正确的,  拿7PLUS举个例子:此时 view.frame = (0,0,414,736) 。

4.在开平广告结束时候记得隐藏广告 window ,并设置为nil 。

以上就是这次开屏广告重构确定下来的方案,既能完美满足各个需求,方便以后扩展需求,又能不对其他业务线产生影响。

----------------------------------------------------------------

2017-08-09更新

为了能有更好的通用性,可以创建一个 Manager类, 类似系统 Alert , 将这些view 放在一个队列里去统一管理,当上一个view 的流程结束后,才去展示下一页面 。

iOS开屏广告弹窗浮层解决方案相关推荐

  1. iOS开屏广告解决方案XHLaunchAd 3.0

    一.前言: 1.之前由于项目需要,写了一个开屏广告组件XHLaunchAd,主要自用,后来发现越来越多的开发者,有这个需求. 2.随着使用人数的增加,部分开发者使用者提出了一些需求和问题,XHLaun ...

  2. 关于右下角广告弹窗的解决方案_小黄鸭

    一年一度 的双十一又到了,我们的计算机上也多了好多广告弹窗,特别是今天有一个弹窗竟然几分钟弹一次 解决方案: 一.下个火绒,打开里面的安全工具–>弹窗拦截.里面有个截图拦截,点了之后之只要把鼠标 ...

  3. Quantumult X去除ios开屏广告

    文章目录 总结 申请美区ID 准备工作 注册ID 注意事项 填写地址 生成虚拟地址 注意事项 购买美区礼品卡 激活充值卡 配置相关配置 参考链接 总结 1.软件需要7.99刀,折合人民币56,如果有白 ...

  4. IOS 插屏广告弹窗

    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow ?: [[[UIApplication sharedApplicat ...

  5. Flutter之开屏广告缓存本地方案(无插件版),兼容 IOS、安卓

    问题: 开屏广告图使用网络加载的话,会出现一个加载时的白屏.为了处理这个白屏实现开屏到广告的顺利过渡: 解决方案的整体思路如下: 网络请求图片文件 将图片文件转换成Uint8List 将Uint8Li ...

  6. 【解决方案】雷电模拟器去开屏广告

    [解决方案]雷电模拟器去开屏广告 1.打开host文件,复制以下域名到最后一行粘贴 127.0.0.1 res.ldmnq.com 127.0.0.1 ldmnq.com 127.0.0.1 ldap ...

  7. iOS接入开屏广告教程 : 以腾讯优量汇为案例(适配iOS15)

    文章目录 引言 I . SDK部署 1.1 术语介绍 1.2 拉取最新SDK库 1.3 接入注意事项 1.4 权限适配(iOS15适配) II . 接入代码示例 2.1 在AppDelegate头文件 ...

  8. iOS 关闭大部分应用开屏广告

    操作步骤: 1.打开「设置」 2.找到「屏幕使用时间」打开 3.找到「内容和隐私限制访问」并打开「内容和隐私访问限制」 4.下滑找到「Apple 广告」设置为不允许 注意:只能去除符合苹果设计规范的开 ...

  9. iOS逆向之网易云音乐去除开屏广告

    最近更换了自己的Apple账号,然后发现网易云音乐在该区没有上架.由于不想在一台手机上搞两个账号互相切换,于是便想到将App重签名一下安装到手机中.同时,自己蛮讨厌开屏广告的,就顺手写了个Tweak来 ...

最新文章

  1. php各种api接口,PHPSAPI接口
  2. 今天说的是必须要熟练掌握的归并排序
  3. 关于 AppDelegate 、UIApplication 简单的用法
  4. nginx基本配置与参数说明
  5. ubuntu禁用锁屏
  6. CentOS安装Mysql8各种坑。。。
  7. LeetCode 530二叉搜索树的最小绝对值差-简单
  8. 文件操作函数(读写)
  9. 解决URI is not registered (Settings | Languages Frameworks | Schemas and DTDs)
  10. java找三个数最大_用Java程序找最大的数字(4)
  11. SQL Server 2014新特性:其他
  12. 幅频响应 matlab画法,MATLAB环境下频率响应曲线的绘制方法.pdf
  13. Git(1):一个能够快速下载Git.exe的方法
  14. python 网易云音乐uc缓存转换mp3
  15. 《寄生虫》横扫奥斯卡,Python告诉你这部电影到底好在哪儿?
  16. 推荐几款实用性强的外业勘察地图软件
  17. Windows常用cmd命令总结
  18. 教你如何在短期内做好会员运营快速拉新用户
  19. 菜鸟教程android数据库,Flutter - Android 菜鸟教程打包
  20. 2022年网站快速排名优化 方法是什么?

热门文章

  1. 大数据平台hadoop运维之hadoop入门-高俊峰-专题视频课程
  2. 密码学认证密钥交换协议安全性和常见攻击-更新中
  3. 2022年竞赛打榜,神经网络还是干不过树模型??
  4. android 仿简书评论,Android仿简书搜索框效果的示例代码
  5. 2017年8月9日 星期三 --出埃及记 Exodus 28:31
  6. NLP自然语言处理系列-基于知识图谱的电影推荐实战
  7. 无失真压缩法可以减少冗余_多媒体压缩技术概念 多媒体的基本概念
  8. FastJson之json字符串与javabean的互相转换
  9. 如何在 Mac 中运行 Office 办公软件?
  10. CMMI2.0之我见-过程质量保证PQA