用于iOS和OS X开发的共享代码库

时间:2012-08-01 22:35:37

标签: ios xcode macos multiplatform code-sharing

我们有一个相当丰富的电子学习应用程序,主要使用cocos2d构建。目前我们处于alpha状态并希望设置我们的项目结构,因此我们还可以构建一个Mac版本来定位Mac App商店。在UIKit中有大约80%的cocos2d和一些初始屏幕,必须移植到Mac(重写)。

从单一代码库中定位Mac和iOS应用商店的建议设置是什么?我假设选择是:

  1. 在同一个应用程序源代码根文件夹中创建2个xCode项目,并使用每个项目构建单个目标。这将是:Project.xcodeproj和ProjectMac.xcodeproj
  2. 将新的Mac目标添加到我们现有的iPad应用程序项目中,然后调整目标成员资格以获得所需的结果。这只是:Project.xcodeproj
  3. 进一步复杂化的情况是我们目前使用cocos2d作为iOS应用程序的静态库。我们还有一个名为CoreInfrastructure的库,它包含我们在所有项目中使用的大量代码。最近我发现我可以创建一个项目来同时构建一个面向Mac的框架和一个基于相同代码库的iOS库。这是通过从框架项目开始并添加目标来为iOS构建静态库来完成的。

    所以只是想得到每个人的意见和见解。有人知道在上述选择中要注意的任何警告吗?任何为Mac和iOS应用程序商店构建的人都会同时分享他们的结构吗?在我们的库代码中添加一个目标...也就是应用程序的方法吗?

    是否存在任何选择存档和分发版本的问题?

    提前致谢。

4 个答案:

答案 0 :(得分:18)

WWDC会话"在iOS和OS X之间共享代码" 回答了本主题中的所有基本问题。 iWork 团队介绍了他们如何使用iOS和OS X的共享代码库创建Pages,Keynote和Numbers。

他们项目的关键是:

  • 为iOS和OS X分离Xcode目标
  • .framework
  • 的形式分享共享代码的项目
  • 从上面的点开始对框架的目标依赖

我鼓励观看视频或阅读本次会议的成绩单:

WWDC 2014 Sharing code between iOS and OS X

ASCIIWWDC transcript

答案 1 :(得分:4)

我最近使用kstenerud's iOS Universal Framework构建了适用于iOS和Mac应用程序的共享框架代码库。在为iOS框架创建项目之后,我只需要为Cocoa框架手动添加目标。这样我就可以在框架中开发一次可共享代码,并将其链接到iOS和Mac应用程序中。您甚至可以使框架包含适用于iOS应用程序的UIKit特定代码和适用于Mac应用程序的AppKit特定代码。如果你有兴趣,我会在我的blog中写下这个。

答案 2 :(得分:3)

我只是为共享源使用多平台静态库目标。但是,您需要将其扩展为依赖项。如果您具有依赖于平台的实现,则可能需要为这些符号创建补充导出库。

所以你的结构可能采用这种形式:

  • CoreInfrastructure - 跨平台静态库。
  • PlatShared - 跨平台静态库。
  • PlatSpecific-OS X - OS X静态库(或框架)。
  • PlatSpecific-iOS - iOS静态库。

OS X应用程序链接到CoreInfrastructure,PlatShared,PlatSpecific-OSX,OS X的Cocos和系统库。

iOS应用程序链接到CoreInfrastructure,PlatShared,PlatSpecific-iOS,适用于iOS的Cocos和sys libs。

问题(我发现)是,有很多人在Xcode中开发和维护复杂的项目结构没有太多/任何经验。设置重复目标并在它们增长时正确维护它们是一种痛苦(IMO) - 即使它们都引用相同的源文件也是如此。这就是为什么我更喜欢最小目标和适当的依赖结构。

答案 3 :(得分:3)

对于应用程序,使用两个单独的项目。如果他们共享库或框架,则在一个项目中使用iOS和Mac的多个目标非常有用。但是,在您的顶级应用程序中几乎没有任何共享。 UIKit代码需要完全重写才能使用AppKit,依赖关系会有所不同,甚至大多数项目设置都会有所不同。

当然,如果您真的想立即查看所有内容,可以将平台特定的应用程序项目和所有共享的依赖库/框架项目放在一个工作区中。这更像是一种工作作风的问题。如果你想经常在两者之间来回切换,这是最有意义的。如果您想简化您所看到的内容,可以将它们放在共享许多相同项目的单独工作区中。单独的工作空间的缺点是项目一次只能在一个工作空间中打开,因此您实际上一次只能在一个工作空间中工作。