示例1
post_install do |installer|
# 在安装完成所有 Pods 之后执行的钩子块
installer.pods_project.targets.each do |target|
# 遍历所有的 Pod target
target.build_configurations.each do |config|
# 遍历每个 target 的所有构建配置
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
# 将构建设置 'APPLICATION_EXTENSION_API_ONLY' 设置为 'NO'
end
end
end
示例说明
-
post_install do |installer|- 这是一个
post_install钩子,它在 CocoaPods 完成所有的 Pod 安装后执行。installer是一个参数,代表 CocoaPods 安装程序。
- 这是一个
-
installer.pods_project.targets.each do |target|- 遍历所有的 Pod targets。
target代表每一个 Pod target。
- 遍历所有的 Pod targets。
-
target.build_configurations.each do |config|- 遍历每个 target 的所有构建配置(例如,Debug 和 Release 配置)。
config代表每一个构建配置。
- 遍历每个 target 的所有构建配置(例如,Debug 和 Release 配置)。
-
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'- 将构建配置中的
APPLICATION_EXTENSION_API_ONLY设置为NO。这个设置控制是否限制使用应用程序扩展 API。
- 将构建配置中的
-
APPLICATION_EXTENSION_API_ONLY- 这个设置用于控制是否强制 Pod 仅使用应用程序扩展(App Extension)API。如果设置为
YES,则强制 Pod 只能使用应用程序扩展 API。 - 通过设置为
NO,你允许 Pod 使用所有可用的 API,而不仅仅是应用程序扩展 API。这在某些情况下是必要的,因为某些 Pod 可能需要使用不在应用程序扩展 API 中的功能。
- 这个设置用于控制是否强制 Pod 仅使用应用程序扩展(App Extension)API。如果设置为
此代码片段通常用于解决当你在项目中使用 Pods 时,某些 Pods 需要访问不在应用程序扩展 API 中的功能,从而避免编译错误。
APPLICATION_EXTENSION_API_ONLY 的默认值并不是在所有情况下都固定为 YES。它的默认值取决于目标(target)的类型以及 Xcode 项目的配置。以下是一些常见情况:
-
应用程序目标(App Target)
- 对于普通的应用程序目标,
APPLICATION_EXTENSION_API_ONLY默认是NO。这意味着应用程序可以使用所有可用的 API,而不仅仅是应用程序扩展 API。
- 对于普通的应用程序目标,
-
应用程序扩展目标(App Extension Target)
- 对于应用程序扩展(如今天小部件、共享扩展等),
APPLICATION_EXTENSION_API_ONLY默认是YES。这是为了确保扩展只能使用被批准的 API,从而避免使用不允许在扩展中使用的 API。
- 对于应用程序扩展(如今天小部件、共享扩展等),
在 CocoaPods 的环境中,如果你没有明确设置 APPLICATION_EXTENSION_API_ONLY 的值,那么它会继承目标类型的默认值。这就是为什么在某些情况下你可能需要显式地设置它,以确保所有 Pod 都可以使用非扩展 API。
例如,对于一个普通的应用程序目标,你通常不需要设置 APPLICATION_EXTENSION_API_ONLY,因为默认值是 NO。但对于一个应用程序扩展目标,你可能需要将其显式设置为 NO,以允许 Pods 使用所有可用的 API。
总之,APPLICATION_EXTENSION_API_ONLY 的默认值依赖于目标的类型和 Xcode 项目的配置。如果你的项目中出现了需要手动设置的情况,可以通过 post_install 钩子来覆盖默认值,确保所有 Pod targets 使用你期望的配置。
示例2
post_install do |installer|
# 在安装完成所有 Pods 之后执行的钩子块
installer.pods_project.targets.each do |target|
# 遍历所有的 Pod target
target.build_configurations.each do |config|
# 遍历每个 target 的所有构建配置(例如 Debug 和 Release)
config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "12.0"
# 设置 iOS 部署目标为 12.0
# 排除 iPhone 模拟器环境下的 arm64 架构
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
config.build_settings["DEVELOPMENT_TEAM"] = "your teamid"
# 设置开发团队 ID,请替换为您的实际团队 ID
end
end
end
示例说明
-
post_install do |installer|- 这是一个
post_install钩子,它在 CocoaPods 完成所有的 Pod 安装后执行。installer是一个参数,代表 CocoaPods 安装程序。
- 这是一个
-
installer.pods_project.targets.each do |target|- 遍历所有的 Pod targets。
target代表每一个 Pod target。
- 遍历所有的 Pod targets。
-
target.build_configurations.each do |config|- 遍历每个 target 的所有构建配置(例如,Debug 和 Release 配置)。
config代表每一个构建配置。
- 遍历每个 target 的所有构建配置(例如,Debug 和 Release 配置)。
-
config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "11.0"- 将
IPHONEOS_DEPLOYMENT_TARGET设置为11.0。这意味着所有的 Pod target 的最低 iOS 部署版本将是 iOS 11.0。这样可以确保所有 Pod 在这个版本及以上的 iOS 系统上运行。
- 将
-
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"- 在 iPhone 模拟器环境下排除
arm64架构。由于一些第三方库可能不支持arm64架构的模拟器,这个设置可以避免在模拟器上构建时出现兼容性问题。
- 在 iPhone 模拟器环境下排除
-
config.build_settings["DEVELOPMENT_TEAM"] = "your teamid"- 设置开发团队 ID。这个设置用于代码签名,必须替换为你实际的开发团队 ID。这个 ID 可以在 Apple 开发者账户中找到。
应用场景
IPHONEOS_DEPLOYMENT_TARGET:确保所有的 Pod target 最低支持的 iOS 版本一致,避免 Pod target 的最低版本高于应用的最低版本。EXCLUDED_ARCHS[sdk=iphonesimulator*]:解决在 Apple Silicon Mac 上使用模拟器时遇到的一些架构兼容性问题。DEVELOPMENT_TEAM:确保所有 Pod target 使用正确的开发团队进行代码签名,这对于分发和测试非常重要。
config.build_settings["DEVELOPMENT_TEAM"] = "your teamid" 不记这个会有什么影响吗?
-
代码签名问题:
- 签名错误: 在没有设置
DEVELOPMENT_TEAM的情况下,如果 Pod targets 需要代码签名,Xcode 可能会无法找到正确的签名团队,从而导致签名错误。 - 自动签名失败: 如果你的项目启用了自动代码签名,Xcode 可能无法自动选择正确的开发团队,从而导致签名和构建失败。
- 签名错误: 在没有设置
-
运行和调试问题:
- 无法运行在设备上: 如果 Pod targets 需要部署到物理设备,而没有正确设置开发团队,Xcode 会因为缺少签名信息而无法将应用部署到设备上。
- 模拟器不受影响: 在模拟器上运行时,代码签名通常不需要开发团队 ID,因此可能不会受到影响。
-
发布问题:
- 发布到 App Store 失败: 在将应用发布到 App Store 或 TestFlight 时,所有 target 都需要正确的代码签名。如果 Pod targets 缺少签名信息,发布过程会失败。
- 企业分发失败: 对于企业签名和分发,同样需要正确设置开发团队 ID。
-
解决方法:
- 手动设置: 你可以在 Xcode 的项目设置中手动为每个 target 设置开发团队。但这可能会在你更新 Pods 时被覆盖,需要每次重新设置。
- 自动设置: 使用
post_install钩子在 CocoaPods 安装后自动为所有 Pod targets 设置开发团队 ID,是最可靠和方便的解决方案。