読者です 読者をやめる 読者になる 読者になる

スマゲ

スマートなゲームづくりを目指して日々精進

UnityでXcodeの設定を自動化する方法まとめ

UnityでXcode出力後に必要な設定を自動化する方法です。
今回はよく利用しそうなものをサンプル形式でまとめました。

■利用する機能
Unity5から標準利用できるようになったXcodeAPIを利用
Unity - Scripting API: PBXProject

■自動化項目
・ビルド設定の編集
・フレームワークの追加
・コンパイルフラグの設定
・Info.plistの追加

■前準備
PostProcessBuildAttributeを利用して、ビルド後にメソッドを呼び出す

using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;
using System.Collections;

public class XcodeSettingsPostProcesser
{
    [PostProcessBuildAttribute (0)]
    public static void OnPostprocessBuild (BuildTarget buildTarget, string pathToBuiltProject)
    {
        // iOS以外のプラットフォームは処理を行わない
        if (buildTarget != BuildTarget.iOS) return; 

        // PBXProjectの初期化
        var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
        PBXProject pbxProject = new PBXProject ();
        pbxProject.ReadFromFile (projectPath);
        string targetGuid = pbxProject.TargetGuidByName ("Unity-iPhone");
        
        // ここに自動化の処理を記述する

        // 設定を反映
        File.WriteAllText (projectPath, pbxProject.WriteToString ());
    }
}

■ビルド設定の編集

// ビルド設定の追加
pbxProject.AddBuildProperty(targetGuid, "OTHER_LDFLAGS", "-all_load");

// ビルド設定の追加
pbxProject.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");

// ビルド設定の編集、第3引数は追加する設定、第4引数は削除する設定
pbxProject.UpdateBuildProperty(targetGuid, "OTHER_LDFLAGS", new string[]{"-ObjC"}, new string[]{"-weak_framework"});

■フレームワークの追加

// 必須フレームワークの追加
pbxProject.AddFrameworkToProject(targetGuid, "Security.framework", false);

// オプションフレームワークの追加
pbxProject.AddFrameworkToProject(targetGuid, "SafariServices.framework", true);

■コンパイルフラグの設定

// Keyboard.mmに-fno-objc-arcを設定する
var guid = pbxProject.FindFileGuidByProjectPath("Classes/UI/Keyboard.mm");
var flags = pbxProject.GetCompileFlagsForFile(targetGuid, guid);
flags.Add("-fno-objc-arc");
pbxProject.SetCompileFlagsForFile(targetGuid, guid, flags);

■Info.plistの追加

// Plistの設定のための初期化

var plistPath = Path.Combine (pathToBuiltProject, "Info.plist");

var plist = new PlistDocument ();

plist.ReadFromFile (plistPath);



// 文字列の設定

plist.root.SetString ("hogehogeId", "dummyid");



// URLスキーマの追加
var array = plist.root.CreateArray ("CFBundleURLTypes");

var urlDict = array.AddDict ();

urlDict.SetString ("CFBundleURLName", "hogehogeName");

var urlInnerArray = urlDict.CreateArray ("CFBundleURLSchemes");

urlInnerArray.AddString ("hogehogeValue");



// 設定を反映

plist.WriteToFile (plistPath);

■まとめ
Unity5になって設定が随分簡単になりました

■コード全文
gist.github.com