构建Swift框架的挑战(C ++,Objective C和Swift)

本演讲重点讨论构建Swift框架的挑战。 我将介绍我们如何克服这些挑战,从中获得的经验以及汲取的教训。 我希望它能帮助您了解如何在移动设备上构建开源或第三方软件,以及如何正确实现。

主要的挑战是如何将C ++与Swift交互。当我们想在库或源文件中的其他内容之上构建某些内容时。 对我们来说就是这种情况。 您想用自己来构建一个包装器。

我们的第一个想法是只有一个包含另一个框架的大框架。 然后,如果您开始构建新的Swift应用程序,我们将隐藏您不想处理的底层Objective-C部分。

事实证明,这种方法存在一些困难。 首先,您将不得不以用户身份修改构建设置。 即使这样,历史上在OSX上也有很长一段时间可用, 但是App Store完全不允许使用带有代码签名的概念 ,因此它对我们不可用,因为我们希望允许我们的用户构建真实的适用于App Store的应用程序。

让我们谈论一些新的东西,您听说过模块化框架吗? 还是自定义模块图? 如果否,则让我们深入研究一分钟以获得基本思想。

模块化框架是包含模块映射的框架。 该模块图既可以通过构建框架生成,也可以在框架项目中指定为构建设置,但不常见。

为了使Xcode生成模块映射文件,框架必须具有与框架名称相同的伞形标头,并且必须将“ Define ModuleDEFINES_MODULE )构建设置设置为yes。 在构建此框架时,Xcode将生成一个包含Modules Director的框架包。

Modules目录包含具有以下内容的生成的模块映射( module.modulemap ):

 框架模块 MixModuleFramework { 
伞头 MixModuleFramework .h“出口*
模块 * { 导出 *}
}

在解密默认模块映射文件之前,让我们袖手旁观并编写我们自己的映射文件。

框架可以通过将Module Map FileMODULEMAP_FILE )Xcode构建设置设置为映射文件路径来指定自定义映射文件。 让我们从创建最简单的模块映射开始。

 框架模块 MixModuleFramework { 
伞头“ MixModuleFramework.h”
}

在此模块映射中,我们仅指定伞头文件。 此标头是导入所有其他标头的标头。

有关模块映射的更多详细信息,请参考此链接http://clang.llvm.org/docs/Modules.html#module-map-file

让我们从C ++上的Objective C包装器开始,然后在Bridging标头中包含Objective C文件,并尝试在swift文件中使用。 哎呀惊喜!

尽管桥接头很方便,但它有一个关键的限制-您不能在框架项目中使用它。 替代方法是使用模块。

我称这个演示框架为MixModuleFramework。 打开Xcode,在框架部分选择File-> New-> Project-> Chococo Touch Framework。

按下一步,然后输入您的框架名称。

创建完之后,就可以构建空的框架项目。

当您构建框架时,Xcode将生成一个包含伞标头的模块映射。 这是为支持模块的自定义框架目标生成的模块图:

 框架模块MixModuleFramework { 
伞头“ MixModuleFramework.h”导出*
模块* {导出*}
}

现在,您可以开始在其中添加C ++文件,Objective C包装程序和Swift文件。

在构建框架之前,需要记住的一些事情,该演示框架为TestCode类提供了与此框架的接口,基于目标C或Swift的项目可以直接使用它。确保您将此文件设为公开文件。

由于我已经编写了一些不需要公开的私有API,因此请确保您已创建了如下所示的模块化地图文件。

请确保在项目中也添加了导入搜索路径,以避免生成错误。

完成所有设置并将文件导入框架项目后。

是时候构建框架项目并对其进行测试了。

您可以找到本文的源代码https://github.com/charlieInDen/MixModuleFramework

要制作自定义框架-通用框架,请阅读本文-https://medium.com/@nishantsamsung09/writing-custom-universal-framework-in-xcode-9-and-ios-11-7a63a2ce024a

希望本文对希望创建基于swift的自定义框架的人有用,请❤️向其他人推荐这篇文章😊。 让我知道您的反馈。 🙂

参考文献:

  1. http://nsomar.com/modular-framework-creating-and-using-them/