Xcode在构建iOS应用时,需要完成的主要工作是创建应用程序包(application bundle)。应用程序包会包含应用的可执行文件和执行应用所需的全部资源。这些资源包括XIB文件、图片和音频文件等,即应用在运行时需要使用的所有文件。将某个文件加入项目时,Xcode会自动判断是否应该将该文件加入应用程序包。
通过以下步骤,可以查看会被加入Homepwner程序包的文件。选中位于项目导航面板顶部的Homepwner条目,选中右侧面板中的Homepwner目标,选择Build Phases面板。展开Copy Bundle Resources(拷贝程序包资源)列表,可以看到一组文件。Xcode会在构建项目时,将这组文件加入应用程序包。
Build Phases面板中的每一个列表,都是Xcode在构建项目时需要经历的阶段。Copy Bundle Resources阶段的任务是将指定的文件(资源文件)全部拷贝至应用程序包。
将某个应用装入模拟器后,可以通过文件系统查看相应的应用程序包(见图18-11)。在Finder中打开~/Library/Application Support/iPhoneSimulator/(版本号)/Applications目录。该目录下的子目录都是已安装应用的沙盒。打开某个子目录,可以看到一个应用沙盒应该包含的目录,其中包括:应用程序包、Documents目录、tmp目录和Library目录。右键单击或Command-单击应用程序包,然后选择上下文菜单中的Show Package Contents(显示包内容)。
图18-11 查看应用程序包
Finder会打开一个新窗口并显示包内的内容(见图18-12)。当用户通过App Store下载某个应用后,相应的程序包会被拷贝至用户的设备。
图18-12 应用程序包
iOS应用可以在运行时载入应用程序包中的文件。要获得应用程序包中的某个文件的全路径,需要先得到代表应用程序包的NSBundle对象,然后通过该对象得到某个文件的全路径,代码如下:
// 获取代表应用程序包的NSBundle对象
NSBundle *applicationBundle = [NSBundle mainBundle];
// 通过NSBundle对象,获得包内名为myImage.png的文件的全路径
NSString *path = [applicationBundle pathForResource:@“myImage”
ofType:@“png”];
调用pathForResource:ofType:后,如果应用程序包没有包含指定的文件,则它会返回nil。如果文件存在,则它会返回该文件的全路径。
应用程序包中的文件都是只读的,不能修改。此外,也不能在运行时向应用程序包添加文件。应用程序包中的文件通常包含:按钮图片、界面音效或初始化模板等。后续章节为了能在运行时载入这类资源,还会再次使用pathForResource:ofType:方法。