有没有办法通过podfile为单个目标添加多平台支持?
例如,我的项目在iOS和Mac上都是通用的。它们使用相同的代码库。因此,我没有为相同的代码创建多个目标,而是在同一个目标中添加了对iOS和MacOSX的支持。它可以很好地构建。
现在我想通过Cocoapods添加一个依赖项。我创建了一个podfile并指定了我的目标对pod的依赖。这里讨论的pod以类似的方式支持多个平台,即单目标。
但是现在在构建我的项目时,它在iOS上失败了。
在Podfile中为单个目标指定多个平台会产生错误。
如果我只指定平台为iOS或Mac,那么这个项目就无法在其他平台上构建。
以前有没有人经历过这种情况?如何通过podfile为单个目标添加多个平台?
附注:我知道我可以通过在我的项目中创建多个目标来实现它。但我想把它作为我最后的选择。
发布于 2019-06-07 19:07:34
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我的项目如下图所示:

发布于 2019-06-11 15:58:06
平台设备由目标Build Settings的Architectures部分中的Base SDK和Supported Platforms控制。如果您没有为macOS和iOS设备创建单独的两个目标,那么您应该只有一个选择来支持这些平台条目,即为macOS平台复制新的两个现有构建配置,然后您可以分别配置这些设置。
例如,您有一个现有的基于iOS的项目,并且有两个名为Debug和Release的默认构建配置。现在尝试创建两个新的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下的任何接口。为了区分编译时间上的平台差异,您可以使用这些宏,
#if TARGET_OS_IOS
// iOS supported
#elif TARGET_OS_OSX
// macOS supported
#endif如果您希望在独立项目目标中使用第三方库,请先检查兼容性问题,如果只适用于iOS平台,则可以只为一个平台指定依赖库,如下所示。
pod 'PonyDebugger', :configurations => ['Debug-iOS', 'Release-iOS']与支持的macOS相同。
希望它能帮上忙!
发布于 2021-09-06 01:47:16
简短的回答
从CocoaPods 1.10.2开始不支持Is。它不受支持是有原因的,而且可能不会很快支持,或者只有在使用Xcode13构建时才会支持。
长长的答案
在将pod集成到目标时,CocoaPods (CP)必须执行几个步骤来实现这一点。我不会在这里列出所有的答案,但以下四个与这个答案相关:
让我逐一介绍这些步骤:
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,所以您可以这样做:
HEADER_SEARCH_PATHS[sdk=macosx*] = ....
HEADER_SEARCH_PATHS[sdk=iphoneos*] = ...以确保只有正确平台的标头和映射文件对构建可见。
4.将构建的框架/库与目标保持一致
问题来了:如果您想使用Xcode的链接,您可以链接到在步骤2中构建的macOS或iOS版本,但您不能链接到这两个版本,这取决于您为其构建的目标平台。那么,如何确保二进制链接指向正确的库,并且只有一个库?
你可以...
https://stackoverflow.com/questions/54075287
复制相似问题