http://www.code4app.com/forum.php?mod=viewthread&tid=7632&extra=page%3D2%26filter%3Dsortid%26orderby%3Ddateline%26sortid%3D1

封面图:
文/Flying_Einstein(简书作者)

常见的几种启动图风格

  • 静态图类型 :微信
  • 图片不变,有动画效果 :京东
  • 随着节日或者时间动态更换的 :百度云、网易公开课


网易公开课

注意:笔者说的启动图并不是广告页,启动图是不接受点击事件的,但是广告页是接受点击事件的,点击后一般会跳转到网页。如下:

这几种风格的启动图怎么实现的?

  • 静态图类型 :这种比较简单,开发者可以使用LaunchImage和LaunchScreen.storyboard的任何一种方式添加所需的正确格式的图片
  • 图片不变,有动画效果 :这种方式,笔者认为在实现方式上和第三种是一样的,就不在赘述,感兴趣的读者在看完第三种实现方式后,可以尝试去做。
  • 随着节日或者时间动态更换的 :这种方式,也就是笔者今天着重要讲的,原理及实现方式。

像百度云或者网易公开课一样动态更换APP启动图原理

  • 其实你看到的不是一张图片 :读者仔细观察就会发现,使用这种方式的的启动图,用的不是一张图片,而是两张。我们拿百度云来举例:

    可以看到,两张图片的区别就是,底部都是一样的,而第一张上半部分是空白。其实,网易公开课和支付宝德也是如此。第一张图片是内容兼容性很强的图片,就是一个版权说明加上一个类似于app logo的样式,上面空白部分可以根据节日的不同,调整展示的样式

  • 这两张图片还有其他的不同吗 :因为笔者经常使用这几款app,发现有的时候第二张图片是不显示的,显示完第一张图片直接跳到app主页了。笔者认为,第一张图片就是放在[LaunchImage或者LaunchScreen.xib中的图片,是不会改变的。第二张图片则是从网上获取的,而且可以根据是否获取到相应的图片网址决定第二张图片能否显示。
  • 为什么要这么做 :有的读者可能有疑问,为什么要这么做?难道不可以直接更换掉第一张启动图吗,或者不显示第一张只显示第二张?答案:NO!
    • 更换第一张图片?抱歉,更换不了,如果你使用的是LaunchScreen.xib或者LaunchScreen.Storyboard,只要你的app启动过,那张图片就永远的缓存在app里了,以后每次启动都会出现。
    • 网络请求有延时,如果不放第一张图片,只放第二张图片,会出现短暂的黑屏。
    • 从产品的角度来讲,也不合理。比如:植树节的时候我展示了和环保有关的内容,如果过了植树节,那么正常情况下我不展示该内容就可以了,后台不返回相应的图片网址,展示完第一张图片就ok了。如果没有第一张图片,那么过了植树节,我就需要把网址更换,需要一个下载图片的过程,从用户体验来讲也不好,时间延迟也会浪费流量。

关于猜测的一点验证?

  • 为了验证自己的猜想,笔者使用抓包工具青花瓷进行了抓包
  • 笔者抓的是百度云的包,我们先来看第一张截图

这是一个post的请求方式,可以看到在url路径中,有image/diff这段,笔者判断这段路径返回 的参数是用来决定是否更换第二张图片的

  • 我们再来看第二张截图

    紧接着第一次网络请求,就进行了这次网络请求,我们在path路径下可以看到app.gif,笔者认为这个网址就是图片的地址,百度云的第二张图片有动画效果,笔者猜测可能是gif格式的图片



代码怎么实现这种启动图方式?

  • 第一张图片使用LaunchScreen.Storyboard方式

    • 这一步相信读者都会,笔者就不再赘述
  • 第二张图片如何展示
    • 第一步就是进行一次网络请求,判断有没有相应的图片网址,没有的话就就不显示,有的话拿到图片的网址进行第二次网络请求
    • 请求下来图片后,笔者参考通过LaunchScreen自定义启动动画实现启动图更换图片,而且可以给启动图添加动画效果
      这一步是获取LaunchScreen.storyboard里的UIViewController,UIViewController 的identifer是LaunchScreen

      [Objective-C]  查看源文件  复制代码
      ?
      1
      2
      3
      4
      5
      UIViewController *viewController = [[UIStoryboard storyboardWithName: @"LaunchScreen" bundle:[ NSBundle mainBundle]] instantiateViewControllerWithIdentifier: @"LaunchScreen" ];
      UIView *launchView = viewController.view;
      UIImageView  * Imageview= [[UIImageView  alloc]initWithFrame:[UIScreen mainScreen].bounds];
      [launchView addSubview:Imageview];
      [ self .view addSubview:launchView];

      这一步是获取上次网络请求下来的图片,如果存在就展示该图片,如果不存在就展示本地保存的名为test的图片

      [Objective-C]  查看源文件  复制代码
      ?
      1
      2
      3
      4
      5
      6
      7
      NSMutableData * data = [[ NSUserDefaults standardUserDefaults]objectForKey: @"imageu" ];
      if (data.length>0) {
          Imageview.image = [UIImage imageWithData:data];
      } else {
      Imageview.image = [UIImage imageNamed: @"Test" ];
      }

    • 下面这段代码,是调用AFN下载文件的方法,异步方式下载,但是在这里异步方式下载有一个问题,就是这次下载完成的图片,下次启动时才会展示,读者可以换成同步的,但是同步下载会有时间延迟,用户体验不好,下载完图片后,将图片以二进制的形式存在本地,笔者用的是userdefault,这是不科学的,读者可以存在其他文件夹,
      [Objective-C]  查看源文件  复制代码
      ?
      01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      11
      12
      13
      14
      15
      NSURLSessionConfiguration *configuration = [ NSURLSessionConfiguration defaultSessionConfiguration];
      AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
      NSURL *URL = [ NSURL URLWithString: @"http://s16.sinaimg.cn/large/005vePOgzy70Rd3a9pJdf&690" ];
      NSURLRequest *request = [ NSURLRequest requestWithURL:URL];
      NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress: nil destination:^ NSURL *( NSURL *targetPath, NSURLResponse *response) {
         NSURL *documentsDirectoryURL = [[ NSFileManager defaultManager] URLForDirectory: NSDocumentDirectory inDomain: NSUserDomainMask appropriateForURL: nil create: NO error: nil ];
         return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
      } completionHandler:^( NSURLResponse *response, NSURL *filePath, NSError *error) {
         NSLog ( @"File downloaded to: %@" , filePath);
         NSData * image = [ NSData dataWithContentsOfURL:filePath];
         [[ NSUserDefaults standardUserDefaults]setObject:image forKey: @"imageu" ];
      }];
      [downloadTask resume];

    • 笔者在展示完第二张图片后,又添加了展示广告位的代码,这样就是app启动时比较完整的过程了。

