原文:Creating Cross-Platform Swift Frameworks for iOS, watchOS, and tvOS via Carthage and CocoaPods

这个标题让人哑然失笑,但创立跨渠道结构也是如此。在这篇文章中,我想告诉你如何为 iOS、watchOS 和 tvOS 创立一个 Swift 结构,并让它们经过 Carthage 和 CocoaPods 发布。这是我用来在我一切的应用程序和社区中分享结构的一种技能。注意这将只针对 iOS 8 以上的动态结构(Dynamic Framework)。准备好了吗?

创立项目

首要,让咱们创立一个空项目。当我说空的时分,我的意思是空的。在 Xcode 中,在 “Other > Empty” 下挑选一个模板。

在这儿,你能够开端创立你的每个渠道的 target。你能够在 “File > New > Target” 下进行。在 “iOS > Framework & Library” 下挑选 “Cocoa Touch Framework” 模板。你能够叫它 “MyModule iOS”。不要勾选 “Include Unit Tests”,咱们稍后会做这个。

现在对 “watchOS > Framework & Library” 和 “tvOS > Framework & Library” 进行同样的操作。

接下来,创立一个名为 “Sources” 的空文件夹并将其增加到项目中。你一切的代码将被放在这儿。这个约好是为了在 Swift 3 发布时与 Swift Package Manager 向前兼容。

到目前为止,你的项目应该看起来像这样。

经过 Carthage 和 CocoaPods 为 iOS、watchOS 和 tvOS 创立跨渠道

Info.plist 文件

现在咱们有了项目的根底内容,是时分把它修好了,这样各渠道就能够在同一个代码库中很好地合作。 让咱们来处理一下 “Info.plist” 文件。进入上面创立的每个渠道文件夹(platform folder),开端在 “Info.plist” 文件后增加渠道称号。例如,关于 iOS,将该文件重命名为 “Info-iOS.plist”。

一旦你为每个渠道完成了这项作业,将它们悉数移到 “Sources” 文件夹中。

现在你能够经过在 Xcode 中右击你的 “Sources” 文件夹并挑选 “Add files” 将 .plist 文件增加到项目中。撤销勾选 “Copy items if needed”,挑选 “Create groups”,并保证没有挑选 Target Memberships。你的 Xcode 项目到目前为止应该是这样的。

经过 Carthage 和 CocoaPods 为 iOS、watchOS 和 tvOS 创立跨渠道

现在咱们需求更新 “Build Settings”,以指向每个渠道方针的各自的 .plist 文件称号和方位。所以关于 iOS 方针,进入 “Build Settings > Packaging > Info.plist File”。在这儿,输入相对途径到 .plist 文件,并附加上你之前做的渠道称号。

最后关于 .plist 文件,删去 “Build Phases > Copy Bundle Sources” 下的条目。这仅仅在 Xcode 项目中增加文件的一个副作用,但咱们不需求仿制 Bundle 包,由于在上一步中,当咱们更新构建设置中的途径时,它现已被处理了。这儿是你有必要为每个渠道方针删去的条目。

头文件(The Header Files)

不幸的是,咱们有必要和 Objective-C 一同日子一段时刻,所以让咱们来处理咱们的头文件,这样 Objective-C 项目就能够运用咱们的 Swift 结构,并从头变得很帅。进入 Xcode 在 iOS 文件夹下为你创立的 “.h” 文件,将渠道称号从源代码中删去。

上面,我从 “ZamzamKitData_iOSVersionNumber” 和 “ZamzamKitData_iOSVersionString” 中删去了 “_iOS“。保存该文件,然后重命名,从文件名中删去”iOS“。接下来把它拖到”Sources” 文件夹中。

进入 Finder,你会发现它并没有真正在 “Sources” 文件夹中,而是仍然在 iOS 方针文件夹中。所以从 Finder 中手动将它移到 “Sources” 文件夹中。这将破坏你的项目,所以回到 Xcode 并更新方位,一起你挑选一切的 “Target Memberships”” 并挑选 “Public”。

现在你能够从项目中删去渠道文件夹,并在提示时 “移到垃圾箱”。咱们的代码将被放在 “Sources” 文件夹中,而不是这些方针文件夹。记住,你的结构方针仍然可用,咱们仅仅不需求 Xcode 为咱们创立的文件夹。在这一点上,你的项目应该看起来洁净多了。

继续前进,在 “Sources” 文件夹中增加一个 Swift 代码文件来试试。你将能够切换这个代码文件适用于哪个 “方针会员”(iOS、watchOS、tvOS 或一切这些)。

