all green

プログラム、アプリ作成、Web等備忘録が中心です

UnityのiOS版ビルドでframeworkファイルのインポートを自動化する(Ad Generation)

iOS版のビルドを行う際にXCode上での操作を無くしたいと思い自動化を試してみた。
その時の検証というか作業メモ。



・環境
Unity 5.2.2
XCode 7.1.1

Ad Generationを使用して確認
(たまたま使おうとしていたので)

Ad Generation
iOSSDK 2.2.3
UnityPlugin 2.0.0

自動設定なし

まずは自動設定なしでのビルド

1.Unityプロジェクトを作成する

まっさらな状態

2.Unityプロジェクトにunitypackageをインポート

adg_for_unity.unitypackageをインポートする

ADGNI.mmのComplie Flagsに「-fno-objc-arc」を設定する
f:id:uwanosora22:20151119050425j:plain

3.ビルドしてXCodeのプロジェクトを生成

この状態のプロジェクト

f:id:uwanosora22:20151119045723j:plain

当然このままビルドしてもエラーとなります

4.XCodeのプロジェクトにframeworkファイルを追加

「ADG.framework」をXCodeプロジェクト内の「Frameworks」フォルダに追加

追加したADG.frameworkをLinked Frameworks and Librariesにドラッグアンドドロップで追加する

以下frameworkを追加する

framework Status
AdSupport.framework Optional
CoreTelephony.framework Required
Security.framework Required

「Linked Frameworks and Libraries」の下の方にある「+」から追加

導入ガイドには以下も必要なものと記載されているが最初から追加されている
・SystemConfiguration.framework
・QuartzCore.framework
・CoreGraphics.framework
・MediaPlayer.framework

UnityPlugin導入ガイド · AdGeneration/sdk Wiki · GitHub

5.XCodeでビルドする

成功

自動化の検証

UnityプロジェクトにADG.frameworkをインポート

1.Unityプロジェクトにframeworkを追加

「Assets/plugins/iOS/」に「ADG.framework」を追加してビルドしてみる。

XCodeでプロジェクトを開くと「Frameworks/Assets/plugins/iOS/」にADG.frameworkが追加されている。
Linked Frameworks and Librariesにも追加されている。

f:id:uwanosora22:20151119051716j:plain

2.自動設定なしと同様に以下frameworkを追加

・AdSupport.framework
・CoreTelephony.framework
・Security.framework

3.XCodeでビルドする

成功

Unityでframeworkの設定を変更

1.Unityでframeworkの設定を変更する

「Assets/plugins/iOS/ADG.framework」を選択
Inspecterから必要なframeworkにチェックを入れる
・AdSupport.framework
・CoreTelephony.framework
・Security.framework

f:id:uwanosora22:20151119052114j:plain

2.Unityでビルド

ビルドしてできたXCodeプロジェクトの状態
f:id:uwanosora22:20151119052640j:plain

Unity上でStatusの変更はできないぽい?

PostProcessBuildで設定する

Statusの変更ができないのでPostProcessBuildで設定をすることに

1.「Unityでframeworkの設定を変更する」で行った設定を元に戻す

チェックを外す

2.PostProcessBuildのコードを追加

Assets/Editor/にソースを追加

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

public static class PostProccesor
{
	[PostProcessBuild(100)]
	public static void OnPostProcessBuild(BuildTarget target, string path)
	{
		if (target == BuildTarget.iOS)
		{
			PostProcessBuild_iOS (path);
		}
	}

	private static void PostProcessBuild_iOS (string path)
	{
		string projectPath = PBXProject.GetPBXProjectPath(path);
		PBXProject pbxProject = new PBXProject();
		
		pbxProject.ReadFromString(File.ReadAllText(projectPath));
		string target = pbxProject.TargetGuidByName("Unity-iPhone");
		
		pbxProject.AddFrameworkToProject(target, "AdSupport.framework", true);
		pbxProject.AddFrameworkToProject(target, "CoreTelephony.framework", false);
		pbxProject.AddFrameworkToProject(target, "Security.framework", false);
	
		File.WriteAllText(projectPath, pbxProject.WriteToString());
	}
}
3.Unityでビルド

自動設定なしと同じ状態のXCodeプロジェクトが生成される

4.XCodeでビルドする

成功

Unity上の設定で「Optional/Required」の切替が行えたらもっと楽なんだけどな・・・。
とりあえず現状はPostProcessBuildとの組み合わせで良いか。
Jenkinsでジョブ実行とかでまた問題起きるんだろうなぁ・・・。