j9九游会登陆--首页直达

代码构造和 FRAMEWORK
  • 智网科技
  • ###
  • 分类: 履历之谈
  • 阅读量: 142

Apple 为了 iOS 平台的宁静性思索,是不容许静态链接非体系的框架的。因而在 app 开辟中j9九游会所利用的第三方框架假如因此库文件的方法提供的话,肯定都是必要链接并打包进最初的二进制可实行文件中的静态库。最后级和原始的静态库因此 .a 的二进制文件加上一些 .h 的头文件举行界说的情势提供的,如许的静态库在利用时比力贫苦,j9九游会除了将其添加到项目和设置装备摆设链接外,还必要举行指明头文件地位等事情。如许形成的后果不但是添加起来比力贫苦,并且由于头文件的途径大概在差别情况下会存在纷歧样的状况,而形成项目在换一个开辟情况后就由于设置装备摆设题目形成无法编译。有过这种履历的开辟职员都晓得,分配开辟情况是一件十分让人厌恶和泯灭工夫的事变。

而 Apple 本人的框架都是 .framework 为后缀的静态框架,是集成在操纵体系中的,j9九游会利用这些框架的时分只必要在 target 设置装备摆设时举行指明就可以,十分利便。

由于 framework 的易用性,因而许多开辟者都很喜好相似的“即拖即用,无需设置装备摆设”的体验。一些框架和库的开辟者为了利用体验一样平常会用一些来模仿地天生举动相似的框架,好比  大概  的 iOS SDK 都是基于这种技能完成的。

但要分外指出,固然和 Apple 的框架的后缀名一样是 .framework,利用方法也相似,但这些第三方框架都是实真实在的静态库,每个 app 必要在编译的时分举行独马上链接。

从 Xcode 6 开端 Apple 官方提供了独自制造相似的 framework 的办法,这种便当性大概会使代码的构造方法产生严重变革。j9九游会如今可以在一个 app 项目中添加新的范例为 Cocoa Touch Framework 的 target,并在统一个项目中经过 import 这个 target 的 module 名字 (一样平常和这个 target 的名字是一样的,除非利用了一些像中杠 - 如许在 module 名中的合法字符),来引入并举行利用。

这类框架在运转时是嵌入在 app 的 bundle 中举行静态链接的,j9九游会的 app 本体以及各个 extension 都可以利用。这么做的一个分明的利益是j9九游会可以在差别 target 之间很复杂地重用代码,由于j9九游会总会有一些在 app 自己和扩展中反复的工具,这时分将它们用框架的情势构造起来会是一个很好的选择。另一方面,就算你没有方案开辟扩展,实验将一局部代码分散到框架中也是有助于j9九游会梳理项目标架构的。好比将一切的模子层构造为一个框架,假如你在这个历程中发明有难的话,这很大概便是你必要重新思索和重构项目架构的信号了。

但如许制造的框架只能嵌入在本人的 app 中,假如j9九游会盼望将本人制造的框架提供应他人利用的话,j9九游会可以新建一个专弟子成框架的项目。接上去j9九游会会经过一个复杂的例子来报告你应该怎样做,但在这之前,必要先阐明,利用框架项目并独自导出 framework 文件这种做法,是为 Objective-C 预备的。由于 Swift 临时并不是波动版本,而 Swift 的运转时也是常常改动,而且没有集成到操纵体系中,以是官方并不保举独自为 Swift 制造框架。j9九游会固然可以利用纯 Swift 制造可用的第三方库 (接上去你会看到要怎样做),但并不克不及包管它在一切的运转情况中都能精良事情。关于 Swift 代码的兼容性,可以参看相干章节的内容。

在以后 Swift 中,j9九游会利用 Swift 框架的最佳理论是将整个框架项目 (包罗此中源代码) 以项目依赖的方法添加到本人的项目中,并一同举行编译利用。本节所要报告的是制造独自的编译好的框架文件供他人利用,固然临时还不发起将这种办法用在实践项目之中,但这里偏重想展示的是利用 Swift 制造框架文件的大概性。

固然你也可以利用 Objective-C 来制造框架,如许就没有这些限定了,由于原本这个特征如今临时也只是为 Objective-C 预备的。利用 Objective-C 制造框架的历程和 Swift 迥然不同[jiǒng rán bú tóng],由于j9九游会这是一本关于 Swift 的册本,以是就只利用 Swift 来举行介绍了。

