-
背景:
启动图之后常常需要展示全屏的app广告,在广告结束之前,不能看见app首页。 -
难点:
(1)请求广告图的网络请求超时时间一般在3秒之内;
(2)启动图的展示时间非常短暂,可能还没有等请求广告图的网络请求结束,就加载出了app首页;
(3)如果在广告图的网络请求结束之后再设置 AppDelegate 的 window?.rootViewController ,在弱网情况下,可能会出现长时间黑屏。
- 思路1:
先设置 AppDelegate 的 window?.rootViewController 之后,再进行广告页的网络请求。
这样做的优势是简单,广告页的网络请求与普通网络请求无异,请求回了数据就展示;不足的是启动图之后已经看见了app首页,然后才出现广告图,这种方式,就类似于app内的广告弹窗功能,与需求不符。
- 思路2:
先进行广告页的网络请求,请求结束后,再设置 AppDelegate 的 window?.rootViewController 之后。
在弱网情况下,启动图之后,由于长时间不设置 rootViewController ,会导致一段时间的黑屏。在黑屏期间,就需要创建一个假的启动图,实际上是一个控制器,长相跟启动图完全一样。将这个“启动图控制器”暂时设置为 rootViewController。
相关代码:
1、AppDelegate.swift文件:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.createWindow()
return true
}
/// 创建window
func createWindow() {
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.makeKeyAndVisible()
self.window?.rootViewController = LaunchScreenDefaultController()
ConfigTool.share.getGuidePages(successBlock: { (modelArray) in
let tabBarController = BaseTabBarController()
self.window?.rootViewController = tabBarController
}, failureBlock: {
let tabBarController = BaseTabBarController()
self.window?.rootViewController = tabBarController
})
}
2、app的启动图用的是 LaunchScreen.storyboard 方式(直接在这个storyboard画布上放上启动图即可,这样能够适配各种机型,是实现启动图最简单的方式)。
3、LaunchScreenDefaultController.swift文件,是一个长相与启动图完全一样的vc,作用是在进行广告图的网络请求期间,暂时设置为 AppDelegate 的 window?.rootViewController 。
4、广告图网络请求的超时时间设置为3秒。
网友评论