美文网首页
framework和bundle打包

framework和bundle打包

作者: limbo_lyn | 来源:发表于2019-06-24 23:23 被阅读0次

    由于与第三方的公司合作,需要将项目中的某些功能打包给第三方使用,最初选择.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指代第一个正则表达式提取出来的结果

    相关文章

      网友评论

          本文标题:framework和bundle打包

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