移动端 framework实现使用swift开发

morangeman · June 11, 2020 · 7 hits

loadStyle("/hexo-github/style.css"); loadStyle("/hexo-github/octicons/octicons.css"); new Badge("#badge-container-huos3203-JHHomeAPP-813e4b", "huos3203", "JHHomeAPP", "813e4b", false);

在静态库组件中使用 swift 开发

基于静态库的开发,实现封装静态库/Framework 并使用 swiftOC 混编开发

创建三个角色

  1. 主项目:JHHomeAPP
  2. 静态库组件:FirstPlug
    • SwiftInStaticLib(包含 Swift 源码实现的静态库)
  3. 动态库secondFramework

静态库:问题 1

当静态库组件中存在 swift 源码时,依赖该组件的主工程会报错:

1
2
3
4
5
6
7
8
ld: warning: Auto-Linking library not found for -lswiftDispatch
ld: warning: Auto-Linking library not found for -lswiftCoreFoundation
ld: warning: Auto-Linking library not found for -lswiftObjectiveC
ld: warning: Auto-Linking library not found for -lswiftDarwin
ld: warning: Auto-Linking library not found for -lswiftFoundation
ld: warning: Auto-Linking library not found for -lswiftCoreGraphics
ld: warning: Auto-Linking library not found for -lswiftCore
ld: warning: Auto-Linking library not found for -lswiftSwiftOnoneSupport

  1. 联想方法:
    设置 Always Embed Swift Standard Libraries: YES
    结果无效。
  2. 适用的解决方法
    在主工程中新建一个空的 swift 源文件,不需要自动新建$(SWIFT_MODULE_NAME)-Swift.h映射文件和JHHomeAPP/JHHomeAPP-Bridging-Header.h头文件。
    使用方法 2,问题 1 就不存在了,证明了在静态库中可以使用 swift 源码文件进行开发,同样证明了静态库可以封装包含 swift 源码的静态库。

Framework:问题 2

  1. 在动态库中 objc 源码方法可以封装到静态库,并在可执行文件中调用。
  2. 当在 Framework 中新建 swift 源文件时,第一次编译运行出现崩溃问题:
    1
    2
    3
    dyld: Library not loaded: @rpath/libswiftCoreImage.dylib
    Referenced from: .../../Debug-iphonesimulator/SecondFramework.framework/SecondFramework
    Reason: image not found

解决办法:需要在ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES设置为YES.再次编译出现问题 3。

Framework: 问题 3

当在 oc 源码文件中用引用-Swift.h头文件时,出现一下问题:

1
2
3
'SecondFramework-Swift.h' file not found
#import "SecondFramework-Swift.h"
^~~~~~~~~~~~~~~~~~~~~~~~~

结果将:Install Objective-C Compatibility Header : NO可以正常调用 swift 方法了。

验证:framework 可以封装到静态库中,当有 swift 源码实现时需要设置 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES=YES

总结

  1. Product Module Name: 该项默认为项目名或自定义的名称
  2. Defines Module: 设置为 YES(framework 默认为 YES,静态库默认为 NO)
  3. Embedded Content Contains Swift: 设置为 YES
  4. Install Objective-C Compatibility Header:设置为 YES(如上题说:在 framework 中设置为 NO,才能正常运行,在静态库中似乎不影响)
  5. Objective-C Bridging Header: 自定义需要桥接到 Swift 中的 OC 头文件(EX:$(SRCROOT)/Swift-Bridging-Header.h)
No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.