Unity - XCodeビルド後の設定と、アプリ名ローカライズ自動化


# 環境
* Unity 5.3.2f1
 * Unity 5.3.2p1
 * Unity 5.3.2p2
* XCode 7.3.1
* Mac El Capitan 10.11.5 
* Unity初心者

# 前置き
既出の情報ばかりですが、個人的な備忘録も兼ねて載せておきます。
Unity 5.3.2のバグについても多少触れておりますので、皆様のご参考になれば幸いです。

# Framework
   
UnityからXCodeプロジェクト出力後、[ Build Settings ]や[ Framework ]の追加・・・面倒ですよね。大抵、XCodeのフレームワークを利用する場合、[CocoaPods](https://cocoapods.org)を利用していますが、Unity Cloud Buildとの連携が出来ませんでしたので、今回は別の方法を取りました。
（どなたか方法ご存知でしたら、、、）
Unity 5からはframeworkの導入が改善されたようで、``Assets/Plugin/iOS/``配下などに``*.framework``を置くだけでXCode向けビルド出力時に、XCodeプロジェクトのFrameworkに追加されます。  
例) UnityAdsを追加した場合
  ![スクリーンショット 2016-05-26 17.24.22.png](https://qiita-image-store.s3.amazonaws.com/0/79788/cae06931-bc07-e6f0-2181-c5bd2cc3ddc9.png "スクリーンショット 2016-05-26 17.24.22.png")

# Build Settings

次にXCodeの[ BuildSettings ]です。
これだけであれば、標準の``UnityEditor.iOS.Xcode.PBXProject``を利用するだけで実現できました。ただし、私の環境では``UnityEditor.iOS.Xcode``のnamespaceが見つからない現象に陥りました。

結果的に[Unity 5.3.2p1のパッチが必要](https://issuetracker.unity3d.com/issues/ios-monodevelop-unityeditor-dot-ios-dot-xcode-namespace-isnt-recognised-in-monodevelop)との事だったため、[こちら](http://unity3d.com/jp/unity/qa/patch-releases)からパッチを当てて解決しました・・・:sob:がっ!!
今度は、XCodeからビルドしたプロジェクトがスプラッシュから先に進まない（フリーズ）する不具合に直面しました。[Unity 5.3.2p2](https://unity3d.com/jp/unity/qa/patch-releases/5.3.2p2)のリリースノートを ~~google翻y・・~~ 見てみると、[730441](http://issuetracker.unity3d.com/issues/unity-hangs-when-selecting-objects-in-the-scene-view)にどうやら該当するバグがあったため、[Unity 5.3.2p2](https://unity3d.com/jp/unity/qa/patch-releases/5.3.2p2)のパッチをあてまして、この現象は解決しました。

脱線してしまいましたが、ようやく本題に戻ります、コードで説明します。
以下のファイルを``Assets/Editor/``配下に作成します。クラス名は任意です。
``OnPostprocessBuild()``は、XCodeビルド直後に呼ばれるイベントです。

``` XCodeSetting.cs
using UnityEngine;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

/// <summary>
/// XCodeビルド出力後に呼び出されるメソッド
/// XCode側で別途設定が必要な場合は、こちらで対応
/// </summary>
public class XCodeSetting
{
	[PostProcessBuild]
	public static void OnPostprocessBuild (BuildTarget buildTarget, string path)
	{
		// iOS以外は未処理
		if (buildTarget != BuildTarget.iOS) {
			return;
		}

		// プロジェクトファイル
		string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
		// 後々XCodeEditor-for-Unity利用するためフルパス
		UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject ();
		proj.ReadFromFile (projPath);
		
		string target = proj.TargetGuidByName ("Unity-iPhone");

		// BuildSettings
		// ENABLE_BITCODE OFF
		proj.SetBuildProperty (target, "ENABLE_BITCODE", "NO");

		// 設定を保存
		File.WriteAllText (projPath, proj.WriteToString ());

	}
```

ここで``proj.SetBuildProperty()``の第２引数で指定する名前は、XCode上で確認できます。
![スクリーンショット 2016-05-26 17.49.37.png](https://qiita-image-store.s3.amazonaws.com/0/79788/cb6d5fe3-d52b-ed99-5c36-f0f2d42469fe.png "スクリーンショット 2016-05-26 17.49.37.png")

# アプリ名（アプリアイコンの下に表示される名前）のローカライズ（完全自動化については継続調査中！！）
* 使うもの
  * [XCodeEditor-for-Unity(monry)](https://github.com/monry/XCodeEditor-for-Unity) 
  * [MiniJSON](https://gist.github.com/darktable/1411710)
  * 少しのやる気
* 注意
  * [XCodeEditor-for-Unity(dcariola)](https://github.com/dcariola/XCodeEditor-for-Unity)  
  こちらのプラグインは、「Variant Group」に対応していないため今回の対応はそもそもできないとの結論に至っています。

* 手順
上記プラグインを落として、``Assets/Editor``配下におき、
後は、[こちら](http://qiita.com/monry/items/6f6507e7271caa3af42d)の方のコードを参考にして実装してみましたが、<font color="red">私の環境では出来ませんでした</font>。
 * どうやっても``PBXVariantGroup``セクションの追加がされず、XCode上でもローカライズ対象のファイルとして認識されませんでした。個々の単なるファイルにしかならないのです。リンク先の記事は2年も前なので、もしかするとXCodeのバージョンアップで出来なくなったのかなと思っています。
* 暫定対応
 * 上記のことから、現時点では自動化に至っておりませんので、暫定的に以下にて対応しています

``` XCodeSetting.cs
	public static void OnPostprocessBuild (BuildTarget buildTarget, string path)
	{

〜　略　〜

		string plistFile = "InfoPlist.strings";
		
		// XCodeプロジェクトルートへ実体生成
		StreamWriter w = new StreamWriter (Path.Combine (path, plistFile), false);
		w.WriteLine (string.Format ("CFBundleDisplayName = \"{0}\";", "hogehoge"));
		w.WriteLine (string.Format ("//CFBundleDisplayName = \"{0}\";", "ほげほげ"));
		w.Close ();
		
		//// 参照追加（XCodeプロジェクト上で見れるようにする）
		pbxproj.AddFileToBuild (target, pbxproj.AddFile (Path.Combine (path, plistFile), plistFile, PBXSourceTree.Source));

		// 設定保存
		File.WriteAllText (projPath, pbxproj.WriteToString ());
```
 * XCodeプロジェクトを開くと、プロジェクト直下に``InfoPlist.strings``ファイルが出来るので、``InfoPlist.strings``を選択し、``Localize...``を押します。
![スクリーンショット 2016-06-01 19.36.52.png](https://qiita-image-store.s3.amazonaws.com/0/79788/06d23c5f-de5d-38cc-d296-6fecfadc406e.png "スクリーンショット 2016-06-01 19.36.52.png")
 * 次のウィンドウは、そのまま``Localize``を押します
![スクリーンショット 2016-06-01 19.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/79788/afbe155d-060d-8217-9870-ee5df00f0c8f.png "スクリーンショット 2016-06-01 19.40.09.png")

 * これでローカライズ向けにファイルが変換されるため、日本語のローカライズを追加し、``CFBundleDisplayName``（日本向けのアプリ名）を日本語に変更します。
![スクリーンショット 2016-06-01 19.42.05.png](https://qiita-image-store.s3.amazonaws.com/0/79788/9f16e2cb-21df-c11a-e734-2ac90c7aca9b.png "スクリーンショット 2016-06-01 19.42.05.png")
 * 完全自動化とまではいきませんでしたが、現状はここまでが精一杯でした・・・:mask: :droplet: 


# 参考
* http://qiita.com/dancingpandor/items/cc497adb9f930d42ffd3
* http://qiita.com/monry/items/6f6507e7271caa3af42d
* Unity 5.3.2 のバグ関連
 * https://issuetracker.unity3d.com/issues/ios-monodevelop-unityeditor-dot-ios-dot-xcode-namespace-isnt-recognised-in-monodevelop
 * https://issuetracker.unity3d.com/issues/unity-hangs-when-selecting-objects-in-the-scene-view


いやぁ〜、Qiitaって本当に良いものですね、さよなら、さよなら