xcodeprojでXcodeのターゲットのCopy Bundle Resourcesにファイルを追加する

2014-12-10

Unityから出力したXcodeのプロジェクトで実行時に使用するリソースを追加したかったので、方法を調べた。

Ruby の xcodeproj gemを使って、

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'xcodeproj'

# グループを作ってその中にファイルへの参照を追加する
def add_file_refs(xcproj, parent_group, group_name, file_paths)
group = xcproj.new(Xcodeproj::Project::Object::PBXGroup)
group.name = group_name
parent_group << group

file_paths.each do |path|
next unless File::exists?(path) && File::ftype(path) == 'file'
ref = xcproj.new(Xcodeproj::Project::Object::PBXFileReference)
ref.name = File.basename(path)
ref.path = path
group << ref
end
return group
end

# Copy Bundle Resources にリソースを追加する
def add_copy_bundle(xcproj, target_name, file_refs)
xcproj.targets.each do |target|
next unless target_name === target.name

copy_bundle_resources = target.resources_build_phase
file_refs.each do |ref|
copy_bundle_resources.add_file_reference(ref)
end
end
end

def main
xcproj_path = ARGV.shift
target_name = ARGV.shift
group_name = 'resources'
files = ARGV

xcproj = Xcodeproj::Project.new(xcproj_path)
xcproj.initialize_from_file

group = add_file_refs(xcproj, xcproj.main_group, group_name, files)
add_copy_bundle(xcproj, target_name, group.children)

xcproj.save
end

if $0 == __FILE__
main
end

使い方: ruby add_resources.rb [xcodeprojパス] [ターゲット名] [追加するファイル...]

# UnityからBuildで出力したプロジェクトにあるディレクトリ以下のファイルたちを追加する場合
# ディレクトリは除外されるのでシェル展開の **/* でOK
$ ruby add_objc.rb /Path/To/Project/Unity-iPhone.xcodeproj Unity-iPhone resources /Path/To/Resources/**/*
  • Copy Bundle Resources として使用するファイルはプロジェクトに登録されてないといけないようなので、まずresourcesという名前のグループを作ってその中にFileReferenceとして登録する
  • そしてそれらのファイルをCopy Bundle Resourcesに追加する
  • 重複チェックをしていないので2度実行すると二重に登録されてしまう