`
dcj3sjt126com
  • 浏览: 1825488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iOS应用启动速度

    博客分类:
  • IOS
 
阅读更多

http://ke.indiebros.com/2012/08/20/ios-app-launch-time-optimization/

很多app的开发者都不重视app的启动速度,这对于碎片化使用情景的用户来说,简直是灾难。

iOS应用的启动速度

应用启动时,会播放一个放大的动画。iPhone上是400ms,iPad上是500ms。最理想的启动速度是,在播放完动画后,用户就可以使用。

如果应用启动过慢,用户就会放弃使用,甚至永远都不再回来。抛开代码不谈,如果抱着PC端游和单机游戏的思维,在游戏启动时强加公司Logo,启动动画,并且用户不可跳过,也会使用户的成功使用率大大降低。

iOS系统的“看门狗"

为了防止一个应用占用过多的系统资源,开发iOS的苹果工程师门设计了一个“看门狗”的机制。在不同的场景下,“看门狗”会监测应用的性能。如果超出了该场景所规定的运行时间,“看门狗”就会强制终结这个应用的进程。开发者们在crashlog里面,会看到诸如0x8badf00d这样的错误代码(“看门狗”吃了坏的食物,它很不高兴)。

场景 “看门狗”超时时间
启动 20秒
恢复运行 10秒
悬挂进程 10秒
退出应用 6秒
后台运行 10分钟

值得注意的是,Xcode在Debug的时候,会禁止“看门狗”。

如何测试启动时间

两种方法:一种使用NSLog,另外一种使用Time Profiler。

  • 使用NSLog
 1 CFAbsoluteTime StartTime;
 2 int main(int argc, char **argv) {
 3      StartTime = CFAbsoluteTimeGetCurrent();
 4      // ...
 5 }
 6 
 7 - (void)applicationDidFinishLaunching:(UIApplication *)app {
 8      dispatch_async(dispatch_get_main_queue(), ^{
 9         NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime);
10      });
11      // ...
12  }
  • 使用Time Profiler
    • Instruments->Time Profiler
    • Profile你的app
    • 切换到CPU strategy view,找到你的app启动的第一帧
    • 搜索-[UIApplication _reportAppLaunchFinished]
    • 找到包含-[UIApplication _reportAppLaunchFinished]的最后一帧,即可计算出启动时间

iOS App启动过程

  • 链接并加载Framework和static lib
  • UIKit初始化
  • 应用程序callback
  • 第一个Core Animation transaction

链接并加载Framework及static lib时需要注意:

  • 每个Framework都会增加启动时间和占用的内存
  • 不必要的Framework,不要链接
  • 必要的Framework,不要票房为Optional
  • 只在使用在Deployment Target之后发布的Framework时,才使用Optional(比如你的Deployment Target是iOS 3.0,需要链接StoreKit的时候)
  • 避免创建全局的C++对象

初始化UIKit时需要注意:

  • 字体、状态栏、user defaults、main nib会被初始化
  • 保持main nib尽可能的小
  • User defaults本质上是一个plist文件,保存的数据是同时被反序列化的,不要在user defaults里面保存图片等大数据

应用程序的回调:

  • application:willFinishLaunchingWithOptions:
  • 恢复应用程序的状态
  • application:didFinishLaunchingWithOptions:

我一直认为设计的本质是折衷。当你为了100ms的启动速度优化欢欣不已,而无视那长达10秒的启动动画时,应该想想究竟什么是应该做的。做正确的事情比把事情做好更重要。

 

http://blog.csdn.net/dqatsh/article/details/6098849

 

有一天,公司的网络出现的问题,所有的机器都不能访问外网了。突然我发现一直运行正常的iPad应用在启动时经过较长时间的等待后就退出了。

第一反应:是不是对网络通信的处理有问题,导致程序崩溃?那就进入debug跟踪一下吧。奇怪的是,在debug模式下,尽管启动时间较长,但仍然能正常运行下去。(启动时间长的原因是,启动时需要访问服务器,获取数据,由于网络有问题,时间就长了)

 

我一度怀疑是不是ios的bug,但我试了很多其他的应用,为什么其他应用都能正常运行呢?

经过长时间的google,终于对这个问题的产生理解的越来越清楚了。(google是需要技巧的,不合适的关键字往往找不到想要的答案,不要放弃,多尝试,要相信你不是第一个遇到这个问题的人)

 

原来,启动时间太长,ios会认为应用不用正常启动,所以把应用直接给退出了。并不是应用崩溃了。

那为什么debug时没有这个问题呢? 参见文档: http://developer.apple.com/library/ios/#qa/qa2009/qa1592.html

 

如此看来,解决问题的办法就是尽快的结束启动过程。网络访问通过线程解决,这样就不会阻塞主线程的运行了。

参见: http://iphone.demay-fr.net/2010/05/don’t-perform-network-reachability-tests-in-applicationdidfinishlaunching/

 

最后,为什么网络有问题时通信时间就很长呢?我已经设置了timeout为20秒,显然远远大于这个时间。原来,建立网络连接前需要做域名解析,但网关出现问题后,dns解析也不正常了。dns的超时时间似乎是应用控制不了的。

分享到:
评论

相关推荐

    阿里数据iOS端启动速度优化心得

    背景 7月26号我们阿里数据iOS端发布了...iOS应用的启动可分为pre-main阶段和main()阶段,其中系统做的事情依次是: 1. pre-main阶段 1.1. 加载应用的可执行文件 1.2. 加载动态链接库加载器dyld(dynamic loader) 1.3

    MealTime:一个简单的REST API午餐菜单,可连接到用Swift编写的iOS应用

    随后的应用启动速度更快。 该项目仅用于学习目的,不用于生产用途。 iOS应用程序未填充功能,仅是从REST API获取数据并将其以很好的方式显示在iOS应用程序上的功能。 我想了解整个生态系统,或者至少要尽可能了解...

    iOS 多个UIScrollView嵌套/个人中心页

    不定时更新~目录1、暗黑模式2、AppleID登录应用3、AVFoundation相关3.1、...启动速度6.8、iOS APM应用性能监控管理(doing)6.9、ipa瘦身之扫描无用资源6.10、多个UIScrollView嵌套/个人中心页7、iOS Crash防护8、...

    iPhone应用程序开发指南.中文.pdf

    应用程序图标和启动图像 21 Nib文件 21 处理关键的应用程序任务 22 初始化和终止 22 响应中断 23 观察低内存警告 25 定制应用程序的行为 25 以景观模式启动 25 和其它应用程序进行通讯 26 实现定制的URL模式 27 显示...

    iOS IPA瘦身和二进制重排

    1、暗黑模式2、AppleID登录应用3、AVFoundation相关3.1、AVFoundation 高仿微信...启动速度6.8、iOS APM应用性能监控管理(doing)6.9、ipa瘦身之扫描无用资源7、iOS Crash防护8、WKWebView相关8.1、WKWebView的使用8.2、...

    coderZsq.project.ios:适用于iOS的轻巧高效的应用程序开发工具集,可加快开发速度

    然后,运行以下命令启动服务器。 $ . run.sh内容适应iOS13暗模式。 在此项目中使用SQExtension的一部分。 预先准备的WEBP格式图像。 不必到处寻求资源,只需要张开嘴。 在整个宇宙中为您搜索资源。 庞大的电影资源...

    Dart开发Android应用Sky.zip

    应用完全依赖网络,没有网络的情况下应用便不能运行,并且启动应用的时候都需要先用一两秒下载数据。但是实际上,这些都可以通过缓存解决。通过 HTTP 协议提供服务可以大大缩短开发时间。和普通的“编写、编译、安装...

    BirdBlox-FinchBlox-JS-Frontend:新的Hummingbird iOS和Android应用程序HTMLJS网站组件。 允许使用类似Snap!的界面对蜂鸟进行编程

    它旨在在包含应用程序(例如iOS或Android应用程序)中运行。 js代码本身无法做的任何事情(发出蓝牙命令,显示对话框,保存文件)都以get / post请求的形式传递到包含应用程序(后端)。 为了确保后端始终具有前端...

    jinyang-master.zip

    微信小程序由于体积小,不占内存,启动速度快,页面交互好得到了广大用户的喜爱,相比于IOS,Android的APP烧内存,占缓存,启动速度慢,运行卡顿等缺陷,微信小程序应用非常广泛。由于天气查询在我们日常生活中经常...

    XamarinIoTWorkshop:一个讲习班,演示如何使用Xamarin应用程序从移动设备收集IoT数据,如何使用Azure IoT中心将数据聚合到云中

    Xamarin物联网研讨会CI工具建立状态iOS应用中心 App Center,Android关于该研讨会将使用在和创建的移动应用程序将您的移动设备连接到后端。 该应用程序使用从设备的加速度计和陀螺仪收集传感器数据,使用在应用程序...

    React Native Vector Image-从SVG生成的iOS / Android本机矢量资产。-JavaScript开发

    渲染速度更快–比react-native-svg快约5倍。 较小的JS捆绑包=更快的启动。 对暗模式的本机支持。 安装yarn添加react-native-vector-image @ klarna / react-native-drawable-android用法由于无法通过Metro开发服务器...

    绿色守护 greenify v 2.5.2 Beta1

    + 不同于『App Quarantine』,你可以方便的以往常的方式启动应用,不需要特殊的『应用启动小工具』,不用记得每次运行完后手动冻结(禁用)。 + 不同于『Autostarts』,你既能享受到它的绝大部分优势,又不必跟复杂...

    masuilab-doorkey-app:Masui-lab DoorKey Unlock App for iOSAndroid

    SFC Masui Lab的Delta Building门是一个简单的应用程序,用加速度计解锁iOS6或更高版本,Android不是Cordova制造的,加速UI 2. 截图和演示视频 开头的动画本来是我做的一个SVG动画,目的是让它成为应用程序的启动...

    计算机应用技术基础任务1任务2答案.doc

    固态硬盘相比机械硬盘存取速度快、体积小、发热高、防震抗摔A. 错误 6. 现在硬盘基础上都采用了SATA2结构形式A. 错误 7. 要进入BIOS设置界面,通常情况下是在电脑启动自检状态下,根据提示,按DEL或F 2等键B. 正确 ...

    WLED-GUI:适用于WLED的跨平台桌面应用

    看起来类似于android / ios的WLED应用 :check_mark_button: 跨平台 :check_mark_button: 多个WLED支持 :check_mark_button: WLED网页在本地加载,以加快加载速度并减轻esp :check_mark_button: 系统启动时自动...

    Android项目源码开源的 Material Design 豆瓣客户端.zip

    在豆瓣应用最开始的版本中,也曾有过 Material Design 的尝试,但随着和 iOS 风格设计的杂糅,逐渐显得不合时宜,以至于最终选择了完全的 iOS 风格。我对此一直感到有些遗憾,况且 Material Design 也是一款更加优秀...

    react-native-boilerplate:具有Typescript,Redux,Jest和Enzyme支持的结构良好的React Native Boilerplate,以及部署坚如磐石的应用程序所需的一切

    它提供了更快的移动开发速度,并且可以在iOS,Android和Web上更有效地共享代码,而不会牺牲最终用户的体验或应用程序质量。 该样板对于启动项目很有用,因为它提供了下面指定的最新功能强大的工具。特征该样板包括...

    FetchRewards-Coding-Exercise

    FetchRewards编码练习目标该项目的目标是创建一个iOS应用程序,该应用程序将使用开源SeatGeek API并向用户显示事件。 用户将能够搜索这些事件以及他们可能感兴趣的最喜欢的事件。这些最喜欢的事件将在应用程序启动...

    WPS Office 2017 v10.1.0.6391 个人正式版.zip

    体积小,WPS 仅仅只有MS的12分之1,它在不断优化的同时,体积依然保持小于同类软件,不必耗时等待下载,也不必为安装费时头疼,几分钟即可下载安装,启动速度较快,让你的办公速度“飞起来”! 多种界面切换,遵循...

    alfred powerpack3.3

    阿尔弗雷德是Mac OS X的键盘驱动的生产力应用程序,帮助你启动应用程序和搜索本地计算机和网络以极快的速度。 产品特点: *应用程序启动器:用一个快捷键启动任何应用程序。阿尔弗雷德将学习你经常使用,当你搜索...

Global site tag (gtag.js) - Google Analytics