创建framework库之间的依赖及库资源的加载

主要解决以下三个问题:

  1. 自己封装的framework库有多个公共的方法,model,类等,所以打算封装一个公共类库,让其他的framework库进行依赖;
  2. framework库中包含图片资源,plist文件的读取 ;
  3. 资源文件bundle的创建方式;

1. 一般公共类库的封装

不涉及资源问题,就是一些公共方法的封装,封装流程和一般的framework库没区别,注意点:

  1. 暴露.h文件;
  2. image.png
  3. image.png
  4. 设置成release版本;
  5. 如果用了Category分类,需要在工程中other linker flags中添加-objC,如果依然有问题,再添加-all_load;
  6. 关于符号表的警告,这时需要将Generate Debug Symbols设置为NO即可关闭符号表警告;
  7. 如果需要支持bitcode:在TAGETSBuild setting中搜索Other C Flags,添加命令-fembed-bitcode。同样的设置在PROJECT中。

2. 创建资源文件bundle

两种方式

  1. 直接创建文件夹,拖入文件,再修改后缀为.bundle;
    此方法缺点是如果有新的资源需要导入,又得重新在创建文件夹,把上一次的资源全部拷贝进来,更新新的资源,很麻烦;
  2. 使用Xcode生成,具体如下:
  1. 创建Bundle文件:创建工程,选择如下:


    image.png
  2. 进行配置:


    image.png
image.png
image.png
image.png
image.png

info.plist文件处理:(打包的bundle给别人使用,别人在打包完上传过程中可能会极大的坑,加上如下处理)


image.png
image.png

然后把图片导入工程,build即可;分别选择真机和模拟器,然后各运行一遍,即可生成真机和模拟器使用的bundle;

参考链接:
https://www.jianshu.com/p/d7c59c079249?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

3. 创建包含资源和依赖库的framework库

  1. 创建的SDK,这里命名为 AM300QuestionSDK,选择的是framework库;
  2. 把上面创建的依赖库 AM300PublicSDK.framework添加到AM300QuestionSDK文件夹下;
  3. 对SDK进行配置:具体配置和上面创建framework库一样;
  4. 把工程中使用到公共类库的地方,修改成: #import <AM300PublicSDK/XXX.h>;
  5. 把创建好的资源: questionimages.bundle 导入到AM300QuestionSDK下;
  6. 资源文件的调用问题修改:
    因为现在iOS只能创建自己的静态库,静态库资源加载方式:
    plist文件如下:
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Am300QuestionSDK.framework/questionimages" ofType:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
    NSString *plistPath = [bundle pathForResource:@"QuestionnaireList" ofType:@"plist"];

image如下:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Am300QuestionSDK.framework/questionimages" ofType:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
    
    
    NSString *fileName = [NSString stringWithFormat:@"%@%@",imageName,@"@2x.png"];
    NSString *filePath = [bundle pathForResource:fileName ofType:nil];
    UIImage *img = [UIImage imageWithContentsOfFile:filePath];

修改完,然后运行生成framework文件;

4. 库的使用

  1. 创建一个工程,导入SDK及其依赖库,创建SDK的调用类CRQuestionViewController,用于验证SDK是否正常工作;


    image.png
  2. 现在运行工程,发现可以正常运行,但是资源文件没有加载成功,
    因为静态库framework读取资源文件需要额外创建一个copy Files 进行读取
    操作如下:


    image.png
image.png

然后运行,成功.

注:不管是资源文件.bundle还是framework库,都存在真机和模拟器,上架需要记得使用真机生成;
上面第二步一定不能少,除非你的资源文件是直接放在主工程目录下的;不过不把资源文件放在framework库中,那也就没必要打framework库了,直接用.a库也行了,主要还是看需求;

参考链接:
https://www.jianshu.com/p/c92c08d8afda
https://blog.csdn.net/ljl5125/article/details/52210283
https://www.jianshu.com/p/fb5083f2c0d2

5.创建可调式工程

以上的方式,如果SDK有问题,修改很麻烦,所以可以创建可调试工程,运行没问题直接生成framework库,操作如下:

  1. 创建项目工程TiaoShiDemo

  2. 通过TARGETS 添加 一个我们要创建的SDK,这里命名为 AM300QuestionSDK,选择的是framework库,不创建.a

  3. 把我们SDK需要的类导入AM300QuestionSDK文件夹下;

  4. 把上面创建的依赖库 AM300PublicSDK.framework添加到AM300QuestionSDK文件夹下;

  5. 通过TARGETS—> AM300QuestionSDK :对SDK进行配置:具体配置和上面创建framework库一样;

  6. 把工程中使用到公共类库的地方,修改成: #import <AM300PublicSDK/XXX.h>

  7. 选择AM300QuestionSDK,进行编译,编译通过后,选择TiaoShiDemo编译,发现报错;因为我们的TiaoShiDemo工程没有AM300PublicSDK.framework,需要添加一个;

  8. 把创建好的资源: questionimages.bundle 导入到AM300QuestionSDK下;

然后运行工程即可

问题:

这样创建的AM300QuestionSDK,在访问资源时,需要使用如下方式:

/得到framework路径
#define FrameworkPath  [[NSBundle mainBundle] pathForResource:@"Frameworks/AM300QuestionSDK" ofType:@"framework"]

//得到对应的bundle路径
#define FrameworkBundle  [NSBundle bundleWithPath:FrameworkPath]

//得到资源的bundle路径
#define VivienBundle [NSBundle bundleWithPath:[FrameworkBundle pathForResource:@"questionimages" ofType:@"bundle"]]


//获取资源路径,文件实例:
NSString *plistPath = [VivienBundle pathForResource:@"QuestionnaireList" ofType:@"plist"];

但是如果用上面的访问方式,最后生成framework,在使用时,资源读取会失败;导致我在生成framework库前,又要更改资源的读取方式,不知道是哪里有问题没有设置好,有知道的仁兄指点一二.

一些基本设置说明:

-ObjC

我们知道在Objective-C中方法调用都是在运行期确定的,所以Objective-C没有针对每个方法定义链接符号,它只每个类创建链接符号。因此当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时出现selector not recognized的错误。
设置ObjC标志后,链接器会把一个类相关的所有目标文件都加载进来,这样就解决了这个问题。由于这样做会使可执行文件体积变大,所以需要需要自己手动设置一下。
官方的说明链接:https://developer.apple.com/library/archive/qa/qa1490/_index.html
参考链接:https://www.jianshu.com/p/fb5083f2c0d2

-all_load 和 -force_load

在64位ios应用环境下,在静态库中只有category而没有对应的class定义时-ObjC标志会失效(这是链接器的一个bug)
这时可以使用-all_load强制加载所有目标文件 或者使用-force_load指定加载某一个包
千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件
所以建议在遇到-ObjC失效的情况下使用-force_load参数

-force_load所做的事情跟-all_load其实是一样的
但是-force_load需要指定要进行全部加载的库文件的路径
这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

2021.01.13新增:模拟器包含arm64打包合并问题

只需要对模拟器的.a进行处理即可,终端输入如下

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