LoginSignup
1
1

More than 5 years have passed since last update.

PostProcessBuildでRubyを使う〜iOS用〜

Last updated at Posted at 2017-07-03

Xcodeprojを使用します。
特にUnity限定というわけでもないので、Unity以外でも使用できます。

もちろんUnityEditor.iOS.Xcodeでも同様のことはできるかと思います。

環境

  • Unity 5.5.1f1
  • Mac (10.12.5)
  • xcodeproj (1.4.2)

QuickStartのUnityでの読み替え+α

PostProcessBuildでRubyを使うで実行されている想定で、Rubyのソースの先頭で以下が定義されている前提です。
適宜読み替えていただければと思います。

require 'xcodeproj'

output_path = ARGV[0]
target = ARGV[1].downcase
is_development = ARGV[2].downcase == 'true'
product_name = ARGV[3]
  • ここでは特に記述しないですが、Unityでビルド時にreplaceしない限り同じ内容(Build Phaseの追加など)を追記してしまう可能性があるため、追加する前にチェックする必要があります。

プロジェクトの読み込みから保存

以下で定義された変数projcectは以降でも使用されます。

*.xcodeprojファイル

# 読み込み
project_path = '#{output_path}/Unity-iPhone.xcodeproj'
project = Xcodeproj::Project.open(project_path)

# 保存(この場合上書きされます)
project.save(project_path)

*.plist

# 読み込み
info_plist_path = "#{output_path}/Info.plist"
info_plist = Xcodeproj::Plist.read_from_path(info_plist_path)

# 保存(この場合上書きされます)
Xcodeproj::Plist.write_to_path(info_plist, info_plist_path)

各ターゲットの読み込み

project.targets.each do |target|
  puts target.name
end

以下が出力されるかと思います。

Unity-iPhone
Unity-iPhone Test

参考

BuildPhaseの追加

Shell Script Build Phaseの追加

project.targets.each do |target|
  # BuildPhaseの作成
  phase = project.new(Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
  phase.name = 'phaseの名前'
  phase.shell_script = 'echo シェルスクリプトを書く'

  # 末尾に追加
  target.build_phases << phase
end

Copy Files Build Phaseの追加

以下の例はframeworkファイルの参照をコピーします
symbol_dst_subfolder_specにはConstants::COPY_FILES_BUILD_PHASE_DESTINATIONSに含まれているものであれば指定することができます。

project.targets.each do |target|
  # BuildPhaseの作成
  phase = project.new(Xcodeproj::Project::Object::PBXCopyFilesBuildPhase)
  phase.name = 'phaseの名前'
  phase.symbol_dst_subfolder_spec = :frameworks

  # ファイルのリファレンス情報を作成
  framework_ref = project.new(Xcodeproj::Project::Object::PBXFileReference)
  framework_ref.name = 'hogehoge.framework'
  # 例:Frameworks/Plugins/iOS/hogehoge.framework
  framework_ref.path = '/path/to/hogehoge.framework'

  build_file = phase.add_file_reference(framework_ref, true)

  # Code Sign On Copyにチェックを入れたい場合
  # build_file.settings = {
  #   'ATTRIBUTES' => [
  #     'CodeSignOnCopy',
  #     'RemoveHeaderOnCopy'
  #   ]
  # }

  # 末尾に追加
  target.build_phases << phase
end

その他

target.build_phasesはArrayを継承したObjectListを返却するため、新しいBuild Phaseの存在チェックや指定の箇所への挿入ができます。

CopyFilesの名前を持ったBuildPhaseが存在するか

target.build_phases.any? do |phase|
  phase.name == 'CopyFiles'
end

nameを持っていない場合があるためチェックがあったほうが良い。

target.build_phases.any? do |phase|
 phase.respond_to?(:name) && phase.name == 'CopyFiles'
end

CopyFilesの名前を持ったBuildPhase後に挿入

index = target.build_phases.rindex {|p|
 p.display_name == 'CopyFiles'
}
if index.nil?
 target.build_phases << phase
else
 target.build_phases.insert(index + 1, phase)
end

参考

おわり

Xcodeprojの使い方がわからなくて、リファレンス、spec、コードを読みつつ書いています。
あまりRubyが得意というわけでもないので、Rubyっぽくないなどで他に良い書き方があればご教授いただけるとうれしいです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1