ruby庫(kù)xcodeproj使用心得

| 導(dǎo)語(yǔ) 在iOS自動(dòng)化測(cè)試工具的開發(fā)過(guò)程中,會(huì)涉及到修改項(xiàng)目工程的配置,通過(guò)xcodeproj可以實(shí)現(xiàn)腳本方式修改,不需要打開XCode手動(dòng)修改配置了。

xcodeproj這個(gè)庫(kù)功能很強(qiáng)大,XCode工程的大多數(shù)配置都可以通過(guò)通過(guò)xcodeproj完成;在這里主要給大家介紹下一些常用配置的修改方法。

使用方法:

1.安裝xcodeproj

gem install xcodeproj

2.通過(guò)xcodeproj設(shè)置證書

require 'xcodeproj'

#打開項(xiàng)目工程A.xcodeproj
project_path = 'xxxPath/A.xcodeproj'
project = Xcodeproj::Project.open(project_path)

#修改某個(gè)target在debug模式下的證書配置
#此處遍歷找到debug
project.targets[0].build_configurations.each do |config|
  if config.name == 'Debug'
    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

此處可以通過(guò)此方法修改target下某個(gè)模式(debug, release等)的大多數(shù)配置,可通過(guò)config.build_settings查看所有的鍵值對(duì),然后根據(jù)需求修改鍵值,如OTHER_FLAGS,PRODUCT_BUNDLE_IDENTIFIER,HEADER_SEARCH_PATHS,LIBRARY_SEARCH_PATHS等。

3.通過(guò)xcodeproj在工程的xxx group下引入xx.h和xx.m文件


require 'xcodeproj'

#打開項(xiàng)目工程A.xcodeproj
project_path =  'xxxPath/A.xcodeproj'
project = Xcodeproj::Project.open(project_path)

#找到要插入的group (參數(shù)中true表示如果找不到group,就創(chuàng)建一個(gè)group)
group = project.main_group.find_subpath(File.join('GroupName'),true)

#set一下sorce_tree
group.set_source_tree('SOURCE_ROOT')

#向group中增加文件引用(.h文件只需引用一下,.m引用后還需add一下)
file_ref = group.new_reference('xxxPath/xx.h')

file_ref = group.new_reference('xxxPath/xx.m')
ret = target.add_file_references(file_ref)

project.save

4.通過(guò)xcodeproj在工程中引入framwork、.a文件和bundle文件

require 'xcodeproj'

#打開項(xiàng)目工程A.xcodeproj
project_path =  'xxxPath/xx.xcodeproj'
project = Xcodeproj::Project.open(project_path)

#遍歷target,找到需要操作的target

targetIndex = 0

project.targets.each_with_index do |target, index|
  if target.name  == "xxxTargetName"
    targetIndex = index
  end
end

target = project.targets[targetIndex]

#添加xx.framework的引用
file_ref = project.frameworks_group.new_file('xxPath/xx.framework')
target.frameworks_build_phases.add_file_reference(file_ref)

#添加xx.a的引用
file_ref = project.frameworks_group.new_file('xxPath/xx.a')
target.frameworks_build_phases.add_file_reference(file_ref)

#添加xx.bundle的引用
file_ref = project.frameworks_group.new_file('xxPath/xx.bundle')
target.resources_build_phase.add_file_reference(file_ref)

project.save

5.提供過(guò)xcodeproj在把xx.framework加入到copy files phase中(這里不限framework,也可以是其他類型文件)

require 'xcodeproj'
#打開項(xiàng)目工程A.xcodeproj 
project_path = 'xxxPath/xx.xcodeproj' 
project = Xcodeproj::Project.open(project_path)
#遍歷target,找到需要操作的target 
targetIndex = 0 
project.targets.each_with_index do |target, index| 
  if target.name == "xxxTargetName" 
    targetIndex = index 
  end
end

target = project.targets[targetIndex] 

file_ref = project.frameworks_group.new_file('xxPath/xx.framework')

#把xx.framework添加到copy files中
#"leakFramework"即copy files build phase的名字,可自己隨便取,也可不填,默認(rèn)為空
target.new_copy_files_build_phase("leakFramework")

