由于与第三方的公司合作,需要将项目中的某些功能打包给第三方使用,最初选择.a Library和Bundle的模式打包,但是由于swift并没有.h文件,并未深究下去,改成framework方式。
如何打包Framework
一、新建Framework Target
然后更改Type类型
接着将需要的swift文件拖入到LynShare Target中
如果项目中有OC文件的话,framework本身是不支持桥接文件的,因此需要额外的两个步骤
1、将需要的oc文件设置为public (此处图片是实际项目,与上图demo不同,下面出现targets不同,同理)
2、在自动生成的.h文件中添加相关的OC头文件
接着将引用的第三方pods文件通过Podfile方式加入
二、新建Bundle Target
bundle是在macOS中
新建后将Base Sdk改成ios
将需要的资源文件如图片、xib等拖入Bundle资源中
接着将xib中的继承与自定义类的Moudle更改成我们framework的名字,否则会使用framework时会报错,Unknown class X in Interface Builder file.
然后将framework的swift 文件中使用代码生成的资源(用到的bundle相关的代码,一般默认我们都声明bundle为nil)改成新建的这个Bundle的名字。注意打包后的Bundle文件是在framework文件中的并不是在项目根目录中的
let lynBundle = Bundle(path: Bundle.main.path(forResource: "LynShare.framework/LynShareBundle", ofType: "bundle")!)
接下来,在framework中,把我们需要暴露给别人使用的类加上open修饰词,这样对方才能调用到我们的类。
生成相关文件
选中Bundle Target,此时选择Device会决定我们生成的是手机使用的库还是模拟器使用的库
然后直接command + b编译,会在Produce文件下发现生成的Bundle文件
此时,右击该文件,选择show in finder,然后通过引用的方式拖入到我们framework文件
这样做的好处是,因为是引用的,因此不用每次更改Bundle内的资源时,都手动替换一次。
此时framework已经包含需要的Bundle文件和相关的swift文件了。
接下来target中选择framework,然后command + b,同样在product文件中出现framework文件,此时frame文件已经打包完成。
测试framework
1、新建项目一个项目,将framework引入(此时应该选择Copy If Need)
2、将需要的Pod文件通过Podfile引入(这些文件并不会加入到framework中,需要使用者加入)
3、引入Bundle文件
4、编写测试代码 注意,import时可能智能提示不会出现,需要手动填写
import LynShare
let courseMainController = LynTableViewController()
let navigatonController = UINavigationController(rootViewController: courseMainController)// self.navigationController?.pushViewController(courseMainController,// animated: false) self.present(navigatonController, animated: true, completion: nil)
5、测试程序
遇到比较诡异的问题
1、按照以上操作后,还会出现Unknown class X in Interface Builder file.错误。
解决方案: 将测试项目复制到桌面重新运行即可,貌似是因为xcode的bug
2、某些pod文件自动连接到打包的项目中,并且提示类重定义
解决方案: 更改打包项目的路径名字即可
3、Bundle编译报错,并且Bundle中缺少相关的资源文件如nib
重新编译Bundle并且右击Bundle文件,显示包内容,查看是否有资源文件缺失,不断编译直到所有资源文件正确生成
打包Framework,使用bundle,Framework联调
Unknown class X in Interface Builder file.
正则表达式使用技巧
在打包过程中,由于使用到Bundle所以资源生成相关的函数都需要更改,如
UIImage(named: "") 需要全部替换成
UIImage(named: "", in: lpmasBundle, compatibleWith: nil)
1、 将项目导入sublime或者vscode,其实xcode也可以
2、commoad+shift+f 打开替换模式
3、打开正则表达式模式
4、输入替换内容
UIImage\(named:(.*)\)
UIImage(named:$1, in: lpmasBundle, compatibleWith: nil)
.*是正则表达式的东西,表示任意字符,正则表达式需要用()包住,其他的()需要加上转移符\
$1指代第一个正则表达式提取出来的结果
网友评论