这段代码,可以实现第二张图片有3D的动画效果,动画结束后,进行同步的网络请求,请求的是广告页图片,之所以用同步的是因为,如果用同步的话主页面显示后,图片才会加载完成显示。

[Objective-C]  查看源文件  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
[UIView animateWithDuration:6.0f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        //launchView.alpha = 0.0f;
        launchView.layer.transform = CATransform3DScale(CATransform3DIdentity, 1.5f, 1.5f, 1.0f);
    } completion:^( BOOL finished) {
                NSString * ad_imgUrl  = @"http://www.uimaker.com/uploads/allimg/121217/1_121217093327_1.jpg" ;
                AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
                [BBLaunchAdMonitor showAdAtPath:ad_imgUrl
                                         onView:appDelegate.window.rootViewController.view
                                   timeInterval:5
                               detailParameters:@{ @"carId" :@(12345), @"name" : @"奥迪-品质生活" }];
                   [launchView removeFromSuperview];
    }];

demo效果

总结:这是笔者的实现过程,希望可以给读者一点思路,如果读者觉得有什么不明白的,或者有更好的方式,希望能联系笔者,或者在评论中给出建议。

如何做到像百度云或者网易公开课一样动态更换APP启动图相关推荐

  1. 麻省理工计算机导论公开课,网易公开课给大一新生“量身订做”精品课程

    速途网讯 耶鲁大学的<金融理论>.哈佛大学的<计算机导论>.可汗学院的<线性代数>,除了专业课,你还可以感受哈佛的<幸福课>,还可以透过麻省理工学院&l ...

  2. 自媒体平台资讯06:网易有网易号,有网易公开课自媒体,现在又有网易有道号?...

    舍得哥前段时间分享过网易公开课自媒体平台,不知道身边的朋友入住了没,要不再去回顾下? 这是网易公开课自媒体的后台截图 总共发布两篇文章,貌似流量不行啊,尴尬了,不能怪平台,怪自己的文章不适合那个平台 ...

  3. Python语言程序设计之urllib.request抓取页面,网易公开课之《麻省理工学院公开课:算法导论》

    Python语言用urllib.request模块抓取页面非常简单,再将抓取的页面内容用re模块解析,找出自己想要的东西.下面就就此方法来抓取网易公开课之<麻省理工学院公开课:算法导论>, ...

  4. 【华为云专家技术公开课】7月4日直播,报名观看赢取好礼

    [导语]新手大咖齐相聚,畅谈云端新科技.2019年7月4日,华为云专家技术公开课直播将在云视界进行线上直播,本期华为云MVP.敏捷创新教练王立杰将就<敏捷项目管理的关键点>进行深入讲解,让 ...

  5. Auto.js Pro安卓免ROOT引流脚本开发系列教程27网易公开课(5)-UI界面构建

    课程内容 脚本前端UI界面的构建 创建话术输入框(随机话术) 创建勾选框(性别选择.话术前加入昵称.话术后添加随机符号表情) 开发文档 在线文档 APP名称 网易公开课 APP版本 安卓客户端:v6. ...

  6. ionic2入门教程(三)高仿网易公开课(1)

    Ionic2系列之高仿网易公开课(1) 0.登录界面实现截图和官方图片对比 我的 官方 1.新建一个blank项目 打开cmd,输入ionic start Ionic-NetEaseOpenCours ...

  7. Auto.js Pro安卓免ROOT引流脚本开发系列教程23网易公开课(1)-前言

    APP名称 网易公开课 APP版本 安卓客户端:v6.8.1 APP简介 网易公开课提供来自世界一流名校和著名机构的上万集精品视频课程,涵盖各类热门领域,与Web版保持同步更新.速度流畅,画面高清.支 ...

  8. Auto.js Pro安卓免ROOT引流脚本开发系列教程26网易公开课(4)-关注用户

    APP_关注用户() 返回值类型 说明 布尔型 true,关注成功 false,关注失败 等待个人资料页出现(判断是否在个人资料页) 判断关注按钮节点是否存在 判断是否已关注 关注成功后随机延时 开发 ...

  9. Auto.js Pro安卓免ROOT引流脚本开发系列教程25网易公开课(3)-取用户性别

    APP_取用户性别() 返回值类型 说明 整数型 返回值 性别 0 女 1 男 2 无 等待个人资料页出现(判断是否在个人资料页) 判断性别节点是否存在 在性别节点范围内取色 根据色值判断性别 开发文 ...

