上一章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文件