16.6.2 iPhone应用环境(2)
应用启动阶段。用户在主菜单按某个应用的图标启动该应用,这是启动应用的通用方法。当然还有其他启动应用的方法,例如通过一个网页的URL启动一个Safari应用;
系统调用iPhone应用的主函数UIApplicationMain(),它实例化单个应用对象和委托对象,并装载从Info.plist文件中获得的应用主nib文件,UIApplicationMain函数开始了应用的主事件循环;
iPhone应用发送applicationDidFinishLaunching消息到它的委托。
接着做以下几件事:
装载和恢复在前一个进程中保存的应用状态和数据;
创建和显示初始视图,更新状态位和模式(Model)数据,如果应用委托做这些事情,系统从应用bundle中装载图像文件然后显示;
应 用接收并响应事件,重画或部分改变用户界面,例如,当应用正在运行时,应用委托可以接收到 applicationDidReceiveMemoryWarning消息,它应该立即释放一些应用不需要的对象或资源,如果应用委托不能响应这个消 息,或者没有释放足够的内存,应用可能被终止;
用户按Home键终止应用;
应用发送applicationWillTerminate消息到应用委托,这时应用应该保存应用的状态和数据,删除创建的所有临时文件;
应用终止。
2.应用中断
除用户按Home键中断iPhone应用外,还有许多其他方式能中断应用,例如来电、来短信、日历提示(calendar alert)或用户按Sleep键。与按Home键不同,这些中断都是暂时的。然而,当用户决定拨出一个电话或回复一条短信时,应用将被终止。
下面内容描述当来电时将发生什么。对于来短信和日历提示等,这些过程是相同的,只是展现给用户的信息类型不同而已。
系统检测到一个来电;
系 统调用应用委托的application Will Resign Active方法,同时系统屏蔽其他触摸事件传递到应用,开发者能用该方法撤销定时器,throttle back your OpenGL frame rates(如果使用OpenGL),使应用进入睡眠模式,例如,作为游戏开发者,可以利用该通知暂停游戏,在睡眠状态,应用不做任何工作;
系统将显示来电信息的提示面板,系统也提示用户接收或忽略来电;如果用户忽略来电,系统将调用应用委托的applicationDidBecomeActive方法,这时,应用可以启动定时器或与定时器相关的活动,同时系统也使能触摸事件在应用中的传递;
如 果有来电,系统将调用应用委托的applicationWillTerminate:方法,应用将被终止,保存应用的状态和数据,为下次启动该应用备份。 当中断完成后,系统可能再次启动原来的应用。例如,用户接通来电后挂断电话,系统将重新启动原来的应用。如果用户接通电话后,按Home键然后启动其他的 应用,系统将不会启动原来的应用。
如果在运行应用期间,用户按Sleep键,系统将调用应用委托的applicationWill ResignActive方法而不提示用户任何信息。这时系统将进入睡眠状态而不执行任何活动。同样地如果用户按Wake键,系统将调用应用委托的 applicationDidBecomeActive方法,这时系统可以重启定时器或做任何其他想做的事情。
3.应用bundle
当创建一个应用时,Xcode封装整个应用为bundle。bundle是一个包含相关资源的目录,它包括应用可执行文件和相关的资源,如应用图标和图片资源等。表16-5表示一个典型应用的bundle。
表16-5 典型的应用bundle
文 件 | 描 述 |
MyApp | 包含应用代码的可执行文件,文件 名称是应用的名称去掉.app扩展名 |
Settings.bundle | 设置bundle是在设置应用中添加应 用首选项的文件包,它包含属性列 表和其他资源文件,配置和显示首选项 |
Icon.png | 57 × 57像素图标表征在设备主页 上的应用,系统自动为该图 标增加平滑效果 |
Icon-Settings.png | 29 × 29像素图标表征在位于设 置模块中的应用 |
MainWindow.nib | 应用的主nib文件,包含在应用启动 时默认的接口对象。通常它包括应用 的主窗口对象和应用代理对象的实例。 其他的接口对象从附加的nib文件装载, 或由应用程序装载。主nib文件的名称 可以在文件Info.plist中改变,并与 NSMainNibFile关键词配对 |
Default.png | 应用从开始启动直到完全载入它的窗 口和用户界面期间,屏幕将显示 480 × 320像素的临时背景图像 |
Info.plist | 信息属性列表文件,它定义应用的关键 词和属性信息对,例如,bundle ID, 版本号和显示名称 |
sun.png(或其他资源文件) | 非地域资源(Nonlocalized Resources) 位于bundle目录的顶层(本例中sun.png 表征非地域资源),如果用户选择不同 的语言设置,非地域资源(Nonlocalized Resources)保持不变 |
en.lproj、fr.lproj、es.lproj 和其他特别语言项目目录 | 地域资源(Localized resources) 位于bundle 目录的子目录,子目录的名称为ISO 语言缩写加上后缀.lproj。例如,en.lproj fr.lproj和es.lproj目录包含English, French和 Spanish资源 |
一 个应用可以有本地化资源,但它也应该有支持各种语言版本的国际化资源目录language.lproj。开发者可以用NSBundle类的方法或 CFBundle函数获得本地和非本地图片和声音资源存储在应用bundle的路径。例如,可以用Objective-C代码获得图片资源sun.png 的路径:
- NSString* p_w_picpathPath = [[NSBundle mainBundle] pathForResource:@'sun'
- ofType:@'png'];
- UIImage* sunImage = [[UIImage alloc]initWithContentsOfFile:p_w_picpathPath];
调用mainBundle类的方法获得表征应用bundle的对象,请参考Resource Programming Guide for information on loading resources。
4.应用配置
为了保证应用启动后能正常运行,需要配置应用bundle的几个组件。开发者应该指定从系统识别应用到识别首选用户的属性范围和展示给用户的应用图像。
Xcode应用工程项目的文件Info.plist又称为信息属性列表,它包括关键词和配对的应用运行配置信息。信息属性列表的元素组织为一个结构,结构里的每个节点是一个实体。如array、 dictionary、 string等。
在Xcode的项目菜单里选择'Edit Active Target TargetName',然后选择属性栏,就能得到信息属性列表,如图16-33所示。
(点击查看大图)图16-33 信息窗口属性面板 |
上 述的属性面板显示了应用bundle的一些属性,但不是全部。当单击'Open Info.plist as File'或在Xcode项目中选择文件Info.plist,Xcode将显示属性列表编辑窗口,开发者可以编辑属性值和增加key-value对,如 图16-34所示。
(点击查看大图)图16-34 信息属性列表编辑器 |
Xcode可以自动地设置一些属性值,表16-6列出了文件Info.plist需要包含的重要的属性值。
表16-6 Info.Plist表
关键词 | 值 |
CFBundleDisplayName | 显示在应用图标下面的名称, 它应该支持所有的语言 |
CFBundleIdentifier | 标识应用bundle类型的字符串, 它应该是统一类型标识符 (Uniform Type Identifier,UTI), 例如,公司名是Ajax,应用名是 Hello,那么bundle标识符应该 是com.Ajax.Hello。bundle标识符 用于确认应用签名 |
CFBundleURLTypes | URL类型,每一个URL类型定 义一个Scheme,例如,http 或mailto |
CFBundleVersion | 应用bundle编译的版本号,它包 括一个或多个以 句号分隔开的整数 |
LSRequiresiPhoneOS | 布尔变量,标识应用是否只是运行 在iPhone OS。Xcode自动添加这 个关键词,并设置它的值为真, 开发者不需要改变这个关键词 |
NSMainNibFile | 标识应用的主nib文件名称的字符串, 如果开发者不想采用项目的默认 名称,可以改变这个关键词的值 |
UIStatusBarStyle | 识别应用启动时状态条风格的字 符串,这些字符串在文件 UIApplication.h中声明 |
UIStatusBarHidden | 布尔变量,决定应用启动时状态 条是否隐藏。设置True隐藏状 态条,默认值是False |
UIInterface-Orientation | 识别应用用户界面的初始方向 的字符串,这些字符串在 UIApplication.h头文件中 声明,默认类型是 UIInterfaceOrientationPortrait |
UIPrerenderedIcon | 布尔变量,标识应用图标是否包 括平滑和倾斜效果,默认值是 False,如果设置True,意味着不 需要增加平滑和倾斜效果。 |
UIRequiresPersistent-WiFi | 布尔变量,通知系统应用使用 Wi-Fi网络通信。使用Wi-Fi通 信必须设置该关键词为true, 否则,在30 min后,设备关掉 Wi-Fi连接进入省电模式。系统 应该显示网络选择对话框,特别 在Wi-Fi网络资源可获得,但系 统并没有使用的情况下。 默认值是False |