Xcode 制作Swift和OC混编SDK

作者: 老牛爱吃嫩草 | 来源:发表于2016-12-23 21:57 被阅读328次

    简介:通过一个简单登录SDK,介绍Swift和OC混编下如何打包和调用SDK

    github地址:https://github.com/wuxingxing8912/LNLoginSDK

    一、创建framework静态库

    第一步、新建工程,选择Cocoa Touch Framework。

    第二步、导入需要打包的源文件。

    第三步、配置工程

    (1)、修改暴露头文件

    与纯OC库不同的是,混编库还需要在“项目名.h”(默认生成)下导入拖入的头文件(头文件内容与项目中桥接文件内容相同),原因在下面的填坑记录中会讲到。

    (2)、设置编译模式: 在 Product -> Scheme -> Edit Scheme 下,将Build Configuration改为Release。

    (3)、设置编译出来的静态库包含的指令集,选中No,如果选Yes,则只包含当前选中编译设备的指令集

    (4)、编译得到.framework文件,注意需要真机和模拟器各编译一次。

    二、打包资源文件

    第一步、创建Bundle(注意Bundle在macOS选项下)。

    第二步、设置Base SDK为iOS SDK。

    第三步、编译得到.bundle文件,注意需要真机和模拟器各编译一次。

    第四步、修改.framework中使用Bundle中资源的地方

    三、调用

    Swift工程调用:

    第一步,将.framework和.bundle文件拷贝到工程根目录下(调用Demo里使用的是模拟器生成的库文件)

    第二步,分别将.framework和.bundle文件拖到Xcode项目跟目录下,在弹窗中选中Copy items if needed。

    第三步、配置工程:在General->Embedded Binaries下加入.framework。

    第四步、在Build Phases -> Copy Files(没有则点击左上角+号添加) 下,将Destination选择为Frameworks,点击+号将.framework加进来。

    第五步、在代码中使用:

    步骤为:导入头文件 -> 添加并实现代理方法 -> 创建对象 -> 调用方法

    注:ViewController必须带Navigation Controller(见Main.Storyboard),否则不会跳转。

    OC工程调用:

    OC调用方法的前三步与Swift一致

    第四步: 在Build Settings -> Build Options 下,将Always Embed Swift Standard Libraries设置为Yes。

    第五步、在代码中使用:

    步骤为:导入头文件 -> 添加并实现代理方法 -> 创建单例 -> 调用方法

    注:ViewController必须带Navigation Controller(见Main.Storyboard),否则不会跳转。

    报错记录:

    1、如果没有添加Copy Files会报错:

    2、Bundle初始化失败,会报错,原因可能是Bundle使用的资源文件不存在或Bundle名称错误:

    4、填坑记录:

    (1)、Swift不支持.a静态库

    (2)、在framework下不允许添加桥接文件,解决办法是在配置好后还需要在“项目名.h”(默认生成)下导入该头文件。

    (3)、Bundle与Framework名称不一样时会报这个错误,改成一样就行了,至于为什么,我还没找到原因,求大神指教。(我这里都是LNLoginKit)

    待处理:

    1、合并framework,参考:http://blog.sina.com.cn/s/blog_71e456db0101d8pb.html

    合并后的库不可用,不知道为什么,求大神指教。

    2、虽说是Swift和OC混编SDK,但目前只支持项目中使用了Swift调用OC的工程,暂不支持OC调用Swift的工程打包Framework,因为“productName-Swift.h”文件是隐藏的,无法暴露出来,因此也就不可能引用,如果哪位大神有办法解决,请回复分享,万分感谢。

    参考:

    http://www.cnblogs.com/huntaiji/p/3490911.html

    http://blog.csdn.net/tianshats/article/details/52045974

    http://www.jianshu.com/p/3fce0bd6f045

    http://www.jianshu.com/p/43d55ae49f59

    相关文章

      网友评论

      • 罗同学_:swift不支持.a静态库该如何解决呢
        老牛爱吃嫩草:@罗同学_ 官方不支持,所以无解
      • LD_左岸:主要是 他这个ChatApp-swift.h文件好像是系统自动生成的 里面的方法也不知道怎么神奇的生成的....
        老牛爱吃嫩草:就想Swift调用OC需要<produceName-Bridging-Header.h>的桥接头头文件,你可以将这个ChatApp-swift.h文件理解为OC调用Swift的桥接头文件
      • LD_左岸:大神啊 有这么个问题 不知道您遇见过吗 需要打包成framework的原工程是 OC和Swift混编的
        该工程名是ChatApp 工程里有个ChatApp-swift.h文件 这个文件里有一些方法是转换swift文件里的方法为OC的方法的 现在打成framework那些转换方法找不到报错了....................
        老牛爱吃嫩草:没遇到过,不过根据你的描述我猜测你工程中用到了OC调用Swift,我的方法目前只支持项目中使用了Swift调用OC的工程,暂不支持OC调用Swift的工程打包Framework,原因很简单:“productName-Swift.h”文件是隐藏的,无法暴露出来,因此也就不可能引用,所以你引用ChatApp-swift.h文件会报错,需要解决你的问题可能需要将调用的swift用oc重写 或者直接打源码包

      本文标题:Xcode 制作Swift和OC混编SDK

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