post_install do |installer| 一些配置说明

591 阅读5分钟

示例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。
  • target.build_configurations.each do |config|

    • 遍历每个 target 的所有构建配置(例如,Debug 和 Release 配置)。config 代表每一个构建配置。
  • 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 中的功能。

此代码片段通常用于解决当你在项目中使用 Pods 时,某些 Pods 需要访问不在应用程序扩展 API 中的功能,从而避免编译错误。

APPLICATION_EXTENSION_API_ONLY 的默认值并不是在所有情况下都固定为 YES。它的默认值取决于目标(target)的类型以及 Xcode 项目的配置。以下是一些常见情况:

  1. 应用程序目标(App Target)

    • 对于普通的应用程序目标,APPLICATION_EXTENSION_API_ONLY 默认是 NO。这意味着应用程序可以使用所有可用的 API,而不仅仅是应用程序扩展 API。
  2. 应用程序扩展目标(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

示例说明

  1. post_install do |installer|

    • 这是一个 post_install 钩子,它在 CocoaPods 完成所有的 Pod 安装后执行。installer 是一个参数,代表 CocoaPods 安装程序。
  2. installer.pods_project.targets.each do |target|

    • 遍历所有的 Pod targets。target 代表每一个 Pod target。
  3. target.build_configurations.each do |config|

    • 遍历每个 target 的所有构建配置(例如,Debug 和 Release 配置)。config 代表每一个构建配置。
  4. config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "11.0"

    • 将 IPHONEOS_DEPLOYMENT_TARGET 设置为 11.0。这意味着所有的 Pod target 的最低 iOS 部署版本将是 iOS 11.0。这样可以确保所有 Pod 在这个版本及以上的 iOS 系统上运行。
  5. config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"

    • 在 iPhone 模拟器环境下排除 arm64 架构。由于一些第三方库可能不支持 arm64 架构的模拟器,这个设置可以避免在模拟器上构建时出现兼容性问题。
  6. 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" 不记这个会有什么影响吗?

  1. 代码签名问题:

    • 签名错误:  在没有设置 DEVELOPMENT_TEAM 的情况下,如果 Pod targets 需要代码签名,Xcode 可能会无法找到正确的签名团队,从而导致签名错误。
    • 自动签名失败:  如果你的项目启用了自动代码签名,Xcode 可能无法自动选择正确的开发团队,从而导致签名和构建失败。
  2. 运行和调试问题:

    • 无法运行在设备上:  如果 Pod targets 需要部署到物理设备,而没有正确设置开发团队,Xcode 会因为缺少签名信息而无法将应用部署到设备上。
    • 模拟器不受影响:  在模拟器上运行时,代码签名通常不需要开发团队 ID,因此可能不会受到影响。
  3. 发布问题:

    • 发布到 App Store 失败:  在将应用发布到 App Store 或 TestFlight 时,所有 target 都需要正确的代码签名。如果 Pod targets 缺少签名信息,发布过程会失败。
    • 企业分发失败:  对于企业签名和分发,同样需要正确设置开发团队 ID。
  4. 解决方法:

  • 手动设置:  你可以在 Xcode 的项目设置中手动为每个 target 设置开发团队。但这可能会在你更新 Pods 时被覆盖,需要每次重新设置。
  • 自动设置:  使用 post_install 钩子在 CocoaPods 安装后自动为所有 Pod targets 设置开发团队 ID,是最可靠和方便的解决方案。