IOS 多工程依赖(.a)静态库和Bundle

前言:当开发到了一定程度后,积累的工具类或者封装的东西就越来越多,而很多工程会重复使用到这些类,但是又不想每个工程都导入一遍,可能会想到将这些打包成(.a)库或者bundle,但是这样子有变动的时候又得重新编译一遍,再导入,耗费不少时间。解决的方法很多,比如建立workspace,多个工程同级使用等。写这文章,是为了记录以便日后翻看。


1、静态库(.a)库

在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库。二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。


选择静态库

创建静态库

静态库创建好了,如果现在编译的话,就能得到(.a)库了。
编译后

这里需要注意的是,文件夹“include”里边包含的是类的头文件,当你发现添加了依赖,却找不到某个类的时候,去Build Phases->CopyFiles查看一下是否有添加了该类的头文件
特别注意是否添加了头文件

图中的第四步是默认的头文件build后存放的位置,可以将它改变(比如:../$(PRODUCT_NAME)/Headers),以便在其它工程中建立依赖时容易找到,这个用处后面会有说到。
而(.a)库build后的存放位置也是可以改变的,例:
改变前

改变后

之所以改变它们的编译路径,就是为了之后的建立依赖方便找到,和改变头文件是一样的。
需要注意的是,build后的存放分为debug,release,还有模拟器,改变存放路径是最好分开。


不同的编译环境

特别需要注意的是,在Build Settings里边有个叫Build Active Architecture Only的属性,为了编译速度快,Debug情况下默认为Yes,只是编译当前版本,在这里我们需要设置成NO,以满足我们在不同的环境中使用,当碰到静态库引用报错时,我们除了可以检查路径是否正确外,还可以利用命令行“lipo -info”来查看当前引用的库所支持的环境。


Build Active Architecture Only

到了这里,(.a)库的创建和简单配置基本完成,根据不同环境编译后,可以导入到其它工程使用了。但,这只是简单使用,显然不能满足我们前面说的,现在,接着走。
使用过(.a)库的人知道,假如我们使用的工具类带了(.xib)呢?你会发现,编译的时候,没有见到xib的文件
xib文件并没有与target关联

(.xib)文件没有关联上去,怎么办呢?

2、Bundle(实际就是一个文件夹)

根据上面说到的可以得出,静态库(.a)库没有bundle的存在,无法使用(.xib)文件,根据平时正常工程中使用本地文件例如(.xib)需要用到NSBundle外,本地的图片或者(.txt)等也是需要用到,这些文件在静态库中,都需要放到创建的bundle中,这样,编译的时候才能编译到。


添加Bundle文件

在macOS选项里选择Bundle

因为IOS那类没有Bundle选择,故选择macOS里边的,创建后,需要设置一下Build Settings里边的Base SDK


注意修改Base SDK

然后Bundle的build的路径也参照前面的设置,将其改变。

设置在编译主target(.a)库的前面,先编译Bundle


添加Bundle编译

然后选中刚才的(.xib),勾上target关联到Bundle,再编译
将xib关联到Bundle中去

编译后得到Bundle文件

在Bundle中找到了xib的编译

注:如果静态库中不需要使用到(.xib)或者图片等文件时,Bundle不是必须的。


3、关联工程

静态库和Bundle都创建好,并且配置编译通过后,接下来就是如何关联到需要用到的工程中去了


首先,在其它工程我们需要用到(.a)库,但是我们不想像一般情况那样子直接将它拖到工程中去,弊端上面有说到。所以需要将主工程与静态库建立依赖:

  • 将主工程和静态库工程放到同一目录下(方便路径关联)


    同一目录
  • 将编译后的Bundle用引用的方式导入主工程(因为Bundle内的文件不会根据编译环境变化,比较固定,直接引用)


    编译后的Bundle

    引用方式导入
  • 设置动态依赖关联静态库(Build Settings -> Library Search Paths)

Debug:$(SRCROOT)/../ToolProject/Build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Release:$(SRCROOT)/../ToolProject/Build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
关联上静态库编译后的文件
  • Other Linker Flags(重点介绍一下)
    在使用第三方静态库的时候,一般会提醒在Other Linker Flags里边配置“-ObjC”或者“-all_load”或者“-force_load”,它们的作用是:
  • -ObjC
    告诉链接器将库中的Objective-C类和Category类都加载进来(命名不重复的类),但是这样子做有个弊端。没有用到的类也都加载进来了,APP会变大。而且当库中只存在Category类时,“-ObjC”就不起作用了
  • -all_load
    强制将所有类都加载进来,能解决只存在Category类的情况。但是,引用多个静态库时,它们之中可能存在重命名的类别,这样子会有问题
  • -force_load
    它所做的事情和“-all_load”差不多,但是它能指定完全加载某个静态库,而不影响其它的库。

  • 所以建议“-ObjC”和“-force_load”结合使用
配置Other Linker Flags
  • 上面说过,静态库使用需要结合头文件,所以需要设置搜索头文件的路径
$(SRCROOT)/../ToolProject/Build/ToolProject/Headers/
头文件路径的设置

注:以上静态库或者头文件路径的设置都是看实际存放的路径的,前面一直强调更改它们的路径就是这个原因。

  • 到这里基本配置就完成了,你会发现在主工程中也可以使用依赖库中的东西了。


    运行成功

4、脚本的配置

完成了上面的操作后是可以正常使用了,但是,当你clean了静态库后,你会发现,你得重新Build一下,否则无法直接运行主工程,原因,应该大家都懂,那有什么办法解决呢

  • Build Phase -> New Run Script Phase(要将Run Script放到Compile Sources 的编译前,原因是编译主工程前,需先编译最新的静态库)


    添加RunScript

    脚本配置

脚本代码

#!/bin/bash
#进入脚本目录
BASEDIR=$(dirname $0)
cd $BASEDIR

build_cmd='xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target ToolProject -configuration '${CONFIGURATION}' -sdk '${SDK_NAME}
echo '执行build命令:'${build_cmd}
${build_cmd}

至此,基本介绍完静态库和Bundle的创建和使用。其中的不足和错漏,恳请斧正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容