Swift3.0编译动态Framework

Swift3.0编译动态Framework

本文将记录swift3.0编译动态Framework,并导入OC的工程来使用的过程,主要内容如下:

  • 编译swift framework
  • 在OC主工程调用 swift framework
  • 小提示

一、编译swift framework

1、如上图创建 framework target ,比如target命名为 TargetABC,xcode会默认创建头文件 TargetABC.h ,也被称作 umbrella header file 。如下图将代码源文件添加到 compile Sources里面,资源文件如xib,Assets.xcassets 添加到Copy Bundle Resources里,对外开放的头文件(framework的头文件如TargetABC.h 和引用到的OC的.h文件),然后运行编译

注:如何使用 private,public,open等关键字来控制外部对framework接口的访问权限,请自行Google ^_^

2、framework 访问内部资源如 xib,storyboard,图片 ,plist等
在 framework 中并不需要使用 bundle 来对资源打包,Assets.xcassets 文件里的图片打包后生成 Assets.car 文件,里面包含了所有的图片资源。按照上图添加的资源文件,在编译生成framework 时,framework 内容如下图:

例如:读取 framework 中的 storyboard 文件
使用framework中的类(比如 PEManager 为 TargetABC 开放的接口类) 和 Bundle 的 init(for aClass: Swift.AnyClass) 方法来初始化bundle

let bundle = Bundle.init(for: PEManager.self)
let storyBoard = UIStoryboard.init(name: “storyBoardID”,bundle:bundle)

读取图片等其他文件都可以通过类似方式来获取

3、如果在 framework 中还需要调用OC代码,则需要做一下两个步骤:
1)、在 TargetABC 的 Build Settings -> Packaging 选项里,Defines Module 选项设置为 Yes
2)、在 TargetABC.h 中引入所有OC 的.h文件,例如:

#import < XYZ/XYZCustomCell.h>
#import < XYZ/XYZCustomView.h>
#import < XYZ/XYZCustomViewController.h>

二、OC在主工程调用 swift framework

1、 导入framework,并创建OC调用swift需要的桥接头文件,命名规则: 工程名-Swift.h
将 framework 拖入OC工程中,在 target 的 General 选项中,在 Embedded Binaries 一栏中添加framework ,添加后在 Linked Frameworks and Libraries 一栏中就可能会出现两个同名的该 framework ,将这两个framework在此栏中删除。
动态的framework 需要添加在 Embedded Binaries 栏中 ,而不是在 Frameworks and Libraries ,这个做法可以避免出现一个导致app crash 的异常:dyld: Library not loaded …… Reason: image not found
如下图:

要在OC的项目中调用swift 的接口,需要依赖于桥接的头文件:工程名-Swift.h,这个文件可以使swift的接口暴露给OC来调用
原文如下:

When you import Swift code into Objective-C,you rely on an Xcode-generated header file to expose those files to Objective-C. This automatically generated file is an Objective-C header that declares the Swift interfaces in your target. It can be thought of as an umbrella header for your Swift code. The name of this header is your product module name followed by adding “-Swift.h”.

2、添加 framework 依赖的第三方类库
在OC工程中添加 framework 需要的第三方库,在实际项目中会经常用到 cocoapods 来管理第三方库,而有些第三方库使用swift来编写的,那么在编译过程中可能会遇到这个问题,比如 第三方库SnapKit 更新到最新版后(最新版是 swift 3.0 编写的), 在编译时报错 Dependency Analysis Error : Use Legacy Swift Language Version …,如图所示

这时,在Pods.xcodeproj 的 SnapKit target 中修改编译选项 Use Legacy Swift Language Version 为 NO 就可以了,修改路径为:Pods.xcodeproj 工程 -> Targets -> SnapKit -> Swift Compiler - Version -> Use Legacy Swift Language Version ,如下图:

三、小提示

1、为了在OC中可访问和可用,Swift类必须继承于Objective-C类的后代,或者必须在类定义时,在前面标记为@objc。比如在定义PEManager类时,可以这样写

public class PEManager : NSObject

也可以这样写

@objc public class PEManager

2、关于 dyld: Library not loaded …… Reason: image not found 导致app crash 的问题还可以在 stackoverflow 上寻找其他的解决办法,上文中描述的是本人在实践中的解决办法,未必每种情况都适用。

the end …

参考文章

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...