iOS框架的创建(一) —— 一个详细的框架创建流程(一)

版本记录

版本号 时间
V1.0 2018.08.11

前言

很多时候我们可以用第三方库,比如是SDWebImage或者一些视频云播放器的框架或库,这些框架其实也是有人写好了封装起来的,不同的工程都可以直接拿来使用,以达到代码分享、模块化你的代码以及将其作为第三方库进行发布。

必要说明

您是否曾想在两个或多个应用程序之间共享一大堆代码,或者想与其他开发人员共享您的程序的一部分?

也许您希望以类似于iOS SDK按功能分离其API的方式模块化您的代码。 或许您希望以与流行的第三方库相同的方式发布您的代码。

在本教程中,您将学习如何使用Frameworks完成上述所有操作!

框架有三个主要目的:

  • 代码封装。
  • 代码模块化。
  • 代码重用。

您可以与其他应用,团队成员或iOS社区共享您的框架。 当与Swift的access control结合使用时,框架有助于在代码模块之间定义强大,可测试的接口。

用Swift的说法,module是一组编译在一起发布的代码。 框架是一种类型的模块,而应用程序是另一个示例。

在本教程中,您将通过以下方式了解框架的细节:

  • 为旋钮控件创建一个新框架。
  • 迁移现有代码。
  • 将整个内容导回到应用程序中。
  • 在Interface Builder中动态渲染自定义组件。
  • 将其打包成超便携式CocoaPod。
  • Bonus:为您的框架设置存储库。

当你完成时,应用程序将完全像以前一样运行,但将使用你开发的可移植框架!


开始

在Xcode中打开启动已有的项目。

KnobShowcase是一个简单的应用程序,它演示了如何与控件(如圆形滑块)进行交互,例如在调音台上找到的控件。

构建并运行以了解其工作原理。

此控件的代码位于两个文件中:

  • Knob.swift具有所有视图逻辑。
  • ViewController.swift负责创建旋钮并与之交互。

这个旋钮控制很有趣,但是在更多的应用中使用到不是更好吗?框架就可以帮你做到这一点。


Creating a Framework - 创建一个框架

框架是独立的,可重复使用的代码和资源块,您可以将其导入任意数量的应用程序,甚至可以在iOS,tvOS,watchOS和macOS应用程序之间共享。

如果您使用其他语言编程,您可能听说过node modulespackagesgemsjars。 框架是这些的Xcode版本。 iOS SDK中常见框架的一些示例是FoundationUIKitAVFoundationCloudKit

注意:如果您想了解有关Frameworks的更多信息,请阅读What are Frameworks?

1. Framework Set Up - 框架设置

在Xcode 6中,Apple引入了Cocoa Touch Framework模板以及access control,因此创建框架从未变得如此简单。 首先要做的是为框架创建项目。

  • 1)在Xcode中,选择File ▸ New ▸ Project….
  • 2)选择iOS ▸ Framework & Library ▸ Cocoa Touch Framework
  • 3)点击Next
  • 4)设置Product NameKnobControl,使用你自己的Organization NameOrganization Identifier
  • 5)点击Next
  • 6)在文件选择器中,选择在与KnobShowcase根文件夹相同的级别创建项目。
  • 7)点击Create

现在你有一个创建框架的项目(尽管很无聊)!

2. Add Code - 添加代码

您当前的状态是没有代码的框架,这与没有糖的巧克力一样吸引人。 在本节中,您将通过将现有文件添加到框架来引入代码。

KnobShowcase源目录中,将Knob.swift文件拖到Xcode中的KnobControl项目中。 如果需要,请务必选中Copy items if needed,以便将文件实际复制到新项目中,而不是仅添加引用。 框架需要自己的代码才能独立,而不是引用。

仔细检查Knob.swiftKnobControl中是否具有Target Membership,以确保它出现在最终框架中。 您可以在File inspector中对此进行验证。

构建框架项目以确保您在没有构建警告或错误的情况下获得Build Succeeded。

Knob.swift中包含三个不同的类:

  • Knob - 旋钮:实际的自定义控件。
  • KnobRenderer:一个私有类,用于跟踪与渲染旋钮本身相关的代码。
  • RotationGestureRecognizer:一个私有类,可以与旋钮进行交互。

您的下一个任务是将这些组件分成不同的文件。 首先移动KnobRenderer

  • 1)转到File ▸ New ▸ File…并选择iOS ▸ Source ▸ Swift File
  • 2)点击Next
  • 3)在下一个屏幕截图上,将类名指定为KnobRenderer,然后选择KnobControl▸KnobControl目录。
  • 4)点击Create
  • 5)打开Knob.swift,剪切(Command-X)整个KnobRenderer类并将其粘贴(Command-V)import Foundation语句正下方的KnobRenderer.swift中。
  • 6)删除KnobRenderer的私有修饰符。 当代码全部包含在Knob.swift中时,这很好,但现在必须可以使用默认的internal修饰符访问整个模块。

RotationGestureRecognizer类重复步骤1到6。 在这种情况下,当您执行第五步时,请确保您还获取导入UIKit.UIGestureRecognizerSubclass语句,否则编译器将在构建阶段进行complain

创建了两个新文件后,Knob.swift现在只包含Knob类。

