上一章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"
],
运行调试:
这个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运行调试:
调试结果:
发现之前安装到: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'])
CocoaPods Hook:
pre_insatall:Pod下载之后但在按装之前对Pod进行任何更改pre_integrate:将生成的Xcode项目写入磁盘之前pre_install:生成的Xcode项目写入磁盘之前对其进行任何最后更改post_integrate:在项目写入磁盘后进行更改
组件编译方式选择:
选择那个action去编译?
- Build产物目录不能直接控制,Archive可直接控制
- Build动态库的调试符号放在framework下,Archive放在指定目录下
- Archive对xcframework格式支持的更好
Swift Library Evolution (引入了运行时的机制-你的app会自动加入动态库2.0)
需要把多个平台的framework打包成一个xcframework。
编译命令:
- 对于模拟器:intel、arm64、m1
- .a库文件处理
- 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
运行结果:
如果有报插件警告.xcplugin 可以open 到相关目录删错或者添加对应的UUID。
核心问题:
编译的需要产物?
需要保存哪些东西到产物目录?
需要把产物生成到产物目录中。platfrom-->xcode.project 保存archives路径到xcframework-->二进制产物打包起来
XCFramework
和传统的framework相比:
- 可以用单个.xcframework文件提供多个平台的分发二进制文件;
- 与Fat Header相比,可以按照平台划分,可以包含相同框架的不同平台文件;
- 在使用时,不需要再通过脚本去剥离不需要的框架体系。
//编译命令
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
查看生成目录
这就是对应的copy 脚本
总结
1.copy工程点到指定目录
2.配置生成对应podspec
3.生成工程引入第三方
4.编译生成xcframework
5.编译产物copy到指定目录
6.保存archives路径到xcframework->二进制打包
7.创建私有库(xcframework)到.source文件