起首经过新建菜单的 Framework & Library 创立一个 Cocoa Touch Framework 项目,定名为 HelloKit,然后添加一个 Swift 文件以及任意一些什么内容,好比:

1
2
3
4
5
public class Hello {
    public class func sayHello() {
        print("Hello Kit")
    }
}

留意j9九游会在这里添加了 public 声明,这是由于j9九游会的目标是在以后 module 之外利用这些代码。将运转目的选择为任一 iOS 模仿器,然后利用 Shift + Cmd + I 举行 Profiling 编译。j9九游会可以在项目标天生的数据文件夹中 (利用 Window 菜单的 Organizer 可以找到对应项目标该文件夹地位) 的 /Build/Products/Release-iphonesimulator 里找到 HelloKit.framework。

假如间接利用 Cmd + B 举行编译的话j9九游会失掉的会是一个 Debug 版本的后果,在绝大少数状况下这应该不是j9九游会想要的,除非你是必要用来举行调试。

然后新建一个项目来看看怎样利用这个框架吧。创建新的 Xcode 项目,言语固然是选择为 Swift,然后将方才的 HelloKit.framework 拖到 Xcode 项目中就可以了。j9九游会最好勾选上 Copy items if needed,如许原来的框架的窜改就不会影响到j9九游会的项目了。

接上去,j9九游会在必要利用这个框架的地方加上对框架的导入和挪用。为了复杂,j9九游会就在 AppDelegate.swift 的 didFinishLaunching 办法中对 sayHello 举行一次挪用:

1
2
3
4
5
6
func application(application: UIApplication!,
    didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    // Override point for customization after application launch.
    Hello.sayHello()
    return true
}

固然,别遗忘在顶部加上 import HelloKit 来导入框架。

和其他的只做链接的添加框架的方法略有差别,最初一步j9九游会还必要在编译的时分将这个框架复制到项目包中。在 Build Phases 选项卡里添加一个 Copy File 的阶段 (如图),然后将目的设定为 Frameworks,将j9九游会的 HelloKit.framework 添加到新建的阶段里,来指定 IDE 在编译时举行复制。

add-file.jpg

我想就这么多了,如今利用模仿器运转这个项目,j9九游会应该可以在控制台中看到j9九游会的输入了:Hello Kit。

但故事还没有终极完毕。j9九游会方才编译的时分只做了模仿器的版本,假如你实验一下在 app 项目中将目的切换为真机的话,会发明基本无法编译,这是由于模仿器和实践设置装备摆设所利用的架构差别招致的。j9九游会必要回到框架项目中,将编译目的切换为 iOS Device,然后再次利用 Shift + Cmd + I 举行编译。这时j9九游会可以在 Release-iphoneos 文件夹下失掉真实设置装备摆设可以利用的框架。最初j9九游会经过 lipo 下令将实用于多个架构的二进制文件举行兼并,以失掉可以在模仿器和实践设置装备摆设上通用的二进制文件:

1
2
3
lipo -create -output HelloKit \
       Release-iphoneos/HelloKit.framework/HelloKit \
       Release-iphonesimulator/HelloKit.framework/HelloKit

然后将失掉的包括各架构的新的 HelloKit 文件复制到方才的模仿器版本的 HelloKit.framework 中 (没错实在它是个文件夹),掩盖原来的版本。最初再将 Release-iphoneos 中的框架文件里的 /Modules/HelloKit.swiftmodule 下的 arm.swiftmodule 和 arm64.swiftmodule 两个文件复制到模仿器版本的对应的文件夹下 (这个文件夹下终极应该会有 i386,x86_64,arm 和 arm64 四个版本的 module 文件)。j9九游会如今就失掉了一个通吃模仿器和实践设置装备摆设的框架了,用这个框架交换失方才j9九游会复制到 app 项目中的谁人,app 应该就可以同时在模仿器和设置装备摆设上利用这个自制框架了。

再次提示,本文所述的用 Swift 构建框架项目,然后在其他项目中利用这个框架的做法并不是保举做法。关于 Objective-C 来说这个做法没有什么太大题目,但关于 Swift 的框架来说,由于如今 Swift 的表明和运转情况还没有十分波动,因而在项目中利用非同项目 target 的框架的时分,很有大概项目和框架的 Swift 运转情况 有所差别。偶然候这会招致不用要的题目和贫苦。