Xcode8.1 生成静态Framework(包含界面、图片、第三方库、第三方framework)

因为项目需求要求,需要把项目整体打包,这里就涉及到图片、界面、第三方的库。折腾了很久,走过很多坑。特此简单记录一下用Xcode8.1 生成静态Framework的步骤,避免下次再掉坑。

1.创建项目
这里写图片描述

2、配置framework参数,设置frameWork为静态库
注意图中左侧选择的是黄色小箱子,然后在build-setting中搜索mach,将设置项更改为static library。默认是Dynamic library
这里写图片描述

3、关闭bitconde。包括Project以及tagets
这里写图片描述
这里写图片描述

4、新建bundle用来存放Xib和png等资源文件(注意名字不能和静态库重复),选择空白处,点击“+”
这里写图片描述

5、因为iOS没有这一项,所以需要选择macOS,然后搜索bundle。
这里写图片描述

6、新建的bundle是针对macOS的,所以需要我们手动修改BaseSDK,如图,默认是macOS
这里写图片描述

7、设置Bundle的COMBINE_HIDPQ_IMAGES为NO
否则bundle中的png图片经过编译打包会变成tiff的文件,进而导致对应图片找不到
这里写图片描述

至此,我们就已经完成简单的sdk配置。现在就需要把要打包的文件加进来

8、首先导入.m以及.h文件
这里写图片描述

导入.m文件
这里写图片描述

导入.h文件
这里写图片描述

其中,.h文件有三个文件。一个是public 一个private 一个是project。默认导入都是在project下,我们需要把需要暴露的头文件,移动到public下。只要右键移动选择后确定即可
这里写图片描述

注意:
(1)针对用到第三方用到的库,也需要导入。如果不导入会报错,但是,我们只是进行引入。按照上述方法导入.m以及.h文件之后,选择工程中的文件,在右侧栏就关联项目的选择去掉。这样我们就声明了第三库,然后在集成的项目中再去添加第三库
这里写图片描述
(2)针对用到的第三方framework文件,也是一样的方法。需要将第三方的framework文件拷贝到项目中,手动导入。记得去掉关联项目选项,然后在集成的项目中再去添加
这里写图片描述

9、现在设置bundle,主要是存放Xib和png。
这里写图片描述

至此需要配置以及导入的文件已经完成。现在就是打包。网上很多关于模拟器以及真机的打包。两者分别打包后再合并。其实只要设置一步即可实现只打一次。

10、打包framwork以及bundle,设置不区别机型。
这里写图片描述
bundle也是一样的设置
这里写图片描述

11、生成静态库framework和bundle文件
分别选中选择静态库和bundle文件,然后run,然后open in finder,就会得到两个文件,就是我们打包后的文件
这里写图片描述

12、新建项目,将打包好的静态库framework和bundle文件拷贝到项目中,并且手动导入。添加一下依赖库。刚才我们对第三方framework只是引入,这个时候也要加进来
这里写图片描述

13、刚才我们对第三方库只是引入,这个时候也要加进来
这里写图片描述

14、因为我们对图像以及页面进行打包。这样,存放页面以及图片的路径改变了。所以我们在使用时,要使用绝对路径

页面跳转:
TCLimitsViewController *home = [[TCLimitsViewController alloc] initWithNibName:@"TestBundle.bundle/TCLimitsViewController" bundle:nil];

图片引用:
UIImage *imge=[UIImage imageNamed:@"TestBundle.bundle/test"];
如果在页面设置的图片,只要在Assets保存,就不要修改路径,还是保存在需要集成的Assets文件中

头文件的引用
这里写图片描述

以上是打包framework的过程。

可能出现的问题:
1、如果在引入static library之后,出现报错的情况:
unrecognized selector sent to instance
Terminating app due to uncaught exception 'NSInvalidArgumentException'
出现上述情况可能是因为需要调整如下设置:
这里写图片描述

2、出现下面的错误
Undefined symbols for architecture arm64:"OBJC_CLASS$_XX",referencedfrom:someFile
ld:symbol(s) not found for architecture arm64
缺少了XX.m文件,导致的错误

3、如果添加打包好的静态库后,运行报一些莫名其妙的错误。
可以检查一下引用的第三方静态库是否需要C++编译环境,如果需要,就随意修改一个.m文件为.mm

4、如果报
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle:
说明页面加载的路径有误。请参考14解决

5、如果报
Unknown class xxCell in Interface Builder file.
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UITableViewCell 0x102813400> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key namLabel.'
这个情况比较常见在cell文件的加载。可以在加载之前添加声明
[xxCell class];

例如:
static NSString *cellIdentifier = @"xxCell";
[xxCell class];
//自定义cell类
xxCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"TestBundle.bundle/xxCell" owner:self options:nil] firstObject];
}

以上是我的一些简单见解,如果有任何不足之处,欢迎指正。

posted @ 2020-12-22 15:59  凌云幽雨  阅读(339)  评论(0编辑  收藏  举报