1、简介
- 在 iOS 中提到的 NSBundle 是文件系统中的一个特殊位置,它存放的是应用可执行文件及相关资源文件。
- 这个位置的所有文件在系统运行时只具有可读或者可执行的权限,不能进行修改。
- 应用程序 bundle 中主要有以下几种类型的文件:
- Info.plist:用来配置应用的基本参数信息。包括版本号,指向的可执行文件名、包名等。
- 可执行文件:每个应用程序必须要有一个可执行文件。
- 资源文件:是可执行文件以外的数据文件,常用的如图像、图标、音频文件、视图文件、配置文件等。
- 应用程序 bundle 的配置信息都存在 Info.plist 文件中。它里面各项都以 key-value 的形式进行描述,包括了应用程序唯一标识名、版本号、可执行文件名等信息。
2、bundle 配置信息主要参数:
key |
友好显示名 |
value |
CFBundleDisplayName |
Bundle display name |
程序的应用名,安装后显示在桌面上的那个名称,可以进行本地化设置 |
CFBundleExecutable |
Executable file |
应用可执行程序的名称 |
CFBundleIdentifier |
Bundle identifier |
应用程序的唯一标识 |
CFBundleVersion |
Bundle version |
应用编译版本号 |
CFBundleShortVersionString |
Bundle version string, short |
应用 release 发布版版本号 |
- 当创建一个应用时,系统存储了应用相关联的所有数据(其中包括图片、本地化字符串、图标等),将这些内容放入一个称为应用包(application bundle)的包中。
- 在应用中添加一个资源时很方便的:仅需将文件拖到 Xcode 的左边窗格中。当出现对话框时,通常选择复制资源文件到你的项目目录中,这样你的项目都是自包含的。
- command-line tool 是没有 bundle 的,所以用 NSBundle 的时候一直是 null,如果要使用 bundle 获取项目中的资源,必须要使用 application。
3、Bundle 常见问题
-
3.1 项目里面的某个 .m 文件无法使用
- 检查 TARGETS => Build Phases => Compile Sources 里是否包含此 .m 文件。
-
3.2 项目里面的某个资源文件(比如 plist、音频等)无法使用
- 检查 TARGETS => Build Phases => Copy Bundle Resources 里是否包含此资源文件。
4、获取 NSBundle 资源
// 获得 Bundle 信息
/*
通常指向 xxx.app/ 这个根目录
*/
NSBundle *mainBundle = [NSBundle mainBundle];
// 获取 Bundle 文件路径
NSString *bundlePath = [NSBundle mainBundle].bundlePath;
NSString *resourcePath = [NSBundle mainBundle].resourcePath;
// 获取 Bundle URL 路径
NSURL *bundleUrl = [NSBundle mainBundle].bundleURL;
NSURL *resourceURL = [NSBundle mainBundle].resourceURL;
// 获得 Bundle 目录下的文件路径
NSString *filePath1 = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
// 获得 bundle 下子目录 subdirectory 下的文件路径
NSString *filePath2 = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt" inDirectory:@"testFolder"];
// 获得 Bundle 目录下的 URL 路径
NSURL *fileUrl1 = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"txt"];
// 获得 bundle 下子目录 subdirectory 下的 URL 路径
NSURL *fileUrl2 = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"txt" subdirectory:@"testFolder"];
// 获取应用程序唯一标识包名
NSString *indentifier = [NSBundle mainBundle].bundleIdentifier;
// 获取应用程序 Info.plist 配置项词典对象实例
NSDictionary *info = [NSBundle mainBundle].infoDictionary;
// 获取某一特定字段的内容
NSString *bundleID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];