首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在podfile中对单个目标提供多平台支持

在podfile中对单个目标提供多平台支持
EN

Stack Overflow用户
提问于 2019-01-07 21:23:54
回答 4查看 3K关注 0票数 14

有没有办法通过podfile为单个目标添加多平台支持?

例如,我的项目在iOS和Mac上都是通用的。它们使用相同的代码库。因此,我没有为相同的代码创建多个目标,而是在同一个目标中添加了对iOS和MacOSX的支持。它可以很好地构建。

现在我想通过Cocoapods添加一个依赖项。我创建了一个podfile并指定了我的目标对pod的依赖。这里讨论的pod以类似的方式支持多个平台,即单目标。

但是现在在构建我的项目时,它在iOS上失败了。

在Podfile中为单个目标指定多个平台会产生错误。

如果我只指定平台为iOS或Mac,那么这个项目就无法在其他平台上构建。

以前有没有人经历过这种情况?如何通过podfile为单个目标添加多个平台?

附注:我知道我可以通过在我的项目中创建多个目标来实现它。但我想把它作为我最后的选择。

EN

回答 4

Stack Overflow用户

发布于 2019-06-07 19:07:34

代码语言:javascript
复制
def import_pods

pod 'CorePlot'

end

target 'FirstAppWithMacOS' do
    # define your platform here.
    platform :ios, '9.0'
    import_pods
end

target 'FirstMacOSApp' do
    # define your platform here.
    platform :osx, '10.10'
    import_pods
end

我的项目如下图所示:

票数 1
EN

Stack Overflow用户

发布于 2019-06-11 15:58:06

平台设备由目标Build SettingsArchitectures部分中的Base SDKSupported Platforms控制。如果您没有为macOS和iOS设备创建单独的两个目标,那么您应该只有一个选择来支持这些平台条目,即为macOS平台复制新的两个现有构建配置,然后您可以分别配置这些设置。

例如,您有一个现有的基于iOS的项目,并且有两个名为DebugRelease的默认构建配置。现在尝试创建两个新的macOS,选择主Xcode项目并选择项目名称(此处不是目标名称) ->选择信息部分在顶部->点击+按钮下的Configurations部分->选择Duplicate "Debug"/"Release" Configuration ->将其重命名为Debug-macOS/Release-macOS或其他,也将原来的Debug/Release重命名为Debug-iOS/Release-iOS

现在,在唯一一个目标的构建设置下,您有两对要调试和归档目标平台的配置。您还可以为macOS开发创建一个新的方案,只要确保在不同的操作中选择正确的配置即可。

cocoapods上的主Podfile交谈,如果你自己维护一个cocoapods库,并且你想将它添加为一个依赖项,那么它最好在你的podspec文件中同时支持macOS和iOS平台,当然,你需要使这些平台兼容,AFNetworking就是这样做的。这里是主要的转换任务,不要在macOS平台下使用UIKit下的任何接口。为了区分编译时间上的平台差异,您可以使用这些宏,

代码语言:javascript
复制
#if TARGET_OS_IOS
   // iOS supported
#elif TARGET_OS_OSX
   // macOS supported
#endif

如果您希望在独立项目目标中使用第三方库,请先检查兼容性问题,如果只适用于iOS平台,则可以只为一个平台指定依赖库,如下所示。

代码语言:javascript
复制
pod 'PonyDebugger', :configurations => ['Debug-iOS', 'Release-iOS']

与支持的macOS相同。

希望它能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2021-09-06 01:47:16

简短的回答

从CocoaPods 1.10.2开始不支持Is。它不受支持是有原因的,而且可能不会很快支持,或者只有在使用Xcode13构建时才会支持。

长长的答案

在将pod集成到目标时,CocoaPods (CP)必须执行几个步骤来实现这一点。我不会在这里列出所有的答案,但以下四个与这个答案相关:

  1. 创建伞形页眉。
  2. 构建(动态/静态)框架或将伞形页眉静态复制到目标的页眉搜索路径。
  3. 喜欢将构建的框架/库添加到目标。

让我逐一介绍这些步骤:

1.创建伞头