#項(xiàng)目中可能有多個(gè)copy files build phases,找到剛剛創(chuàng)建的那個(gè),然后把xx.framework引入
target.copy_files_build_phases.each do |item| 
  if item.name == "leakFramework"
     #引入xx.framework
     item.add_file_reference(file_ref)
     #設(shè)置copy file buldphase中的Destination選項(xiàng),使用枚舉值表示的。"10"表示Frameworks 
     #這個(gè)值我是通過(guò)對(duì)比設(shè)置前后的兩個(gè)文件找出來(lái)的
     item.dst_subfolder_spec = "10"
     #勾上code sign on copy選項(xiàng)(默認(rèn)是沒勾上的)
     item.files[0].settings = Hash.new  
     item.files[0].settings["ATTRIBUTES"] = ["CodeSignOnCopy"] 
  end
end

下面說(shuō)說(shuō)我找一個(gè)設(shè)置項(xiàng)對(duì)應(yīng)的腳本的方法:
拿copy files phase的設(shè)置舉例,copy files phase中的引入比其他幾個(gè)build phase的引入稍復(fù)雜,因?yàn)檫€有Destination和subpath,code sign on copy等參數(shù)設(shè)置。在設(shè)置時(shí),若不知道對(duì)應(yīng)的腳本是啥,可以先不設(shè)置,保存project1.pbxproj,然后手動(dòng)設(shè)置這些參數(shù),保存project2.pbxproj。對(duì)比兩個(gè)文件的不同。
比如我在找code sign on copy對(duì)應(yīng)的腳本設(shè)置中是這樣做的:

a.對(duì)比勾上和不勾上的區(qū)別code sign on copy默認(rèn)沒勾上,我通過(guò)對(duì)比發(fā)現(xiàn),project2.pbxproj比project1.pbxproj多了這部分settings = {ATTRIBUTES = (CodeSignOnCopy, ); };(請(qǐng)把滾動(dòng)條拖到末尾能看到)。

DB241A68D0CB52AD852AC2DB /* FBAllocationTracker.framework in leakFramework */ = {isa = PBXBuildFile; fileRef = C5132A98E85BD6300B586092 /* FBAllocationTracker.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };

b.發(fā)現(xiàn)這部分區(qū)別位于/* Begin PBXBuildFile section */ 這個(gè)section中,然后我去xcodeproj的api文檔(http://www.rubydoc.info/gems/xcodeproj/Xcodeproj)中搜索PBXBuildFile相關(guān)的類,找到了下面這個(gè),然后發(fā)現(xiàn)果然有settings這個(gè)屬性。接下來(lái)需要看怎么獲得需要設(shè)置的這個(gè)對(duì)象實(shí)例。


c.因?yàn)槲募羌拥絚opy file phase中了,所以我認(rèn)為這個(gè)copyfile相關(guān)的類中一定有方法能返回PBXBuildFile的實(shí)例,于是我搜索copyfile相關(guān)的類。搜到了PBXCopyFilesBuildPhase這個(gè)類,但是在這個(gè)類中,沒有找到返回PBXBuildFile實(shí)例的方法,那再想想,可能再它的父類中,于是通過(guò)下圖找到了父類AbstractBuildPhase。

d.在AbstractBuildPhase類的api中,我看到了files屬性,返回的是PBXBuildFile實(shí)例??!至此,再順著縷回去,我就知道通過(guò)可通過(guò)target.copy_files_build_phases.files獲取需要配置的文件啦,然后再設(shè)置屬性settings,一切搞定!

這里簡(jiǎn)單說(shuō)了一下我找方法的心路歷程,希望能幫助到大家。在開發(fā)過(guò)程中有更多需求可通過(guò)官方文檔詳查看http://
www.rubydoc.info/gems/xcodeproj/Xcodeproj
。文檔中類名很清晰,可以先根據(jù)自己的需求判斷應(yīng)該使用那個(gè)類,然后去類中具體找方法;或者在方法中模糊搜索一下,可能一下就搜到想要用的方法了!
QQ圖片20170728161226.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容