如何在iOS和OS X之间创建单个共享框架

the*_*wan 37 macos frameworks core-data ios8

我正在尝试创建一个框架来保存在iOS和OS X上运行的应用程序的公共实体类.目前我只是在每个目标中包含文件,但这需要更改数据模型,以便从当前目标获取类(因为在Swift中你必须指定模型文件中具有类的模块).这当然意味着我有时会忘记,事情不起作用.

显而易见的解决方案是创建一个包含实体类的共享框架,以便数据模型始终指向同一个位置.

问题是似乎没有任何方法可以创建构建在两个平台上的框架.

有没有人找到一种方法来创建一个适用于两个平台的单一框架或库?

小智 53

如果您希望创建单个动态框架二进制文件,可以按照以下步骤操作(如http://colemancda.github.io/2015/02/11/universal-ios-osx-framework中所述):

1.更改项目的有效体系结构和支持的平台.

这应该改变您的框架和测试单元的有效架构和支持的平台.如果没有,则手动更改它们以继承项目的构建设置.

第一步

  • 基础SDK:我推荐OS X,但它也适用于iOS.请注意,使用iOS作为基本SDK时,"我的Mac"目标将分为3个不同的目标.

  • 支持的平台: macosx iphoneos iphonesimulator

  • 有效的架构: arm64 armv7 armv7s i386 x86_64

2.更改单元测试包的搜索路径

第二步

  • 运行路径搜索路径: $(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks

  • 框架搜索路径: $(SDKROOT) $(inherited)

它比具有两个单独的目标更好的解决方案.


the*_*wan 8

事实证明答案是超级简单但不是很明显,至少在我发布这个问题并开展其他工作之后才会这样.

所有需要做的就是为每个平台制定一个框架目标,然后将产品名称设置为相同.由于这也是Swift中的模块名称,因此您可以将Core Data模型中的类字段设置为一个值,并使其在两个平台上都能正常工作.

我正在使用的设置是在两个框架中包含模型文件,但是将模型本身直接包含到每个应用程序目标中.

您还应该能够将两个应用程序设置为具有相同的产品名称并使一切正常,但我没有对其进行测试,并且框架允许您拥有MyApp并且MyAppMobile如果您需要.

  • 这个答案是对的.生成的框架仅支持一个SDK.生成后,它将覆盖具有相同名称的现有框架. (2认同)
  • 错误是一个有力的词。它肯定不是最优的,因此它不是公认的答案。但是,它确实满足了允许在iOS和OS X项目中共享Core Data模型和关联的类文件的需求。那是原始问题,并且此方法确实可以解决该问题。 (2认同)