经过 Carthage 和 CocoaPods 为 iOS、watchOS 和 tvOS 创立跨渠道

构建设置(Build Settings)

让咱们更新咱们的 “构建设置” 以适应咱们创立的跨渠道架构。关于每个渠道方针,进入 “Build Settings > Packaging > Product Name”,删去附加的渠道称号,这样,一切渠道的称号都是一样的,这样它们就被打包成一个产品。

为了支撑 Cathage,你有必要使你的方针 “Shared”。要做到这一点,需求 “Manage Schemes” 并勾选 “Shared” 区域。

接下来的这些过程并不是有必要的,但我强烈推荐它们。

  1. 将 “Require Only App-Extension-Safe API” 设置为 “Yes”。这将允许你的结构在扩展中运用,比如 Today Widget,它有更严厉的限制。假如你在代码中做了一些破坏这个限制的作业,你会立刻得到一个编译错误,这样你就能够考虑用不同的方法来编写你的代码。这总比后来发现你需求在一个扩展中运用你的结构而不得不从头架构你的某些部分的代码要好。
  2. 这更像是一个商业 / 办理决议,但关于我的应用程序,我通常至少支撑 iOS 8.4、watchOS 2.0 和 tvOS 9.0。原因是 iOS 8.4 有一些曾经版本没有的好东西,比如对 Apple Watch 的支撑和安全更新。别的这仅仅为苹果生态系统而不是安卓系统开发的一些好处 :wink:。看看你的应用统计,不要为了一两个人而终究支撑旧版本。这个设置应该在你的 “项目 > 信息 > 布置方针” 下装备。这将被继承到方针结构中。但是,关于 watchOS 和 tvOS 方针,你有必要去 “构建设置 > 布置 > watchOS/tvOS 布置方针” 并将其设置为 2.0/9.0。不过不要担心,你将运用 “根底 SDK” 设置,针对最新的 SDK 版本进行编码。 你仅仅在用 “布置方针” 支撑旧版本,假如你的代码中的某些内容在你企图支撑的旧版本中不被支撑,编译器会发出正告。

元数据

让咱们创立一个 “Metadata” 文件夹,并增加一些杂项文件,如 “README”、Lincense、podspec,等等。这就是我所具有的。

当你把这些文件增加到你的项目中时,保证从 “Build Phases > Compile Sources” 和 “Build Phases > Copy Bundle Resources” 中删去它们,由于它们不需求被编译。

Workspace

你还和我在一同吗?相信我,终究的游戏是值得的…… 仅仅时刻有点长……

经过 “File > Save As Workspace” 将你的项目保存为作业区。将其称为与你的项目相同,并将其保存在你的项目文件夹的根部。现在封闭项目并打开这个新的作业区。

为了方便起见,还能够增加一个 “Playground” 文件,这样你就能够在构思代码时勾勒出一些主意了。进入 “文件 > 新建 > 游乐场”,将其命名为与你的作业区相同的称号。封闭操场,把它增加到你的作业区,作为你的项目的一个兄弟姐妹,而不是一个孩子。

测试

在你的 Xcode 项目中增加一个新的方针。我喜爱为单元测试和示例演示增加这些模板。

  1. iOS > Test > iOS Unit Testing Bundle
  2. iOS > Application > Tabbed Application
  3. watchOS > Application > WatchKit App
  4. tvOS > Test > TV Unit Testing Bundle

蓝图

我赞扬你能读到这儿!下面是你的作业区应该是这样的。

我在 “Sources” 文件夹中创立了一些空文件夹,作为我的结构的惯例,当然也能够参加你自己的味道。

最后,将你的 workspace 增加到 git 或一些源码操控中,并增加任何你想让你的结构运用的依靠项。请看这篇优秀的博文,了解如何做到这一点的细节。

请看下面你如何挑选每个文件的方针渠道。

一起注意到,假如需求的话,你乃至能够运用 Swift 条件编译在代码中进行更细化的操控 *。我主张不要这样做,由于将你的文件切割成不同的渠道不是很高雅,而且会很混乱。相反,运用协议扩展来切割代码

总结

这是一个漫长的旅程,但现在你现已准备好摇滚一些代码,用一个代码库支撑多个渠道。当增加新的代码文件时,只需挑选你想为该特定代码文件支撑的 “方针会员资格”。不要忘掉进行单元测试…

  • Happy Coding!!*