UnityでiOSのアプリを作っていて困ることの一つに、iOSが提供するシステムフレームワークへのリンクをプロジェクトに追加するのが超面倒くさいという問題が挙げられます。UnityがiOSアプリを書きだした後、手動でXcode上からシステムフレームワークを追加してもいいのですが、これはとんでもなく面倒です。
そこでUnityジャパンの伊藤さんという方が PostprocessBuildPlayer という仕組みと Ruby の xcodeproj ライブラリを使ってビルド時に自動的にシステムフレームワークを追加する仕組みを公表してくださいました。お陰様で随分とはかどっていたのですが、その方法では実はシステムフレームワークをWeakリンク(Optionalリンク)することができなかったのです。これでは例えばSocial.frameworkを使うアプリをビルドしてiOS5で動かすと起動時に問答無用でクラッシュしてしまいます。困りました。iOS6/5両対応ができないと話になりません。
というわけで作りました。システムフレームワークをWeakリンクできるPostprocessBuildPlayerを。こちらです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
# | |
# PostprocessBuildPlayer | |
# Tested on Ruby 1.8.7, Gem 1.3.6, and xcodeproj 0.3.0 | |
# Created by akisute (http://akisute.com) | |
# Licensed under The MIT License: http://opensource.org/licenses/mit-license.php | |
# | |
require 'rubygems' | |
require 'xcodeproj' | |
require 'pathname' | |
# | |
# Define utility functions | |
# | |
def add_system_frameworks_to_project(proj, framework_names, option=:required) | |
proj.targets.each do |target| | |
if target.name == "Unity-iPhone-simulator" then | |
next | |
end | |
framework_names.each { |framework_name| | |
framework = proj.add_system_framework(framework_name) | |
ref = Xcodeproj::Project::PBXBuildFile.new(proj, nil, { 'fileRef' => framework.uuid}) | |
if option == :optional then | |
ref.settings = {"ATTRIBUTES" => ["Weak"] } | |
end | |
if target.respond_to?(:build_phases) then | |
# xcodeproj 0.3.0 or greater | |
phase = target.build_phases.find { |phase| phase.is_a?(Xcodeproj::Project::PBXFrameworksBuildPhase) } | |
phase.build_files << ref | |
else | |
# xcodeproj 0.1.0 | |
phase = target.buildPhases.find { |phase| phase.is_a?(Xcodeproj::Project::PBXFrameworksBuildPhase) } | |
phase.files << ref | |
end | |
puts "Added system framework: " + framework_name + " as " + option.id2name | |
} | |
end | |
end | |
# | |
# Define build directory path | |
# -> Will be suppried as argv if run by Unity | |
# -> Else, assume UNITY_PROJECT_ROOT/build is a build directory | |
# | |
buildpath = (ARGV[0]) ? ARGV[0] : File.expand_path(File.dirname($0)) + "/../../build" | |
puts "PostprocessBuildPlayer running on build directory: " + buildpath | |
# | |
# Add System frameworks required to build | |
# | |
projpath = buildpath + "/Unity-iPhone.xcodeproj" | |
proj = Xcodeproj::Project.new(projpath) | |
add_system_frameworks_to_project(proj, ["StoreKit", "Security", "CoreText", "MessageUI"], :required) | |
add_system_frameworks_to_project(proj, ["Twitter", "Social"], :optional) | |
proj.save_as(projpath) |
ライセンスはMITライセンスにしておきました。
使い方は大体見ればわかるかと思いますが、まず最初にgem経由でxcodeprojをインストールしておくこと。
sudo gem install xcodeprojあとは上記のPostprocessBuildPlayerをUnityプロジェクトの /Assets/Editor 以下に配置して、コード中のフレームワーク名を指定している箇所をご自身のお好きなように変更してやればオッケーです。