cocoapods-packager 插件的错误修复和适配

 原创    2023-11-15

在前篇文章 pod package的不足和改进 中对 cocoapods-packager 插件如何自定义参数做过介绍,那已经是 2020 年的事了,cocoapods-packager 目前依旧停留在 2016 年的 1.5.0 版本,已渐失于维护。我在适配 Xcode 15 时,遇到一些问题,这里做下记录。

Unknown option: --local

pod package --local 允许使用本地代码打包,而无需从发布的版本上下载,这个参数非常适合本地测试开发。如果直接按如下方式安装 cocoapods-packager,并不会支持 --local 参数:

sudo gem install cocoapods-packager

这是因为 https://github.com/CocoaPods/cocoapods-packager 仓库中最新 1.5.0 Tag 不支持 --local 参数。正确的做法是取 master 最新的代码:

gem install specific_install
gem specific_install https://github.com/CocoaPods/cocoapods-packager

gem install 到底安装到了哪里?

通过 gem 安装的依赖库,可能会被安装到系统中的不同路径,后面会有修改 cocoapods-packager 源码的需求,实际安装路径没找对修改错了源码是不起作用的。可以借助 gem-path 插件 查看 gem 安装库(生效的)的实际位置。

gem install gem-path
gem path cocoapods-packager

The armv7/armv7s architecture is deprecated

从 Xcode 14 开始,已经不再支持 armv7/armv7s 架构了,直接使用 pod package 默认会编译 x86_64、i386、arm64、armv7、armv7s 的包,将报错:

error: The armv7 architecture is deprecated. You should update your ARCHS build setting to remove the armv7 architecture.
error: The armv7s architecture is deprecated. You should update your ARCHS build setting to remove the armv7s architecture. 

修复方式:

通过 gem path cocoapods-packager 找到 cocoapods-packager 实际安装位置,修改 lib/cocoapods-packager/builder.rb:

def ios_architectures
  #archs = %w(x86_64 i386 arm64 armv7 armv7s)
  archs = %w(x86_64 arm64)
  vendored_libraries.each do |library|
    archs = `lipo -info #{library}`.split & archs
  end
  archs
end

Building for 'iOS', but linking in object file built for 'iOS-simulator'

在 Xcode 15 中,通过 cocoapods-packager 打包 framework 静态库,编译产出都没有问题,但在使用时报这个错误。

在 Xcode 支持 Apple silicon 以后,模拟器和真机都需要包含 arm64 架构代码,如果同时包含就存在冲突,需要配置排除模拟器版本的 arm64 架构:

EXCLUDED_ARCHS[sdk=iphonesimulator*] = 'arm64'

cocoapods-packager 依然没有处理这个问题,需要手动修改。

vim lib/cocoapods-packager/pod_utils.rb

unless static_installer.nil?
  static_installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
      config.build_settings['GCC_GENERATE_DEBUGGING_SYMBOLS'] = 'NO'
      config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' // add
    end
  end
  static_installer.pods_project.save
end

如何设置 OTHER_CFLAGS 参数?

cocoapods-packager 并没有暴露设置 xcodebuild 编译参数的设置入口,从 pod package 命令行尝试设置编译参数是无法生效的,相关代码在:

//lib/cocoapods-packager/builder.rb
def ios_build_options
      "ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
end

最佳实践

我已经在 cocoapods-packager 上面踩过不少坑,索性直接 fork 一份 cocoapods-packager 来维护,Github 地址在:cocoapods-packager。相对官方仓库的改动点有:

  1. 修复了 armv7/armv7s 的问题;
  2. 增加 --other-c-flags 以支持自定义编译参数,对我个人而言这个参数非常实用。比如开启混淆:
pod package kanchuan.podspec --force --embedded --local --no-mangle --exclude-deps --spec-sources="" --verbose --other-c-flags="-mllvm -enable-allobf"

如果你喜欢这个特性,可以按照以下方式部署:

安装 cocoapods-packager:

sudo gem install cocoapods-packager

查看安装路径:

gem path cocoapods-packager

将从 https://github.com/ckanchuan/cocoapods-packager 下载的文件全部覆盖至安装路径中。

文章最后修改于 2023-12-19

相关文章:

CocoaPods Podfile and podspec configurations
pod package的不足和改进
iOS Asset Catalog and Bundle
iOS CoreMotion 传感器开发
由 xpc_connection_send_message_with_reply_sync 超时引发的崩溃

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。