1. Xcodeproj 是什么
cocoapods 提供的一个对项目 工程文件(project.pbxproj)的增删改查的工具组件,只要安装过cocoapods 都有,
网上关于这个介绍很多,但是真正使用起来有点懵,所以写了一个简易版的文档,有助于使用和理解
2.Xcodeproj 怎么用
2.1 如何描述工程结构
Xcodeproj 组件,对工程文件进行了抽象,抽象成了不同的类,文件信息被抽象成了四个大父类 这四个父类再配合他们的子类,基本就描述了整个工程文件配置
AbstractObject
基类,提供一些基本的信息查询等功能
AbstractBuildPhase
对应的就是集体的BuildPhase ,提供在这个模块的增删等操作
AbstractTarget
相当于target 里面提供了大量的API,可以查询target里面的大量设置,通过这些设置,可以查到对应的信息,比如指定的BuildPhase选项
PBXGroup
文件位置等相关信息,基本都是以group确认文件,以target为增删改查的目标。
总结
大部分工程设置都是这些的子类,如果需要配置哪些功能,可以查找官网信息文档。使用官网搜索功能
例如 target 内包含各种设置信息,则可以到AbstractTarget 类中查找信息数组查询方法
查询到指定信息,则找到对应的AbstractBuildPhase 子类,查询增删改查的方法
相关文档
如果对Xcode相关设置有兴趣可参考 Xcode工程信息文档
2.2 各个类的具体使用
xcodeproj. 使用ruby.
2.2.1 设置证书
require 'xcodeproj'
#打开项目工程A.xcodeproj
basePath =File.dirname(__FILE__) # 当前根路径
# 获取工程路径
project_path = basePath + '/A.xcodeproj'
project = Xcodeproj::Project.open(project_path)
#修改某个target在debug模式下的证书配置
#此处遍历找到debug
# build_configurations 是xcodeproj定义的一个方法,用来获取配置信息列表,
#建议去官网(https://www.rubydoc.info/gems/xcodeproj/Xcodeproj)搜索,虽然官网慢的要死
project.targets[0].build_configurations.each do |config|
if config.name == 'Debug'
# 根据定义对各个设置进行修改
# 设置信息明细(https://www.rubydoc.info/gems/xcodeproj/Xcodeproj/Constants)
config.build_settings["PROVISIONING_PROFILE_SPECIFIER"] = "xxProfileName"
config.build_settings["DEVELOPMENT_TEAM"] = "xxTeamName"
config.build_settings["CODE_SIGN_IDENTITY"] = "xxIdentityName"
config.build_settings["CODE_SIGN_IDENTITY[sdk=iphoneos*]"] = "iPhone Developer"
end
end
project.save
2.2.3 添加项目文件
basePath =File.dirname(__FILE__)
# 获取工程路径
project_path = basePath + '/TkimApp.xcodeproj'
# 根据工程文件创建project类
project = Xcodeproj::Project.open(project_path)
# 在工程的maingroup 获取文件名为TKimAPP的一级子文件(通常group类对标的都是文件夹)
group = project.main_group.find_subpath(File.join('TkimApp'), true)
#group.set_source_tree('SOURCE_ROOT')
#设置group信息
group.set_source_tree('<group>')
# 在target数组里,找到第一个,在本工程即TKimAPP
target = project.targets.first
# 需要添加的文件路径
file_path = basePath + '/PacketTunnel.appex'
puts 'file path is:' + file_path
# 文件已经存在,不添加
if group.find_file_by_path(file_path)
puts "file exit"
else
# 文件不存在添加
puts 'file nees add'
# 根据要添加的文件,创建文件类(这是Xcodeproj 自己定义的类型,后面添加方法的入参)
file_ref = group.new_reference(file_path)
tag = false
# 搜索所有copy_files_build_phases ,就是对应Xcode中的BuildPhase 设置信息列表
target.copy_files_build_phases.each do |target_build_phases|
# 查找到Embed App Extensions 选项
if target_build_phases.name == 'Embed App Extensions'
puts 'reasl have Embed App Extensions'
# 将文件名添加到该BuildPhase 选项中,这一步操作类似拖拽
target_build_phases.add_file_reference(file_ref,true)
tag = true
end
end
if tag
puts "tag success"
#保存工程文件
project.save;
end
#########################################################################
添加.h .m文件 如下
file_ref = group.new_reference(file_path)
#添加到combile sources 里面了,这是添加.h .m 的方式
ret = target.add_file_references([file_ref])
ret = target.add_file_references([file_ref])
if ret
puts 'file add success'
project.save
end
关于group target project的理解
-
project 是总的容器,用于保存,
-
group 是文件路径,用于区分存储信息和位置,
-
target是添加目标,一个文件可以同时属于多个target。
对于group 很有意思的是,通常对于.h、.m此类项目文件,设置为#group.set_source_tree('SOURCE_ROOT'),对与链接文件,如.framework、.a文件等,使用group.set_source_tree('<group>')
后记
写的很仓促,如果有哪位大神有发现错误,麻烦在评论区里告知一下,非常感谢