近期有需求,将整个项目打包成SDK,提供给第三方合作,让其进行流量变现,整个项目打包成SDK项目- 参考链接,本文在这个主线上,记录了遇到的好几个编译问题。
背景:
- OC-Swift混合开发项目
- 不少的第三方的SDK
# 问题1:swift不支持静态库
静态库和动态库的制作以及Bundle资源文件的使用 一文中讲解了OC、Swift代码打包成动态库、静态库的步骤及一些注意点
# 问题2:新建framework,会报错,提示swift版本号未设置
此时在build setting中找不到swift language version。此时先创建一个swift文件,就会在build setting中出现
附带小知识点:
关于添加-ObjC的解释
OC-Swift混编需要注意的地方
# 问题3:动态库加载到demo中的运行问题
依赖库未添加完全,造成的真机调试错误
**dyld: Library not loaded: @rpath/RS_SDK.framework/RS_SDK**
**Referenced from: /var/containers/Bundle/Application/14C26167-4BA0-4E43-B834-D79FC8E19797/demo.app/demo**
**Reason: image not found**
打包动态库 dyld: Library not loaded 解决方案链接1
打包动态库 dyld: Library not loaded 解决方案链接2
# 问题4:Storyboard加载viewController的报错
动态库中有要根据storyboard加载viewController的地方报错:
reason: 'Could not find a storyboard named 'Rongshu' in bundle NSBundle
iOS从静态库加载Storyboard并创建ViewController教程
bundle的介绍
补充iOS中关于bundle的介绍:
Bundle简单地讲,就是一个内部结构按照标准规则组织的特殊目录
iOS的应用都是通过bundle进行封装的,对应的bundle类型是Application类型,平时我们通过XCode编译出来的Target(即我们开发的应用),其实就是一个Application类型bundle,即一个文件夹!但是Finder会把这个bundle当做一个文件显示给我们,其实是因为这个bundle自身也是一个package,而Mac系统会把所有的package当做一个文件来对待,显示给用户,从而防止用户误操作导致程序文件损坏或丢失。至于bundle和package有什么区别,就不在这里展开说明了,本文后面所说的bundle都会被Mac系统视为package。
bundle的种类:
- Application
- Frameworks
- Plug-Ins
本质上bundle文件就是一个文件夹,因此framework也是一个文件夹,iOS开发中,如果需要从bundle文件中读取数据,需要在builder phase中将bundle文件加入Copy Bundle Resources。在这里没有读取到framework的原因正是因为我们虽然把framework文件拖入了项目,但是没有将它加入到Copy Bundle Resources中。
一个frame、一个application都是一个bundle,一些xib/sb/imagenamed都是默认从当前bundle([NSBundle mainbundle]也是指当前application)文件中读取图片。所以打包静态库时,要指定这些地方都从这个framework这个动态库bundle中读取图片
//加载storyboard
#define BBStoryBoard [UIStoryboard storyboardWithName:@"storyboard名称" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"SDK名称" ofType:@"framework"]]];
UIViewController * VC = [BBStoryBoard instantiateViewControllerWithIdentifier:@"VCSBID"];
# 5. 关于项目中资源的打包- bundle
-
代码中,storyboard中使用bundle中的图片,设置图片名称的时候,需要把图片路径写全xxx.bundle/xx/icon.png
-
Assets不要放在bundle中
- 打包后,Assets会生成一个Assets.car的文件, xib、sb中引用图片的地方都不会更改路径。代码中使用到图片时
- imageNamed加载图片不成功的原因是,imageNamed是类方法,它的[self class]是UIImage,而UIImage类所在的bundle是UIKit这个系统动态库中。
//用这个方法替代+ (UIImage *)imageNamed:(NSString *)name
+ (UIImage *)imageInBundleNamed:(NSString *)name
{
NSBundle *bundle = [NSBundle bundleForClass:[库中某个类 class]];
return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
}
网友评论