在多个项目上共享快速代码

时间:2015-02-24 10:29:57

标签: xcode swift ios7 dynamic-library

所以我们有一些共享代码的项目,现在它们必须至少与iOS7保持兼容。

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

  

CocoaPods仅支持OS X 10.9及更高版本的Swift,以及iOS 8和   新。

     

原因如下:

     如Apple所述,OS X 10.9 / iOS 7及更新版本支持Swift   无数次。不支持使用构建静态存档   迅速。所有版本的OS X都支持动态框架。   在8之前的iOS版本上不支持动态框架:

     

ld:警告:嵌入式dylibs / frameworks仅在iOS 8或更高版本上运行。

(资料来源:http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/

鉴于此信息,我们希望尝试使用Cocoa Touch Framework项目共享代码。

我做的是:

  • 在工作区中,创建一个新项目 - > Cocoa Touch Framework
  • 在此处添加/移动swift代码并将所需的函数/ etc定义为public
  • 在主构建目标中,将新项目添加为“嵌入式框架”
  • 如果您需要使用已定义库中的类,请使用import语句,其中构建目标名称是模块名称(在我的情况下为import Cobra

这似乎也适用于iOS7。这很奇怪,因为在网上我读到这个警告确保该应用程序无法在iOS7设备上运行:

embedded dylibs/frameworks only run on iOS 8 or later

然而,对于我们来说,它似乎在我们的iOS 7测试设备上运行良好。此外,这关系到我:

enter image description here

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

TL; DR;

在我沿着这条路走下去并将代码移到这个新设置之前:

  • Wil这种嵌入共享库的方式会给我的团队带来问题吗? (换句话说:我做错了吗?)
  • 这种嵌入库的方式在将应用程序提交到App Store时是否会导致任何问题?
  • 如果需要:除了简单地来回复制代码/文件之外,还有其他方法可以在项目之间共享代码吗?我无法相信没有其他人有这个问题。

2 个答案:

答案 0 :(得分:6)

更新02-03-2015:

为了在内部共享代码,我建议使用git子模块,这需要您在托管存储库中提交代码,托管存储库可以是公共的也可以是私有的。


Git子模块

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

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

git submodule add https://github.com/user/submoduleProject

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

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

git submodule init

git submodule update

将代码从存储库中提取到用户工作区。

如果要向子模块添加任何更改或更新,可以执行此操作并将其推送到存储库。然后,用户可以使用git submodule update更新其代码以获取最新更改。

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

我希望这会有所帮助。


如果在支持低于iOS 8的应用程序上使用动态框架,则应用程序加载程序或Xcode在提交到App Store时将不会接受该应用程序。这很不幸,因为正如您所说,它确实适用于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";

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

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

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

答案 1 :(得分:0)

git子模块可以正常工作。他们可能会很痛苦。

如果你不想使用它们,我想出了一个使用第二个"虚拟"使用cocoapods项目,无需框架即可获取Swift代码。

https://medium.com/@mishagray/how-to-use-swift-cocoapods-and-still-support-ios-7-0-f9dc29b3628b