KPCC API客户端:创建框架

KPCC正在开发我们的iPhone应用程序的新版本,这可能是最难保留的秘密,至少对我来说是最重要的-这个人负责编写它。

该项目的设计目标很多(我保证,至少会写一篇专门的博客文章!),但是更引人注目的机会之一就是创建一个更加模块化的代码库。 为此 ,我们的早期想法之一是将与KPCC API的所有交互分解为一个单独的框架。

KPCC API是我们的iPhone应用程序(以及其他一些项目)与服务器进行通信的渠道。 这是我们检索节目,新闻标题和剧集列表以显示给用户的方式。 我们应用程序的重要部分涉及对基于JSON的API进行各种网络调用,并构建一个供我们的应用程序使用的模型(使用Program,Article和Episode struct实例等)。

如果将其与应用程序的其余部分分开,那会不会很好? 我同意!

原因如下:

  • 模块化鼓励程序员在API客户端代码和项目的其余部分之间严格区分关注点。 这改善了可维护性。
  • 该API客户端可以在其他Swift(和Objective-C!)项目中重用,甚至可以在其他平台(例如macOS,tvOS,watchOS或高端的服务器端Swift框架,例如Vapor)上使用。 尽管我们目前没有任何消息要宣布,但这确实为以后的实验打开了大门,因为我们所做的几乎所有操作都会与API进行交互。
  • 代码重用意味着调试的代码更少了,使用的代码更多了,因此随着发现和平滑接缝,它变得更加扎实。

当然,在任何项目忙碌的初期,很容易编写大量代码来引导它,而无需考虑使其模块化,因此我们的API客户端代码最初直接集成到了项目中。 但是现在我们正处于发布新iPhone应用程序的风口浪尖上,我花了一些时间重新讨论以框架形式进行的单独KPCC API客户端项目的想法。


创建框架

框架是相关代码的集合,可以将其嵌入Xcode项目中以提供通用功能。 每个iOS应用程序都依赖于一堆系统提供的框架(您好,UIKit!),并且大多数不平凡的框架都至少包括几个第三方框架。

创建我们自己的框架并不难,但是有一些陷阱。 我将详细说明以下步骤,并提供一些指导以帮助您创建自己的步骤。

要在Xcode中创建框架,请从菜单栏中选择File> New> Project ,然后确保已为项目模板类型选择iOS 。 选择“ Cocoa Touch Framework”选项,然后单击“ 下一步”

系统将提示您提供产品名称。 这是您的框架的名称,应简短且具有描述性,不能带空格或连字符(我使用“ KPCCAPIClient”)。 单击“ 下一步”,然后将项目保存到任意位置。

切入

创建项目后,我便开始从主要的iOS应用项目中移出与API相关的源文件。 对我来说,这是一个思考的时刻,因为我很快意识到与API相关的代码与不与API相关的代码混合在一起,因此必须分开。 尽管这导致了相当繁琐的修剪,但也验证了制定外部框架的决定。

如何知道现有项目中要添加什么和要保留什么? 好吧,这取决于项目。 我决定将这个项目限制为处理API调用并定义它们生成的模型结构。 像任何框架一样,应该整洁。

另外,不用说,任何涉及视图的内容(数据表示形式)都被排除在外。 使用我们的框架的项目将以最适合其目的的方式处理任务本身,从而得到最好的服务。

移走所有内容并清除了所有不适合的代码后,您应该能够构建框架项目,而不会出现任何警告或错误(除非已经有警告或错误,在这种情况下,您应该解决这些问题)! )。

嵌入

将框架嵌入另一个项目中非常简单。 只需打开您的应用程序项目,然后将框架的Xcode项目文件(例如,“ KPCCAPIClient.xcodeproj”)从Finder拖到文件导航器层次结构的顶层即可。

现在,扩展框架项目,然后扩展其“ 产品”组。 您应该在那里看到您的框架文件(例如“ KPCCAPIClient.framework”)。 接下来,在文件导航器中选择您的主项目,以便可以看到其关联的目标,然后选择您希望与框架一起使用的目标。

