iOS生成Bundle 资源文件包与使用

简介: iOS生成Bundle 资源文件包与使用

Bundle 文件,简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个 Bundle 文件。方便在其他项目中引用包内的资源。

Bundle 文件是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle 包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的 2 进制数据。

版本

真机-Debug版本

真机-Release版本

模拟器-Debug版本

模拟器-Release版本

Debug


含完整的符号信息,以方便调试

不会对代码进行优化

Release


不会包含完整的符号信息

的执行代码是进行过优化的

的大小会比Debug版本的略小

在执行速度方面,Release版本会更快些(但不意味着会有显著的提升)


SourcesBundle例子和SDKDemoBundle例子

1.sdk 中xib,图片等一切资源都需要添加到Bundle中。

点击File-New-Project-macOS-Bundle,取名为SDKDemoBundle。

创建名为 SDKDemoBundle(最后要生成的 Bundle 文件名称)的工程,注意 Bundle 默认是 macOS 系统的,Xcode 高版本中需要在 macOS => Framework & Library 选项下找到。

2.修改 Bundle 配置信息

因为 Bundle 默认是 macOS 系统的,所有需要修改他的信息,修改成 iOS 系统。

TARGETS -SDKDemoBundle-BuildSettings-Base SDK 设置 iOS

需要把Build Active Architecture Only修改为NO,否则生成的库就只支持当前选择设备的架构。

设置 Build Setting 中的 COMBINE_HIDPI_IMAGES 为 NO,否则 Bundle 中的图片就是 tiff 格式了。

COMBINE_HIDPI_IMAGES设置为NO

3.可选配置

作为资源包,仅仅需要编译就好,无需安装相关的配置,设置 Skip Install 为 YES。

清除Installation Directory路径信息。

4.修改研发者证书,不修改报这个错误

把工程目录下的Build Settings下Base SDK修改为iOS,需要把Build Active Architecture Only修改为NO,否则生成的库就只支持当前选择设备的架构。作为资源包,仅仅需要编译就好,无需安装相关的配置,设置 Skip Install 为 YES

最关键是把工程目录下的Build Settings下Code Signing Identity的苹果研发者证书换称iOS研发者证书

5.添加文件

将资源文件或文件夹拖动到工程中的 SDKDemoBundle 文件夹下面。

6.编译生成 Bundle 文件

我们分别选择 Generic iOS Device 和任意一个模拟器各编译一次,编译完后,我们会看到工程中 Products 文件夹下的 SDKDemoBundle.bundle 由红色变成了黑色。

7.选中工程中 Products 文件夹下的 SDKDemoBundle.bundle右键点击显示包内容,查看生成的文件。我们看到它为真机和模拟器都生成了 .bundle 资源文件。

我们可以看到之前拖拽到工程中的资源文件都在其中。

Debug-iphoneos文件夹下的是真器使用的.bundle 资源文件,Debug-iphonesimulator文件夹下的是模拟器使用的.bundle 资源文件。

8.然后你把你需要的.bundle 资源文件拷贝到你需要的工程中就可以正常使用了。

注意:.bundle 资源文件分真机和模拟器两种资源,模拟器的资源真机可以使用。模拟器的资源多了一个_CodeSignature文件夹,下面有四个及以上文件每运行一种模拟器多一个CodeRequirements开头的文件。所以发布时还是用真机资源吧,不然多了一些文件。

9.若需要生成发布的动态库,需要修改环境设置Release,在Generic iOS Device下编译 (选择该target,command + B)生成发布版本的动态库。

10.使用.bundle 资源文件中的xib

- (instancetype)init {
    self = [super initWithNibName:@"SDKDemoViewController" bundle:[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"SDKDemoBundle" withExtension:@"bundle"]]];
    if (self) {
        return self;
    }
    return self;
}
// 设置文件路径
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SDKDemoBundle" ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];

// 加载 nib 文件
UINib *nib = [UINib nibWithNibName:@"SDKDemoViewController" bundle:resourceBundle];
NSArray *viewObjs = [nib instantiateWithOwner:nil options:nil];

// 获取 xib 文件
UIView *view = viewObjs.lastObject;

view.frame = CGRectMake(20, 50, self.view.bounds.size.width - 40, self.view.bounds.size.width - 40);
[self.view addSubview:view];

11.使用.bundle 资源文件中图片

指定绝对路径的形式

UIImage *image = [UIImage imageNamed:@"SDKDemoBundle.bundle/unionpay@2x.png"];

