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应用启动速度优化是一个综合性的过程,涉及到编译器优化、资源管理、代码结构优化等多个层面。通过深入理解iOS应用的启动流程,结合性能监控和调试工具,开发者可以系统地进行性能提升,从而为用户提供更...
7. **性能优化**:考虑到启动视频可能会影响应用的启动速度,确保视频文件大小尽可能小,避免过于复杂的视频处理,以提高加载速度。 通过以上步骤,你就可以在iOS应用中实现启动视频功能。但需要注意,启动视频的...
iOS APP的启动速度优化是提升用户体验的关键因素,尤其是在竞争激烈的移动应用市场中。启动速度不仅影响用户的第一印象,还可能直接影响用户的留存率。本文将详细分析App启动过程中的各个环节,并提出相应的优化策略...
1. **性能优化**:引导页的加载速度直接影响用户体验,因此应确保资源文件(如图片)的大小合适,避免拖慢应用启动速度。 2. **设计一致性**:引导页的设计风格应与应用的整体设计保持一致,以增强品牌识别度。 3....
总之,设计和实现iOS应用启动时的广告页是一个需要综合考虑用户体验、品牌传播和应用性能的任务。通过合理的布局、动画设计以及性能优化,可以创建一个既有效传达信息又不损害用户体验的启动广告页。
在iOS应用开发中,高性能意味着更少的资源消耗,更快的响应速度以及更好的用户体验。书中涵盖了以下几个关键知识点: 1. **内存管理**:深入讲解Objective-C和Swift中的内存管理机制,如ARC(Automatic Reference ...
1. 合理控制广告加载的时机,避免阻塞主线程,影响应用启动速度。 2. 考虑不同设备的屏幕尺寸,确保启动页适配各种设备。 3. 尊重用户隐私,遵循广告联盟的政策,不要在未经用户许可的情况下收集个人信息。 4. 对于...
7. **捆绑资源和编译优化**:Xamarin支持AOT(Ahead-Of-Time)和LLVM编译,可以显著提升应用启动速度。AOT编译会将.NET代码预先编译为机器码,而LLVM则优化代码,减小可执行文件大小。 8. **调试与性能分析**:使用...
《大话移动APP测试:Android与iOS应用测试指南》是一本深入探讨移动应用测试领域的专著,由资深测试专家陈晔撰写。这本书旨在为开发者、测试工程师以及对移动应用质量控制感兴趣的人士提供全面而实用的测试策略和...
这个压缩包“ios-启动动画.zip”可能包含了用于创建iOS应用启动动画的相关资源和代码示例,特别是文件“开场动画”。 启动动画在iOS中通常是通过`LaunchScreen.storyboard`或`LaunchImages`来实现的,它们是应用的...
这个压缩包“IOS应用源码——SplashView.rar”包含了实现iOS应用启动页功能的相关源代码,对于学习和理解iOS应用的启动逻辑以及自定义启动页的设计有着重要的参考价值。 首先,我们需要了解iOS中的启动过程。应用...
在iOS应用开发中,尤其是在游戏场景中,文本渲染速度和效率至关重要,因为它们直接影响到用户体验和应用性能。CCLabelFastAndSlow可能提供了对比这两种渲染方式的机会,开发者可以通过对比来选择更适合项目需求的...
注意,启动界面应避免包含动态内容,因为它仅在应用启动时显示一次。 4. **适配不同设备和方向**:为了兼容不同的iOS设备和屏幕方向,需要确保启动界面在iPhone、iPad以及横屏和竖屏模式下都能正确显示。这可以通过...
这个"ios应用源码之二维码扫描应用demo 2018127"的压缩包提供了一个实际的iOS二维码扫描应用的示例代码,这对于初学者或者开发者来说是很好的学习资源。 一、核心框架:AVFoundation iOS系统中用于处理多媒体数据...
此资源"IOS应用源码——Splash.rar"提供了一个关于如何创建和管理iOS应用启动屏幕的源代码示例。 1. **启动屏幕的作用**: - 提供视觉反馈:当应用程序正在初始化和加载数据时,启动屏幕可以给用户一种即时响应的...
在iOS应用开发中,启动画面(Splash Screen)是用户打开应用程序时首先看到的界面,它为应用程序的加载过程提供了一种视觉反馈。本教程将详细讲解如何在iOS 5应用程序中添加启动画面,以提升用户体验。 一、启动...
考虑到GIF文件可能较大,影响应用启动速度,可以对GIF进行压缩或优化。也可以考虑在不同设备或网络环境下加载不同的分辨率版本。 9. **Demo分析**: "ios 播放gif启动动画Demo"应包含了使用上述库实现GIF播放的...
"SplashDemo"是一个针对iOS应用的源码项目,专注于启动屏幕(Splash Screen)的实现。在这个项目中,我们可以深入理解如何在iOS应用中创建并管理启动屏幕,以及它在应用程序生命周期中的作用。 首先,启动屏幕在iOS...
在iOS应用开发中,为了提升用户体验和品牌宣传,很多开发者会在APP启动时展示一幅插画或者广告。这种功能实现起来并不复杂,对于初级到中级的iOS开发者来说,完全可以自行编写。下面我们将详细探讨如何实现iOS APP...