确保“ 常规”部分可见,然后将您的框架文件拖到“ 嵌入式二进制文件”列表中。 这将使其可用于您的应用程序。

看到上方屏幕快照中“产品”下列出的多个框架吗? 现在,您只有一个。 稍后对此进行更多讨论。

完成此操作后,无论使用什么位置,都应该能够在项目中导入该框架,如下所示:

 导入UIKit 
导入KPCCAPIClientclass ViewController:UIViewController {
覆盖func viewDidLoad(){
// ...
}
}

拒绝访问!

您可能会惊讶地发现,移入框架的完美代码一旦嵌入到应用程序中便无法编译,从而使其毫无用处。 如果收到任何错误,则可能是您为类和结构设置的访问控制级别不允许在其定义模块(框架)之外进行访问。

这是重新访问类,结构,方法和属性的封装的绝好机会! 通过将项目嵌入公共对象来设置要使用的任何内容,并将其余标记为内部私有或文件私有 。 Apple的文档更详细地介绍了Swift访问控制,但是通常建议您在框架之外尽可能少地公开。

保持目标

请记住,该框架的目标之一是创建一个与平台无关的工具,以与我们的服务器API进行交互,但是到目前为止,我们仅创建了Cocoa Touch(iOS)框架。 为了将此功能引入其他平台,我们将需要添加一些目标。

为此,请在Xcode文件导航器中选择您的框架项目,然后在目标列表下方,单击+按钮。 这将显示一个模板选择器(非常类似于您最初用于创建项目的选择器),您应该从中选择关联平台的框架模板。 我从macOS开始,然后在watchOS和tvOS上重复了这一步骤。 全套!

您可能需要遍历所有源文件,并确保将它们暴露给您创建的每个目标。 这可能会非常乏味,但有助于了解您可以按住Shift键并单击多个文件,并在需要时一次完成一堆。 选择文件后,显示“ 实用工具”窗格并显示“ 文件检查器”部分。 确保检查每个目标。

创建所需的所有目标后,您可能需要对每个目标进行一些清理:

  1. 首先,在选择了目标的情况下,选择“ 构建设置”,然后将“ 产品名称”值更改为您要导入的结果框架的名称。 为了这个项目,我为相同性命名了每个相同的名称(“ KPCCAPIClient”)(这就是为什么您之前看到多个具有相同名称的框架产品的原因)。
  2. 您可能还需要更改目标的“ 部署目标”值,以便可以与较早的OS版本一起使用,因为Xcode会将该值默认为最新值和最大值,并且您可能希望扩展支持范围。
  3. 如果愿意,可以将一个Info.plist文件用于所有目标。 如果是这样,请删除除您要共享的对象之外的所有对象(您可能想要重命名它或将其移动到项目中的位置以反映它是共享对象),并更改每个目标指向它的路径。 完成此操作后,您可以删除特定于平台的Info.plist文件。
  4. 您还可以为每个目标使用单个伞形标头。 首先,删除除您要使用的以外的所有内容(例如“ KPCCAPIClient.h”)。 然后,就像处理源文件一样,在文件导航器中和“ 实用工具”窗格(在“ 文件检查器”部分内)中选择该伞形标头,以确保针对每个框架检查了该文件的目标成员身份 。 同时将每个文件标记为Public 。 然后,您可以删除任何未使用的伞形标题。

跨平台世界

编写跨平台代码超出了本文的范围,但这是处理引用平台特定代码的框架的有用技巧。 您可以根据平台轻松有条件地向编译器公开代码,如下所示:

如果您如上所述需要平台特定的导入,或引用UIColor和NSColor之类的东西(分别用于iOS / tvOS和macOS),这将很有用。 您可以在Swift语言参考中了解有关条件编译器块的更多信息。

而已!

简而言之,这就是我们创建跨平台KPCC API客户端框架的方式。

我在上文中没有提到创建该框架的另一个非常好的理由,但这必须等到下一篇博客文章为止。 在此之前,祝您模块化代码好运!