在服务器和iPhone应用程序之间共享Swift代码

在这个简短的练习中,我创建了一个使用Swift,Xcode和Kitura与服务器组件共享代码的应用程序。 此练习的目标如下:

  • 创建一个环境,其中Xcode是唯一的IDE
  • 创建三个Xcode项目:移动应用程序,服务器端应用程序和共享业务逻辑
  • 移动应用程序和服务器项目必须共享相同的业务逻辑
  • 该设置必须与Cocoapods和Swift包一起使用

我通过创建一个小的“记录笔记”应用程序来实现上述目标,该应用程序将文本笔记存储在客户端的设备上,并在客户端选择保存删除笔记时将数据同步到服务器。 客户端和服务器使用内存存储,仅完成最少的工作即可完成目标。 此练习主要是为了了解建立这样一个环境的可行性。

最终项目可以在这里找到:https://github.com/dimitryz/Notes

背景

对服务器/客户端应用程序进行编程存在一个共同的挑战,那就是跨多种平台和语言共享业务逻辑。 在撰写本文时,分布最广泛的语言也恰好是最不可能的:Javascript。 它曾经由Netscape在几周内开发出来,用于浏览器端编程,但是近年来,随着React Native和Node.js的引入,它可以在本机应用程序和服务器上找到。

JavaScript缺乏的东西是大多数非类型化语言所共有的:

  • 它不如其他语言表现出色
  • 可以说,阅读他人的代码更加困难
  • 它提供较少的漏洞防护措施

对于希望提供服务器端逻辑来卸载其应用程序中嵌入的某些功能的iOS开发人员,还有另一种选择,而所有这些都使学习和技术负担降至最低。

迅速

随着Swift的推出,Apple使得iPhone和Mac开发人员可以使用与Apple硬件相同的语言在服务器上进行开发。 使用C和C ++总是可以做到这一点,但是以这两种语言中的任何一种开发服务器端代码的困难都阻止了它的采用。

编写后,Swift服务器代码可以部署在Mac或Linux硬件上。

在撰写本文时,有许多Swift框架可促进应用程序服务器端组件的开发。

  • IBM的Kitura
  • 完善
  • 泽沃

我为此实验选择的是Kitura。 我最熟悉Kitura,在此练习中,它没有比其他框架明显的缺点。

初始设置

计划的文件/项目结构如下:

  • Xcode工作区
  • > iPhone App项目
  • >服务器应用程序项目
  • >共享业务逻辑项目
  • >豆荚项目

我们通过创建顶层目录并向其中添加Xcode工作区来启动项目。

  mkdir注意 
cd笔记

接下来,我们创建一个新的NotesApp项目并将其添加到工作区中

我们不需要CoreData,从单个NotesApp项目中删除Git很重要。 我将根工作区目录初始化为git项目。

添加可可足

我还希望将Cocoapods附加到NotesApp项目(而不是其他项目)。 Podfile我们将Podfile文件添加到具有以下内容的根目录中。

 工作区“ Notes.xcworkspace” 
 目标“ NotesApp” 
use_frameworks!
项目“ NotesApp / NotesApp.xcodeproj”
结束

Podfile依赖项暂时仍为空。 该项目的范围不必超出初始化Pod项目的范围。

Pod项目的初始化如下:

 吊舱安装 

您应该最终在Xcode中创建一个新的Pods项目。

添加NotesServer和NotesShared项目

对于其余两个项目,过程非常相似:它需要使用命令行来初始化两个Swift包。 其中一个软件包将是可执行类型(对于服务器),而另一个则是常规软件包。 两者都有自己的专用Xcode项目文件。

  mkdir NotesServer 
cd NotesServer
swift package init —键入可执行文件

我们需要修改NotesServer Package.swift文件以包含Kitura框架:

  // swift-tools-version:4.0 
导入PackageDescription
 让包=包( 
名称:“ NotesServer”,
依赖项:[
.package(URL:“ https://github.com/IBM-Swift/Kitura.git”,来自“ 1.7.0”)
]

修改后,我们还需要获取依赖项并创建Xcode项目文件。

 快速打包解决 
迅捷包generate-xcodeproj

现在,要么将生成的.xcodeproj文件拖到工作区中,要么使用侧栏中的上下文菜单添加它。

我们将对NotesShared包执行相同的操作以结束操作。

 光盘.. 
mkdir Notes共享
cd NotesShared
快速包初始化
迅捷包generate-xcodeproj

与NotesServer项目相比,NotesShared包中的文件结构会稍有不同。

最终结构应如下所示:

现在已经设置了所有项目,仅剩下一个步骤:在NotesApp和NotesShared项目之间以及NotesServer和NotesShared项目之间创建依赖关系。

这里有一个警告:默认情况下,NotesShared项目有一个目标,而该目标是Mac SDK的。 要将这个项目附加到NotesApp目标,我们需要在NotesShared项目中创建一个针对iOS SDK的新目标。

要使用与服务器端相同的import NotesShared语句来使用新的NotesSharedMobile框架,我们需要将生成的框架名称重命名为NotesShared 。 目标名称将保持为NotesSharedMobile,但移动应用程序中的import语句将为import NotesShared

现在我们有了两个目标,仅将应用程序和服务器与各自的共享目标(NotesShared和NotesSharedMobile)链接就足够了。

找到NotesApp和NotesServer目标的“链接的框架和库”部分,并将它们链接到各自的NotesShared框架。

包起来

这是完成项目初始结构所需的所有步骤。 完整的应用程序可以在Github上找到:https://github.com/dimitryz/Notes

进行了几次尝试,但整个项目结构整洁,易于深入研究。 我确实添加了install.sh文件来帮助进行初始设置,仅此而已。 将业务逻辑与应用程序的UI分开还有一个附加好处:对UI的更改不需要重新编译共享逻辑。