iOS 整个项目打包成SDK遇到的问题汇总

2019-03-06  本文已影响0人  Tenloy

近期有需求,将整个项目打包成SDK,提供给第三方合作,让其进行流量变现,整个项目打包成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的种类:

  1. Application
  2. Frameworks
  3. 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

//用这个方法替代+ (UIImage *)imageNamed:(NSString *)name
+ (UIImage *)imageInBundleNamed:(NSString *)name
{
    NSBundle *bundle = [NSBundle bundleForClass:[库中某个类 class]];
    return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
}

参考链接:https://www.jianshu.com/p/50a353812454

上一篇下一篇

猜你喜欢

热点阅读