伞形标头的内容取决于为其构建pod的平台。例如,如果是macOS,它将导入Cocoa;如果它是iOS,它将导入UIKit。由于保护伞头部是以一种特殊的方式处理的,特别是在使用模块时(并且在处理Swift代码时,相信我,你确实想使用模块),使用#ifdef使它们的某些部分依赖于平台是一个相当糟糕的主意。因此,为了支持多个平台,CP需要为每个平台创建一个保护伞标题。

请注意,如果您将相同的pod集成到两个不同平台的两个目标中,这正是CP所做的。例如,如果一个目标是macOS,一个是iOS,那么将有两个伞形标头,一个以-macOS.h结尾,另一个以-iOS.h结尾。所以从理论上讲,这个功能是存在的,只是到目前为止还没有办法为每个目标指定一个以上的平台,因此创建的伞形标头只能与一个目标平台一起工作。这可能是维卡斯·达迪奇说的话的意思:

如果我只将

指定为iOS或Mac

那么有问题的项目就无法在其他平台上构建。

目前,创建的头文件只能在任一平台上运行良好。请注意,这也适用于任何自动生成的模块映射文件(.modulemap)。

2.构建(动态/静态)框架或静态库

就像以前一样,库/框架的构建方式取决于平台,因为Podspec文件可以根据平台指定不同的构建选项,甚至可以选择不同的文件包含在构建中。pod必须根据平台单独构建,即使两个平台使用相同的CPU指令集(例如ARM Mac和ARM iPad),代码也不包含任何特定于平台的内容。

就像以前一样,当将相同的pod集成到不同平台的不同目标中时,此功能也在那里,从而产生了两个带有平台后缀的库/框架。

3.将伞形头部添加到目标的头部搜索路径中

现在它变得有点棘手了。假设我们有两个伞形标头(可能还有两个模块映射文件),在构建它们集成到的目标时,它们中只有一个必须是可见的,并且哪个依赖于目标平台。当我们讨论不同的目标时,这是没有问题的,因为每个目标的不同构建设置很容易,但在这种情况下,它是一个单一的目标,这会带来一些影响。

然而,即使是这样也是可以解决的,例如,通过使设置依赖于SDK,毕竟每个平台都需要不同的SDK,所以您可以这样做:

代码语言:javascript
复制
HEADER_SEARCH_PATHS[sdk=macosx*] =  ....
HEADER_SEARCH_PATHS[sdk=iphoneos*] = ...

以确保只有正确平台的标头和映射文件对构建可见。

4.将构建的框架/库与目标保持一致

问题来了:如果您想使用Xcode的链接,您可以链接到在步骤2中构建的macOS或iOS版本,但您不能链接到这两个版本,这取决于您为其构建的目标平台。那么,如何确保二进制链接指向正确的库,并且只有一个库?

你可以...

  • 将所有版本合并到一个通用二进制文件中,并始终链接到此版本。只要你的目标平台有不同的CPU架构(例如Mac的x86和iOS的ARM ),它就可以工作,但是如果你的平台有相同的架构(例如ARM Mac和ARM iPhone),它就不能工作。在ARM Mac的指导下,这个选项几乎已经失效,以前当你的两个目标是iOS和tvOS时,这已经是不可能的,因为这两个目标也都是ARM。

  • 根本不使用Xcode的链接,而是手动设置链接标志以及库搜索路径,其技巧与上面的头文件相同。嗯,这只适用于开箱即用的静态库和框架,并且只有在手动设置目标依赖项的情况下才能可靠地用于新的Xcode构建系统。对于动态框架,您还必须手动复制框架,有时(重新)正确地对其进行签名,还必须手动管理依赖项。一切都有可能,但看起来相当脆弱,可能会比我上面提到的更有意义。我猜这是一种有一定风险的方法,有很多可能的陷阱,而且无论你做什么,一些设置根本不会以这种方式工作。

  • 使用Xcode13的选择性链接功能。这正是这里需要的,苹果可能已经实现了它,因为CPU架构不再适用于许多链接情况。然而,Xcode13目前仍处于测试阶段,如果该功能依赖于该功能,它将需要使用Xcode13进行构建,这需要至少运行Big Sur的Mac。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54075287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档