iOS 库 打包篇.a .bundle .framework

简介: 库是程序代码的集合,是共享程序代码的一种方式

一.库的简介


1.什么是库?


库是程序代码的集合,是共享程序代码的一种方式


2.库的类型?


根据源代码的公开情况,库可以分为2种类型


开源库


公开源代码,能看到具体实现

如SDWebImage, AFNetworking


闭源库


不公开源代码,是经过编译后的二进制文件,看不到具体实现

主要分为: 静态库,动态库


模拟器CPU架构:4s-5: i386 5s-6s Plus: x86_64

真机的CPU架构


armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)

armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2

armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)

arm64(注:无armv64): iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 7、iPhone 7PlusPlus、iPad Air、iPad Air2、iPad mini2、iPad mini3


3.静态库与动态库的区别?


1.静态库和动态库的存在形式上的区别


静态库

.a

动态库

.framework

.dylib

在Xcode 8里面,看到后缀为.tbd的库,它的本质都是.dylib文件

.framework


2.静态库和动态库在使用上的区别


静态库


链接时,静态库会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝


动态库


链接时不复制,程序运行时由系统动态的加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存


二.静态库.a的应用场景


制作SDK - 软件开发工具包(Software Development Kit)


如"百度地图",它想让开发者在应用程序中集成百度地图,但是百度又不想公布自己的技术实现,那怎么办?


百度将自己的核心代码编译成静态库,对外暴露统一的接口,开发者集成静态库,并且调用静态库即可集成

公司在开发项目时的核心代码


公司一般在开发一个项目时,肯定有一部分代码是核心代码


如果任何人都可以拿到这个核心代码,那么一旦有人离职,公司的核心代码就会被泄漏,那么该如何防止这种情况的发生?


公司一般都会抽出一部分核心团队成员,专门开发这部分核心代码,开发完成后,将核心代码编译成静态库给其他的程序员调用,核心成员一般很少会离职的,从而非核心成员即使离职也无法带走公司的核心代码


1.如何创建.a静态库?


1.创建工程,选择Cocoa Touch Static Library创建.a静态库


微信图片_20221017173459.png


注意


它只支持OC,不支持swift


2.创建项目,例如创建一个数学工具类CreatA


CreatA.h文件


微信图片_20221017173506.png

CreatA.m文件


微信图片_20221017173511.png


3.把CreatA编译成.a静态库


实际上就是把.m文件编译成.a静态库


头文件(.h)我们要暴露出去


cmd + B编译一下,得到.a文件如下图所示-编译之后


微信图片_20221017173514.png


右键Show in Finder,这时我们会在文件夹内发现一个.a文件,但是光有.a文件还不行,还需要把头文件暴露出去,否则别人拿到是无法使用的:


微信图片_20221017173517.png


如果已经有了就无需再添加了。


4.设置适配静态库CPU架构


show in findow到指定文件目录


微信图片_20221017173522.png


模拟器编译:小于或等于iphone5是 i386 iphone5s-iphonex是arm64。编译一下cmd+b,会重新打包.a文件.编译成功会生成如上图Debug-iphonesimulator


真机编译:我是用iphone6编译 是x86_64 cmd+b,编译成功会生成如上图Debug-iphoneos

检查静态库的CPU架构支持命令:lipo -info xxxxx.a


找出不支持arm64的静态库 :


find . -name *.a -exec lipo -info "{}" \;


微信图片_20221017173526.png


Debug设为No,重新编译


合并模拟器.a和真机.a


lipo -create 目标地址/模拟器.a  目标地址/真机.a -output 目标地址/最终.a


微信图片_20221017173530.png


5.文件整理


创建一个文件夹将所有.h文件和.a包copy进去。直接将文件夹导入项目工程中就可以使用了


三.资源库.Bundle的应用场景


什么是Bundle文件?


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


Bundle文件的特点?


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


1.先删除info.plist文件和上层文件夹


微信图片_20221017173534.png


2.设置项目版本类型


微信图片_20221017173537.png


3.移除plist路径


微信图片_20221017173541.png


4.导入图片或文件

导入方式1


