Xcode 在多个项目上共享swift代码

Xcode 在多个项目上共享swift代码,xcode,swift,ios7,dynamic-library,Xcode,Swift,Ios7,Dynamic Library,因此,我们有一些共享代码的项目,目前它们必须至少与iOS7兼容 目前,我们使用本地cocoapod在不同的应用程序之间共享代码。这样做的缺点是所有共享代码都放在一个组中。此外,Cocoapods团队还解释了为什么iOS7项目无法使用swift pods: CocoaPods仅在OS X 10.9及更高版本和iOS 8及更高版本上支持Swift 更新的 原因如下: 正如苹果所说,Swift在OS X 10.9/iOS 7及更高版本上受支持 无数次。不支持使用创建静态存档 敏捷的所有版本的OS X都

因此,我们有一些共享代码的项目,目前它们必须至少与iOS7兼容

目前,我们使用本地cocoapod在不同的应用程序之间共享代码。这样做的缺点是所有共享代码都放在一个组中。此外,Cocoapods团队还解释了为什么iOS7项目无法使用swift pods:

CocoaPods仅在OS X 10.9及更高版本和iOS 8及更高版本上支持Swift 更新的

原因如下:

正如苹果所说,Swift在OS X 10.9/iOS 7及更高版本上受支持 无数次。不支持使用创建静态存档 敏捷的所有版本的OS X都支持动态框架。 8之前的iOS版本不支持动态框架:

ld:警告:嵌入式动态库/框架仅在iOS 8或更高版本上运行

(来源:)

鉴于这些信息,我们希望尝试使用
Cocoa-Touch框架
-项目共享代码

我所做的是:

  • 在工作区中,创建一个新项目->
    Cocoa Touch Framework
  • 在此处添加/移动swift代码,并将所需功能/etc定义为
    public
  • 在主构建目标中,将新项目添加为“嵌入式框架”
  • 如果需要使用已定义库中的类,请使用一个import语句,其中构建目标名称是模块名称(在我的例子中是
    importcobra
这似乎也适用于iOS7。这很奇怪,因为我在网上看到的所有警告都确保应用程序不会在iOS7设备上运行:

embedded dylibs/frameworks only run on iOS 8 or later
然而,对我们来说,它似乎在我们的iOS 7测试设备上运行良好。此外,这与我有关:

框架路径似乎直接链接到我的本地DerivedData文件夹。我没有特别选择我的DerivedData文件夹,我只是从Xcode中添加了建议的框架,它自己决定从我的DerivedData文件夹中获取它。 我们与多个程序员一起完成这个项目

TL;博士 在我继续此路径并将代码移动到此新设置之前:

  • 这种嵌入共享库的方式会给我的团队带来问题吗?(换句话说:我做错什么了吗?)
  • 在将应用程序提交到应用商店时,这种嵌入库的方式会导致任何问题吗
  • 如果需要:除了在项目之间共享代码而不简单地来回复制代码/文件之外,还有其他方法吗?我真不敢相信没有其他人有这个问题
更新日期:2015年3月2日: 为了在内部共享代码,我建议使用git子模块,这要求您在托管的存储库中提交代码,该存储库可以是公共的,也可以是私有的


Git子模 这是一种将存储在存储库中的代码分发给任何具有访问权限的人的方法。它的好处是,您可以将更改推送到存储库,其他用户可以选择更新自己的子模块存储库。它要求Git用作项目的源代码控制,还要求将代码推送到用户可以访问的存储库中

要将代码用作git子模块,请使用以下命令将代码存储库添加到git控制的项目中:

git submodule add https://github.com/user/submoduleProject
替换
https://github.com/user/submoduleProject
使用您自己的存储库URL

添加后,您可以使用以下命令:

git submodule init

将代码从存储库拉入用户工作区

如果要向子模块添加任何更改或更新,可以这样做并将其推送到存储库。然后,用户可以使用
git submodule update
更新他们的代码,以获得最新的更改

有关git子模块的更多信息,请访问官方网站

我希望这有帮助


如果在支持任何低于iOS 8的应用程序上使用动态框架,则应用程序加载器或Xcode在提交到应用程序商店时不会接受该应用程序。这很不幸,因为正如您所说,在设备上进行测试时,它确实适用于iOS 7

我能想到的与团队共享代码的最佳方法是交出一个代码文件夹并将其包含在项目中,而不是包含一个动态框架。如果希望保持名称间距的一致性,以便将来可以使用动态框架并从iOS 7迁移,我建议在公共方法和类周围使用结构来获得名称空间。例如:

public struct MyFrameworkName {
    public func doSomethingAmazing() {
         // Code...
    }

    public class DecentClass: NSObject {
         // Code..
    }

    public var terribleString: String
}
这将允许您以与动态框架相同的方式调用应用程序其余部分中的方法

var myObject = MyFrameworkName.DecentClass()
myObject.doMethod()

MyFrameworkName.doSomethingAwesome()

MyFrameworkName.terribleString = "HEY";

为了回答您对直接从派生数据目录链接到框架的担忧,这通常是一种不正确的方法

理想情况下,您应该将框架复制到项目目录中,然后针对该版本进行链接。这允许您将项目的源目录分发给其他人,框架将保持在相对于项目源文件夹的正确位置


我希望这有助于回答您的问题。

git子模块可以工作。与他们一起工作会很痛苦

如果您不想使用它们,我提出了一个解决方案,使用第二个带有cocoapod的“虚拟”项目,在不需要框架的情况下引入Swift代码


这在一定程度上有所帮助,但我最大的问题仍然是:共享代码。我不得不说,简单地复制和粘贴代码不能被认为是可行的解决方案。所有涉及的项目都发展得相当快,因此这将成为一场噩梦。必须有某种方式在项目间共享代码,而不必取消Swift支持或iOS 7支持?没错,复制和粘贴不是最佳解决方案。我建议使用私有cocoapods存储库或git子模块。我将更新我的答案以反映这一点。这些选项正是我所希望的。然而,coc
var myObject = MyFrameworkName.DecentClass()
myObject.doMethod()

MyFrameworkName.doSomethingAwesome()

MyFrameworkName.terribleString = "HEY";