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