上一章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"
],

运转调试:

iOS工程05组件二进制续
这个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运转调试:

iOS工程05组件二进制续
调试成果:
iOS工程05组件二进制续
发现之前装置到: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'])

iOS工程05组件二进制续
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)

iOS工程05组件二进制续
需求把多个渠道的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

运转成果:

iOS工程05组件二进制续
如果有报插件警告.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

检查生成目录

iOS工程05组件二进制续
这便是对应的copy 脚本
iOS工程05组件二进制续

总结

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