iOS制作.framework静态库

简介: iOS制作.framework静态库

iOS制作.framework静态库。

库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库:

1.某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。

2.对于某些不会进行大的改动的代码,比方说很多大公司常用且很少变动的模块都会编译成库,这样做的好处一是可以节省编译时间,二来对于代码的管理也非常方便。

因为库是已经编译好的二进制文件了,编译的时候只需要link一下,既然提到了link那就有不同的形式了,静态和动态,与之相对应的就是静态库和动态库。

当然你代码含有大量图片资源,代码量不大并且需要精确适配不需要保密,一般就不使用库,直接使用私有组件。若代码量比较大,没有图片等资源需要精确适配,不希望别人看到源码,想减少编译时间可以使用静态库和动态库。简单的说是不希望别人看到源码就要使用库,反之可以使用普通私有组件。

基本知识:


库类别

静态库(.a 和.framework)

动态库(.liby和.framework)

2.静态库和动态库的区别

2.1静态库

平时我们用的第三方SDK基本上都是静态库。为何使用静态库,是因为静态库只要引入就能用,属于傻瓜式使用,它默认都配置到Linked Frameworks and Libraries下;而动态库需要你手动配置到Embedded Binaries下。


静态库在项目编译时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

静态库很大的一个优点是减少耦合性,因为静态库中是不可以包含其他静态库的,使用的时候要另外导入它的依赖库,最大限度的保证了每一个静态库都是独立的,不会重复引用。

静态库有.a 和 .framework两种形式。

2.2动态库

iOS平时使用的系统库基本是动态库,比如使用频率最高的UIKit.framework和Fundation.framework。

动态库在程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

动态库在制作的时候可以直接包含静态库,也能自动link所需要的依赖库。

动态库有.dylib/.tbd 、.framework两种形式。

苹果iOS8.0之前禁止开发中使用动态库

虽然动态库不会有冗余等优点,但是静态库使用简单,载入快,外部依赖少,所以静态库的使用要比动态库范围大,并且.framework静态库与.a静态库相比不需要拷贝头文件目录,可以从库文件中直接移动出资源文件,.framework静态库这些使用方便,所以.framework静态库更常用。

3.版本

真机-Debug版本

真机-Release版本

模拟器-Debug版本

模拟器-Release版本

区别

3.1 Debug

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

不会对代码进行优化

3.2 Release

不会包含完整的符号信息

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

的大小会比Debug版本的略小

基本操作:iOS制作.framework静态库

1.新建 framework 工程

2.新建文件类

TestTool.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface TestTool : NSObject
+(void)testLog;
@end

NS_ASSUME_NONNULL_END

TestTool.m

#import "TestTool.h"

@implementation TestTool

+(void)testLog
{
    NSLog(@"test static lib");
}
@end

3.修改工程文件配置

build setting ->搜索 mach -> 修改 mach -O Type ->Static Library

这个定要设置正确,动态库和静态库以及其它都靠这个属性。.a类型静态库它默认是Static Library,.framework静态库它就不一定是。

4.引入其他第三方库(如果有的话)

⚠️注意:导入第三方静态库的时候不要选择添加到target中

5添加公开文件

5.1 点击“+”选择“ New Header Phase”

5.2 添加文件到 project

5.3 拖拽.h到 public

6.生成 .framework

6.1修改环境

这里可以选择 Debug 和 Release 环境

6.2选择模拟器+Debug 环境+“cmd+R”生成.framework

选择模拟器+Debug 环境+“cmd+R”生成.framework;选择Generic iOS Device+Debug 环境+“cmd+R”生成.framework;选择模拟器+Release 环境+“cmd+R”生成.framework;选择Generic iOS Device+Release 环境+“cmd+R”生成.framework。


此处注意需要生成4个

如此类推打出四种.framework

真机-Debug版本

真机-Release版本

模拟器-Debug版本

模拟器-Release版本

最终生成结果

7.合并 debug 两个包和 release 两个包

注意:这里的合并指的是 1.debug 下真机+模拟器合并 2.release 下真机+模拟器合并

7.1将4个.framework文件拷贝到单独文件夹

7.2 合并

打开终端 ,切换到4个.a文件所在的目录执行合并命令:

lipo -create SDKStaticFrameworkDemo-Debug-iphoneos.framework/SDKStaticFrameworkDemo SDKStaticFrameworkDemo-Debug-iphonesimulator.framework/SDKStaticFrameworkDemo -output SDKStaticFrameworkDemo-Debug.framework/SDKStaticFrameworkDemo
lipo -create SDKStaticFrameworkDemo-Release-iphoneos.framework/SDKStaticFrameworkDemo SDKStaticFrameworkDemo-Release-iphonesimulator.framework/SDKStaticFrameworkDemo -output SDKStaticFrameworkDemo.framework/SDKStaticFrameworkDemo

SDKStaticFrameworkDemo.framework为复制的任意一个Release版本修改名称并删除里面的SDKStaticFrameworkDemo而成,同理debug版本也是这样


7.3替换文件

7.3.1寻找之前生成的 任意framework

7.3.2替换二进制文件

注意:

1.只能SDKStaticFrameworkDemo和库名相同的库被使用,可以是SDKStaticFrameworkDemo-Debug或SDKStaticFrameworkDemo-Release其中一个改名为SDKStaticFrameworkDemo。若是SDKStaticFrameworkDemo-Release只能环境变量为Release模式的能被使用,反之亦然。这两个包不能再编译为一个包。否则报下面的错误:

w1:SDKStaticFrameworkDemoFramework jiaguoshang$ lipo -create SDKStaticFrameworkDemo-Debug SDKStaticFrameworkDemo-Release -output SDKStaticFrameworkDemo
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: SDKStaticFrameworkDemo-Debug and SDKStaticFrameworkDemo-Release have the same architectures (armv7) and can't be in the same fat output file
w1:SDKStaticFrameworkDemoFramework jiaguoshang$

2.要把SDKDemoBundle.bundle移动到外面,在使用这个库时要把这个资源文件加入工程,资源文件放在SDKStaticFrameworkDemo.framework时找不到而crash的。可能可以在使用图片资源的地方加静态库前缀来规避,没有测试过。


目录
相关文章
|
4月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
132 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
iOS开发
iOS使用.framework类型的静态库
iOS使用.framework类型的静态库
110 1
|
iOS开发 Perl
iOS使用.a类型的静态库
iOS使用.a类型的静态库
97 1
|
开发工具 iOS开发 Perl
iOS使用SDK静态库
iOS使用SDK静态库
96 0
|
监控 开发者 iOS开发
iOS第三方网络诊断库——LDNetDiagnoService
iOS第三方网络诊断库——LDNetDiagnoService
672 0
|
7月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
5月前
|
iOS开发 开发者
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!报错问题如何解决
310 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
4月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
115 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
6月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
233 66
|
4月前
|
人工智能 程序员 API
iOS|记一名 iOS 开发新手的前两次 App 审核经历
啥,这玩意也有新手保护期?
70 0