需求背景:公司业务模块,需要下沉为独立的远程pod,以达到解除相互依赖和加快测试编译速度的效果,做到脱离主工程单独调试开发大部分功能,而壳工程难免需要用到一些通用的功能如用户信息token等在网络请求内部的封装,其他业务组件也需要用到,所以可以自己创建一个通用模板,基于此模板开发。
如:网络请求里需要使用到认证的用户信息,此时需要在appDelegate内加入通用的OAuth方法打开主app获取授权的token等认证信息,在壳工程内请求里填充到对应的请求头或者body内完成认证,以避免再次引入登录和用户认证模块增大工程编译量。
技术实现关键:
官方推荐的pod lib create yourPodName 会被隐式转换为 pod lib create yourPodName --template-url=https://github.com/CocoaPods/pod-template.git, 故我们可以基于官方的template进行修改,做成自己的业务模块通用模板,使用--template-url参数指定模板来源
官方模板结构分析:
MyLib
├── .travis.yml
├── configure
├── LICENSE
├── NAME-osx.podspec
├── NAME.podspec
├── Pod
│ ├── Classes
│ ├── Assets
├── POD_LICENSE
├── POD_README.md
├── README.md
├── setup
│ ├── ConfigureiOS.rb
│ ├── ConfigureMacOSSwift.rb
│ ├── ConfigureSwift.rb
│ ├── MessageBank.rb
│ ├── ProjectManipulator.rb
│ ├── TemplateConfigurator.rb
│ └── test_examples
│ └── kiwi.m
│ └── quick.swift
│ └── specta.m
│ └── xctest.m
│ └── xctest.swift
└── templates
│ ├── ios
│ └── Example
│ └── Podfile
│ └── PROJECT
│ └── PROJECT.xcodeproj
│ └── Tests
│ └── macos-swift
│ └── Example
│ └──swift
│ └── Example
以上为模板目录内的大致文件结构,可以很清晰的看到内部结构,主入口为configure,然后调用TemplateConfigurator.rb等相关脚本创建 相关脚本的各自功能: TemplateConfigurator.rb :询问用户是创建iOS还是macOS的类型,以及oc还是swift的类型,然后根据用户输入依次调用对应的脚本,此次将主要针对iOS oc的创建来说明 ConfigurationiOS.rb/ConfigureMacOSSwift.rb/ConfigureSwift.rb,然后执行以下操作 replace_variables_in_files #将类的注释替换为对应的日期,作者等 PROJCT_OWNER 替换为作者 PROJECT 替换为你创建的库名,TODAYS_YEAR,TODAYS_DATE 替换为日期 clean_template_files #清理临时文件 rename_template_files #重命名临时文件 add_pods_to_podfile #添加pod至podfile customise_prefix #批量重命名类前缀(CPD开头类) rename_classes_folder #文件夹重命名 ensure_carthage_compatibility #适配carthage用法 reinitialize_git_repo # run_pod_install #执行pod install安装工程
@message_bank.farewell_message #完成后显示欢迎
ConfigurationiOS.rb 询问是否创建demo壳工程,由于我们正是要创建壳工程,所以perform方法这里注释掉直接keep_demo = :yes即可默认创建demo壳工程 询问是否使用单元测试框架,framework = :none 根据需求直接不使用即可 询问类前缀,此处保留,依各业务模块需求命名类前缀
ProjectManipulator.rb 先执行指定格式文本替换 @string_replacements = { "PROJECT_OWNER" => @configurator.user_name, #此处有一个注意点,当git配置为中文名时,会报错 "TODAYS_DATE" => @configurator.date, #修改为创建日期 "TODAYS_YEAR" => @configurator.year, #修改为创建年 "PROJECT" => @configurator.pod_name, #修改为你的lib名 "CPD" => @prefix #将CPD修改为你自己定义的前缀 } 再调用主要装配工程的脚本,原脚本写死了只有以下四个类会重命名并copy到创建的模板 ["CPDAppDelegate.h", "CPDAppDelegate.m", "CPDViewController.h", "CPDViewController.m"].each do |file| before = project_folder + "/PROJECT/" + file next unless File.exists? before
after = project_folder + "/PROJECT/" + file.gsub("CPD", prefix)
File.rename before, after
因为模板工程里需要加入我们自己的一些类,保证同时copy过去,需要先打开templates/ios/Example/project.xcodeproj工程,如普通项目一样向工程内添加代码,然后将生成的类重命名为CPD开头的类,保证重命名时能覆盖到 然后修以上copy和重命名的代码为 oriFiles = Dir[project_folder + "/PROJECT/*"] oriFiles.each do |file| puts "original file is " + file #log输出重命名前的类文件 puts "" before = file next unless File.exist? before after = file.gsub("CPD", prefix) puts "rename file is " + after #log输出重命名以后的类文件 puts "" 这样就会自动将该project目录下的所有文件重命名移动,不需要手动每个文件添加
针对以上添加入的CPD开头的文件,如果有使用了自己对应的pod库依赖的,在podfile里添加,并且注意在podfile头加入source避免找不到
最后根据pod lib create --template-url=yourGit 即可自动创建对应的模板类 已经修改好的demo模板地址:github.com/iPermanent/… 可以使用看效果,去除了平台提示,并直接使用oc,去除了swift语言提示以及单元测试框架的提示,只保留了输入类前缀的功能(默认集成了自己的HRCocoaTools/Category,仅用于示例,可自行去除)