微信图片_20221017173545.png


导入方式2 直接拖拽文件到项目


5..bundle的使用


直接导入项目工程中


使用方法1

 

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
imageView.image = [UIImage imageNamed:@"CreatBundle.bundle/pet_08.BIG_01.png"];
[self.viewaddSubview:imageView];

使用方法2


NSString* bundlePath = [[NSBundlemainBundle]pathForResource: @"MyBundle"ofType:@"bundle"];
NSBundle*resourceBundle = [NSBundle bundleWithPath:bundlePath];
UIViewController*vc = [[UIViewController alloc]initWithNibName:@"vc_name"bundle:resourceBundle];//xib文件
或者
UIImageView*imgView=[[UIImageView alloc]initWithFrame:CGRectMake(50,50,50,50)];
NSString*imgPath= [bundlePath stringByAppendingPathComponent:@"img_collect_success.png"];
UIImage*image_1=[UIImage imageWithContentsOfFile:imgPath];
[imgView setImage:image_1];

或者预编译


#define MYBUNDLE_NAME @"MyBundle.bundle"
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]

四.动态库.frameworks的应用场景


1.先创建一个项目,选择Cocoa touch Framework,点击下一步


微信图片_20221017173548.png


2.设置下build setting


微信图片_20221017173551.png


3.在项目文件夹中导入工程文件


微信图片_20221017173556.png


4.在build phase-headers中设置权限


微信图片_20221017173559.png


5.接下来的编译模拟器真机和.a文件是一样的


微信图片_20221017173603.png


合并模拟器CreatFramework和真机CreatFramework


lipo -create 目标地址/CreatFramework  目标地址/CreatFramework -output 目标地址/CreatFramework

合并之后就替换掉真机的CreatFramework


微信图片_20221017173607.png


最后将真机中的framework导入对应的工程中

微信图片_20221017173611.png


设置路径


微信图片_20221017173615.png


解压静态库.a文件


file xxx.a

这个指令可以看到xxx.a库包含哪几种arch


例如


$file libtesta.a libtesta.a: Mach-O universal binary with 2 architectureslibtesta.a (forarchitecture armv7): current ar archive random librarylibtesta.a (forarchitecture arm64): current ar archive random library


可以看到静态库覆盖了两个target,分别是armv7和arm64。


使用lipo指令可以对静态库进行拆分


$lipo libtesta.a -thin arm64 -output 64.a


意思是将静态库中arm64分离输出为64.a(64.a可以是随意的名字)

$ar -x 64.a


使用ar -x指令输出静态库中包含的.o文件

nm testa.o > testa.m


再使用nm指令将.o输出为.m文件

现在就可以去查看.m文件啦。

目录
打赏
0
0
0
0
1
分享
相关文章
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
158 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
48 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3月前
|
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
108 11
在线创建ios打包证书无需mac
这个文件并不一定需要使用mac OS去创建,在苹果开发者中心,生成了cer格式的证书后,导出p12证书这个过程,其实也并不一定需要mac电脑来完成。
65 0
ios应用打包、安装和上架攻略
假如是普通的证书或普通company证书只能上架才能安装(测试的话有其他安装方法,那是另外的话题),假如是企业类型的in house证书,则可以通过在线安装的方式,比如通过上传到一些分发平台,比如香蕉云编或蒲公英生成安装码扫码安装。
114 2
Flutter IOS 打包上架踩坑
Flutter IOS 打包上架踩坑
183 0
|
10月前
|
iOS使用.framework类型的静态库
iOS使用.framework类型的静态库
75 1
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
174 0
iOS使用SDK静态库
iOS使用SDK静态库
74 0

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    26
  • 2
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    109
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    4
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    2
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    6
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    2
  • 7
    iOS各个证书生成细节
    6
  • 8
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    6
  • 9
    【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记5 Data Structures、Methods、Properties
    2
  • 10
    iOS:应用程序的线程安全性
    1
  • 1
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    109
  • 2
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    15
  • 3
    iOS各个证书生成细节
    27
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    139
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    46
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    58
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    48
  • 8
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    41
  • 9
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    158
  • 10
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    323
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等