かつて代官山らへんで働いてたengineerのUnityブログ

サーバサイドやってきたエンジニアがUnityとか触って遊ぶだけのブログ

【Unity】PostprocessBuildPlayer + mod_pbxprojでiOSビルド時に自動でframeworkを追加したりする【iOS】

UnityからiOSにビルド後にframeworkの追加が必要になったりした場合
Unity5からはPBXProjectというAPIを使えば済む話なのですが、Unity4以前だとまだ実装されていないため、PostProcessBuildmod_pbxprojなどのどっかのすごい人達が作った外部のツールを利用必要があります。

今回は残念なことにUnity4環境でframeworkの追加やファイル個別のARC設定の自動化が必要になったため、やったことのメモです。

前提

・Unity4以前の環境
・ビルド後のiOSプロジェクトにframeworkを組み込んで、ファイルごとにARC設定を行う必要がある
・Jenkinsをビルドに使っているなどの理由でframework組み込みと設定も自動化したい
Pythonアレルギーがない(mod-pbxprojはPythonで書かれてるので...)

準備

githubリポジトリからmod-pbxprojを取ってきて、UnityのEditorフォルダ以下に置く
・UnityのEditorフォルダ以下に「PostprocessBuildPlayer」というファイルを拡張子なしで作成する

PostprocessBuildPlayerを書く

UnityのEditorフォルダ以下にPostprocessBuildPlayerというファイルを置いておくだけでビルド後に勝手に実行されます
こいつは基本的にどんな言語でも書けるらしいのですが、今回はmod-pbxprojがPythonで書かれてるのでこいつもPythonです。マジカヨ...

#!/usr/bin/env python

import os, sys
from mod_pbxproj import *

proj = XcodeProject.Load(proj_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
PROJ_ROOT = proj.source_root

#ファイルが存在するかチェック
test_framework_is_readable = os.access(proj_path + '/Libraries/TestFramework', os.R_OK)
if compliance_sdk_is_readable:

    #TestFrameworkをグループとして取り込み
    proj.add_folder(PROJ_ROOT + '/Libraries/TestFramework', parent = lib_group)

    #取り込んだframeworkのファイルに「-fobjc-arc」を付与してARC有効にする
    fileNameList = []
    fileNameList.append('TestFrameworkViewController.m')
    fileNameList.append('TestFrameworkController.m')
    fileNameList.append('TestFrameworkVerificationViewController.m')
    fileNameList.append('TestFrameworkAgreementManager.m')


    for fileName in fileNameList:
        fileId = proj.get_files_by_name(fileName)
        files = proj.get_build_files(fileId[0].id)
        for f in files:
            f.add_compiler_flag('-fobjc-arc')


あとはビルドを実行するだけでこいつが勝手に動いてくれるはず
mod_pbxprojの詳しい使い方はgithubを読むとなんとなくわかるはず