iOS工程05组件二进制续

1,361 阅读3分钟

上一章Xcode组件二进制。

一、Xcode组件二进制续

1、hook

1.cocoapods_plugin的作用加载cocoapods插件gems:

# gem 安装到你搜索的目录 
module Pod
    module CocoaPodsCatBinHook
      HooksManager.register('cocoapods-cat-bin', :pre_install) do |context, option|
        # 
        p context, option
      end
      HooksManager.register('cocoapods-cat-bin', :pre_integrate) do |context, option|
        # 
        p context, option
      end
      HooksManager.register('cocoapods-cat-bin', :post_install) do |context, option|
        # 
        p context, option
      end
      HooksManager.register('cocoapods-cat-bin', :post_integrate) do |context, option|
        # 
        p context, option
      end
    end
end

安装插件到本地:

先在podfile添加plugin
platform :ios, '9.0'

plugin 'cocoapods-cat-bin'
target 'TestApp' do
  use_frameworks!
  pod 'SDWebImage'
end

在运行命令
rake install:local
//配置launch.json
"program": "/Users/ningye/.rvm/gems/ruby-2.7.3/bin/pod",
"args": [
"install", "--project-directory=${workspaceRoot}/../TestApp"
],

运行调试: image.png 这个plugin无法断点也无法调试,为什么呢?因为这个是我们安装到本地的插件了,已经通过cocopods-cat-bin.gemspec文件生成对应的cocoapod.obj.

要怎么样才能调试plugin呢?如下代码:

在原NY_bin文件上添加代码
Gem::Specification.latest_specs(true).map do |spec|
    p spec.full_name
end

if $PROGRAM_NAME == __FILE__
    ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile',__dir__)
    require 'bundler/setup'
end
Gem::Specification.latest_specs(true).map do |spec|
    p spec.full_name
end

重新配置launch.json运行调试: image.png 调试结果: image.png 发现之前安装到:local的cocoapods-cat-bin已经存在了,所以重复安装了。

所以需要卸载cocoapods-cat-bin / gem uninsstall cocoapods-cat-bin Successfully uninstalled cocoapods-cat-bin-0.1.0

然后在原NY_bin文件上继承添加代码

#pod cat
Pod::Command.run(['install','--project-directory=${workspaceRoot}/../TestApp'])

image.png CocoaPods Hook:

  • pre_insatall:Pod下载之后但在按装之前对Pod进行任何更改
  • pre_integrate:将生成的Xcode项目写入磁盘之前
  • pre_install:生成的Xcode项目写入磁盘之前对其进行任何最后更改
  • post_integrate:在项目写入磁盘后进行更改

组件编译方式选择:

选择那个action去编译?

  1. Build产物目录不能直接控制,Archive可直接控制
  2. Build动态库的调试符号放在framework下,Archive放在指定目录下
  3. Archive对xcframework格式支持的更好

Swift Library Evolution (引入了运行时的机制-你的app会自动加入动态库2.0) image.png 需要把多个平台的framework打包成一个xcframework。

编译命令:

  1. 对于模拟器:intel、arm64、m1
  2. .a库文件处理
  3. Swift模块文件generic/

然后我在终端试运行下编译命令:

xcodebuild clean archive BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
-project 'Pods/Pods.xcodeproj' \
-scheme 'Pods-App' \
-destination "generic/platform=iOS Simulator" -sdk ‘iphonesimulator’ \
-archivePath './archive/Pods-App.xcarchive' \
SKIP_INSTALL=NO -showBuildTimingSummary

运行结果: image.png 如果有报插件警告.xcplugin 可以open 到相关目录删错或者添加对应的UUID。

核心问题: 编译的需要产物? 需要保存哪些东西到产物目录?

需要把产物生成到产物目录中。platfrom-->xcode.project 保存archives路径到xcframework-->二进制产物打包起来

XCFramework

和传统的framework相比:

  1. 可以用单个.xcframework文件提供多个平台的分发二进制文件;
  2. 与Fat Header相比,可以按照平台划分,可以包含相同框架的不同平台文件;
  3. 在使用时,不需要再通过脚本去剥离不需要的框架体系。
//编译命令
xcodebuild -create-xcframework \
-archive ./archive/SYTimer-iphonesimulator.xcarchive \
-headers './headers' \
-library libSYTimer.a \
-archive ./archive/SYTimer-iphoneos.xcarchive \
-headers './headers' \
-library libSYTimer.a \
-output 'SYTimer.xcframework'

查看xcodebuild 命令帮助:xcodebuild -create-xcframework -help

现在我们配置podfile:

target 'LGApp' do
  platform :ios, '9.0'
#  use_frameworks!
  pod 'Kingfisher'
end

//在终端运行
pod install

查看生成目录 image.png 这就是对应的copy 脚本 image.png

总结

1.copy工程点到指定目录
2.配置生成对应podspec
3.生成工程引入第三方
4.编译生成xcframework
5.编译产物copy到指定目录
6.保存archives路径到xcframework->二进制打包
7.创建私有库(xcframework)到.source文件