美文网首页
iOS 整个项目打包成SDK遇到的问题汇总

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

作者: Tenloy | 来源:发表于2019-03-06 15:24 被阅读0次

    近期有需求,将整个项目打包成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的种类:

    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

    • 代码中,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];
    }
    

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ubxgyqtx.html