注意:将类分成它们自己的文件并不是绝对必要的,但为了使代码组织起来,这是一个很好的做法。 您不希望拥有难以理解和维护的庞大文件。


Add the Framework to the Project - 将框架添加到项目

关闭KnobControl项目,然后返回KnobShowcase项目。 删除Knob.swift文件。 在确认对话框中选择Move to Trash

Build项目,你会看到几个可预测的错误,其中包含了Xcode不知道什么是旋钮。 好吧,你实际上会看到Use of undeclared type ‘Knob’错误消息。

添加KnobControl框架项目是解决这些问题的方法。


Embed Your Binary - 嵌入你的二进制

右键单击项目导航器中的根KnobShowcase节点。 单击Add Files to “KnobShowcase”。 在文件选择器中,导航到并选择KnobControl.xcodeproj。 单击Add以将KnobControl.xcodeproj添加为子项目。

注意:将框架项目添加到app项目并不是绝对必要的。你可以添加KnobControl.framework输出。但是,组合这些项目可以更轻松地同时开发框架和应用程序。 您对框架项目所做的任何更改都会自动传播到应用程序。 它还使Xcode更容易解析路径并知道何时重建项目。

Build并运行,您将看到相同的编译错误!

即使这两个项目现在在一起,KnobShowcase仍然没有得到KnobControl。 这就像他们坐在同一个房间,但KnobShowcase无法看到新的框架。

您将框架链接到应用程序的目标以解决此问题。 首先,展开KnobControl项目以查看Products文件夹,然后在其下面查找KnobControl.framework。 此文件是框架项目的输出,用于打包二进制代码,标头,资源和元数据。

选择顶级KnobShowcase节点以打开项目编辑器。 单击KnobShowcase目标,然后转到General选项卡。

向下滚动到Embedded Binaries部分。 将KnobControl.frameworkKnobControl.xcodeprojProducts文件夹拖到此部分。

您刚刚在Embedded BinariesLinked Frameworks and Binaries中添加了框架条目。

现在应用程序知道框架以及在哪里找到它,所以这应该足够了,对吧?

构建KnobShowcase项目。 更多相同的错误。


Access Control - 访问获取控制

你的问题是虽然框架是项目的一部分,但是项目的代码并不知道它 - 看不见。

转到ViewController.swift,并将以下行添加到文件顶部的导入列表中。

import KnobControl

这很关键,但是这种包含仍然无法解决构建错误。 这是因为Swift使用access control来确定构造是否对其他文件或模块可见。

默认情况下,Swift仅在其自己的模块内部使internal或可见。

要恢复应用程序的功能,您必须更新Knob类的访问控制。

虽然它有点单调乏味,但更新访问控制的过程通过隐藏不应出现在框架之外的代码来提高模块性。 您可以通过将某些函数保留为无访问修饰符,或通过明确声明它们为internal来实现此目的。

Swift有五个级别的访问控制。 创建自己的框架时,请遵循以下经验法则:

  • Open and public:用于应用程序或其他框架调用的代码,例如 自定义视图。
  • Internal:用于框架内的函数和类之间使用的代码,例如 该视图中的自定义图层。
  • Fileprivate:用于单个文件中使用的代码,例如 一个帮助函数,用于计算布局高度。
  • Private:用于封闭声明中使用的代码,例如单个类块,以及该声明在同一文件中的扩展。

Knob成为Showcase应用程序的一部分时,内部访问不是问题。 现在它已经在一个单独的模块中,必须将其公开以供应用程序使用它。 你将在下一节中做到这一点。

注意:如果您想了解有关访问控制内部的更多信息并了解openpublic之间的区别,请查看 Access Control Documentation


Update the Code - 更新代码

KnobShowcase中打开Knob.swift。 通过将public关键字添加到类定义来使类成为公共,如下所示:

public class Knob : UIControl {

现在任何导入KnobControl框架的应用程序文件都可以看到Knob

现在将public关键字添加到:

  • 属性minimumValue,maximumValue,value,isContinuous,lineWidth, startAngle,endAngle,pointerLength和color。 注意value,该属性将是public的,而setter继续是私有的。
  • 两个init函数。
  • 方法setValue(_:animated :)tintColorDidChange()

注意:您可能想知道为什么必须将init方法声明为public。 Apple在其访问控制文档中解释了这个以及其他更精细的访问控制点。

现在构建并运行。 好消息是错误消失了,坏消息是你遇到了如下运行时崩溃:

这是怎么回事? 下一篇会进行介绍。

后记

本篇主要介绍了一个详细的框架创建流程,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 版本记录 前言 很多时候我们可以用第三方库,比如是SDWebImage或者一些视频云播放器的框架或库,这些框架其实...
    刀客传奇阅读 939评论 0 6
  • 本文系半撇私塾新媒体创意写作项目里程碑作品一 那些色彩斑斓的雨伞,不是只有在雨天才能看得见。 在位于上海市中心的最...
    观月岑息阅读 227评论 0 0
  • 我记得高中的时候经常听到一句话 很多人经常把它抄下来 感谢曾经伤害过我的人,他们磨砺了我的意志; 感谢曾经欺骗过我...
    DJ沐格阅读 609评论 0 0
  • 时间飞逝,2018年已经接近尾声,回顾这一年来自己制定的目标基本都实现了。这一年来虽觉得累,但是很充实,尤...
    Ivy冬阅读 183评论 0 0