NSBundle

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"];
posted @ 2022-11-20 11:55  CH520  阅读(59)  评论(0编辑  收藏  举报