Xcodeproj 使用指南 (简易版)

5,088 阅读3分钟

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的理解

  1. project 是总的容器,用于保存,

  2. group 是文件路径,用于区分存储信息和位置,

  3. target是添加目标,一个文件可以同时属于多个target。

对于group 很有意思的是,通常对于.h、.m此类项目文件,设置为#group.set_source_tree('SOURCE_ROOT'),对与链接文件,如.framework、.a文件等,使用group.set_source_tree('<group>')

后记

写的很仓促,如果有哪位大神有发现错误,麻烦在评论区里告知一下,非常感谢

参考文档

ruby库xcodeproj使用心得