最新文章

  1. showSoftInput不起作用
  2. 用WT516P6Core离线语音模块在烧录和连接MCU时要注意避开的坑,要不挠掉头发也钻不出来!我差点套进去了,还好他们技术人员给力!把我给扯出来了!做了一个踩坑记录分享给大家
  3. 利剑无意之Dubbo 面试题
  4. 如何利用TensorFlow.js部署简单AI版「你画我猜」
  5. php调用pdf2html,php html2pdf
  6. java用mysql存储图片_Java存储图片到Mysql
  7. Linux 光盘 远程拷贝,Linux远程拷贝scp命令
  8. Java 8新特性探究(十一)Base64详解
  9. 15个简单的JS编码标准让你的代码更整洁
  10. Duilib资源文件打包成DLL并调用
  11. 吸料机的工作原理过程
  12. 网站优质内容细则及示例说明
  13. Unity Animator Animation详解及应用实例教程
  14. IP地址分类(A类 B类 C类 D类 E类)
  15. Facebook Google广告开户流程
  16. 基于Unity3D 的Vuforia SDK开发基础教程
  17. 在git clone报错
  18. equest.getRequestDispatcher方法的作用是什么
  19. layui实现后台管理系统界面(亲测可用)
  20. 【C语言】贪吃蛇游戏的实现(二)

热门文章

  1. python 代码库之遍历ttf字库编码和字符(含demo)
  2. 基于MATLAB的差分方程战斗模型
  3. 玩客云刷linuxARMBIAN当服务器过程记录
  4. c+primer 学习笔记 6
  5. fork炸弹c语言能否运行,Fork炸弹简析和应对方法
  6. 华为荣耀手表GS3 评测怎么样
  7. Nobody gives away anything valuable for free.
  8. vue3+ts+vite后台管理模板
  9. ChatGPT实现代码生成
  10. ADSL宽带共享问题