拼接路径的形式
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SDKDemoBundle" ofType:@"bundle"];
NSString *imgPath= [bundlePath stringByAppendingPathComponent:@"unionpay@2x.png"];

UIImage *image = [UIImage imageWithContentsOfFile:imgPath];

Bundle 和 xcassets

1、工程中所有使用 Asset Catalog 管理的图片(在 .xcassets 文件夹下),最终输出的时候,都会被压缩到 Assets.car 内。

2、反之,不在 Assets.car 内的,我们将它统一归类为 Bundle 管理的。

Bundle 和 xcassets 的主要区别

1)xcassets 里面的图片,只能通过 imageNamed 加载。Bundle 还可以通过 imageWithContentsOfFile 等方式。2)xcassets 里的 2x 和 3x。而 Bundle 会都包含。(App Slicing)3)xcassets 内,可以对图片进行 Slicing,即裁剪和拉伸。Bundle 不支持。4)Bundle 内支持多语言,xcassets 不支持。

为了证明Bundle 可以根据设备自动适配的,可以用下面的代码进行测试。当它找不到对应倍图时会自动找其它的倍图。那些说 Bundle不会根据设备进行自动适配倍图的人纯属臆想,没有进行现实测试。格式是奋斗在第一线的程序猿,我的文章都进行了现实测试的,为了以后少走湾路,希望能给自己和大家带来帮助。好记性不如烂笔头。

测试的是iPhone Xs Max模拟器,app的LaunchImage适配了iPhone Xs Max,为了测试,二倍图和三倍图不相同,尺寸也不相同。

        UIImage *image = nil;
        UIImage *image1 = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading@3x.png"];
        NSLog(@"common_icon_loading@3x.png image1.size.height:%.f", image1.size.height);
        UIImage *image2 = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading@2x.png"];
        NSLog(@"common_icon_loading@2x.png image2.size.height:%.f", image2.size.height);
        UIImage *image3 = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading.png"];
        NSLog(@"common_icon_loading.png image3.size.height:%.f", image3.size.height);
        
        if([UIScreen mainScreen].scale >= 3)
        {
            image = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading@3x.png"];//[UIImage imageNamed:@"common_icon_loading"];
        }
        else
        {
            image = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading@2x.png"];//[UIImage imageNamed:@"common_icon_loading"];
        }
        NSLog(@"common_icon_loading.png image.size.height:%.f", image.size.height);

测试效果:使用image = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading@3x.png"];和image = [UIImage imageNamed:@"ELockSDKBundle.bundle/common_icon_loading.png"];加载的是同一张图。所以Bundle会根据设备自动适配倍图的。下面是打印的日志:

2019-03-13 10:44:09.815380+0800 BLockSDKUnitTest[6647:199720] common_icon_loading@3x.png image1.size.height:44
2019-03-13 10:44:09.885936+0800 BLockSDKUnitTest[6647:199720] common_icon_loading@2x.png image2.size.height:24
2019-03-13 10:44:09.956959+0800 BLockSDKUnitTest[6647:199720] common_icon_loading.png image3.size.height:44
2019-03-13 10:44:09.957200+0800 BLockSDKUnitTest[6647:199720] common_icon_loading.png image.size.height:44
目录
相关文章
|
7月前
|
API 开发工具 iOS开发
iOS 开发高效率工具包:10 大必备工具
iOS 开发高效率工具包:10 大必备工具
108 1
|
7月前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
111 0
|
7月前
|
安全 开发者 iOS开发
iOS16系统手机设置开启开发者模式才能安装ipa包
iOS16系统手机设置开启开发者模式才能安装ipa包
242 1
|
7月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
321 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
7月前
|
数据安全/隐私保护 Android开发 iOS开发
如何发布ios离线安装包
如何发布ios离线安装包
71 0
|
7月前
|
Linux iOS开发 开发者
ios ipa包上传需要什么工具
ios ipa包上传需要什么工具
47 0
|
7月前
|
Linux iOS开发 开发者
ios ipa 包上传需要什么工具
ios ipa 包上传需要什么工具
|
7月前
|
Web App开发 网络安全 Android开发
🚀2023最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包
在移动应用程序的开发中,了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法,可以让我们分析应用程序的网络请求和响应,了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具,可以帮助我们在 Android 和 iOS 平台上进行数据抓包。本篇博客将介绍如何使用克魔助手在 iOS 平台上进行数据抓包。
|
iOS开发 MacOS
iOS - Bundle 资源文件包
1、Bundle 文件 Bundle 文件,简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个 Bundle 文件。方便在其他项目中引用包内的资源。 Bundle 文件是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。
2929 0
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。