all green

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

Unity iOSでLobiランキングの導入(Unity 5.3.2p2)

Lobi RankingをUnityで作成したiOSアプリに導入したときの手順メモ
(※Lobi Rec、Lobi Chatは使用しない)




・環境
Unity 5.3.2p2
Lobi v6.4.7
広告用プラグインがいくつか

OS X 10.10.5
XCode7.2.1

以下手順


Lobi Developer アカウント登録、アプリケーション登録が終わっていること。

1.Lobi.unitypackageをインポート

https://github.com/kayac/Lobi

解凍してLobi-master/Unity/Lobi.unitypackageをUnityのプロジェクトにインポートする

ここまではAndroidと同じ手順

uwanosora22.hatenablog.com

2.XCode用の自動設定

XCode上で設定変更、操作が必要がないようにする

bundle、framworkが自動で追加されるようにする

Lobi.unitypackageをインポート済みのUnityプロジェクトをMac上で開く

※以下すべてMac上での操作

解凍してできた「Lobi-master\iOS\LobiSDK」にあるbundle、framworkをインポートする

↓追加するもの

LobiCore.bundle
LobiCore.framework
LobiRanking.bundle
LobiRanking.framework

Unityプロジェクトの「Assets/Plugins/iOS」以下にドラッグアンドドロップ

f:id:uwanosora22:20160220115538p:plain

Comple Flagsに「-fno-objc-arc」を設定する
Assets/Plugins/iOS/LobiCoreAPIBridge.m
Assets/Plugins/iOS/LobiCoreAPICommon.m
Assets/Plugins/iOS/LobiCoreBridge.m
Assets/Plugins/iOS/LobiRankingAPIBridge.m
Assets/Plugins/iOS/LobiRankingBridge.m
Assets/Plugins/iOS/LobiUnityAppController.mm

上記ファイルのComple Flagsに「-fno-objc-arc」を設定する

f:id:uwanosora22:20160220120238j:plain

Lobiの設定

Lobiの設定(クライアントID、ベース名)を行います

「Assets/Plugins/Lobi/Resources/LobiSetting」を選択

f:id:uwanosora22:20160220120631j:plain

・ClientID、BaseNameを入力する
iOS Enableにチェック
⇒RankingのみON状態

3.ビルド

Unity上でビルド

ビルドしてみるとPostProcess周りで問題発生

XCodeのプロジェクトがパースできないってことなんだろうか。
追加しただけなんだけどな・・・。


発生時のPostProcessの順番は

1.LobiPostProcessor.OnPostProcessBuild(order 100)
(Asset同梱の処理でXCodeのプロジェクト設定を行う)
2.自前のPostProcess(order 1500)
(UnityEditor.iOS.PBXProjectを使用してXCodeのプロジェクト設定を行う)

Exceptionの内容

「Invalid PBX project (parsing line 99)」


発生した個所は

string projectPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(path);
UnityEditor.iOS.Xcode.PBXProject pbxProject = new UnityEditor.iOS.Xcode.PBXProject();

pbxProject.ReadFromString(File.ReadAllText(projectPath));
⇒ここでExeption
string target = pbxProject.TargetGuidByName("Unity-iPhone");


試しにPostProcessの処理順を入れ替えてみる

1.自前のPostProcess(order 99)
2.LobiPostProcessor.OnPostProcessBuild(order 100)

上記順番に変更してビルドするとエラーもなくXCodeのprojectが作成されるが
「Unity-iPhone.xcodeproj」を開く際にパースできないとエラーが表示され開けない。
まあそりゃそうか。

Lobi Ranking追加前の環境では問題が無いし
まっさらな状態にLobi Rankingのみ追加の最小構成でも問題なかったんだけどな・・・。
(Lobiのみの最小構成でiOS上でランキングの確認はできた)


Unityのバージョンやその他環境等もろもろLobi側推奨の環境とは違うため
LobiPostProcessor側での処理を外す方向で対応してみる。

Lobi側でXCodeのプロジェクト設定を行っている個所をコメントアウト

LobiPostProcessor.cs

	private static void PostProcessBuild_iOS (string path, LobiSettings settings)
	{
		// ObjC ファイルを書き換える
		ReWriteObjCFiles (path, settings);

		// XCode プロジェクトファイルの設定をする
		//CreateModFile (path, settings);
		//ProcessXCodeProject (path);

		// Info.plist ファイルを書き換える
		ReWriteInfoPList (path, settings.clientId);
	}


自前のPostProcess(UnityEditor.iOS.Xcode.PBXProjectを使用)で
同様の処理を行うことに。

追加したコード

string projectPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(path);
UnityEditor.iOS.Xcode.PBXProject pbxProject = new UnityEditor.iOS.Xcode.PBXProject();
string target = pbxProject.TargetGuidByName("Unity-iPhone");

↓追加
pbxProject.AddFrameworkToProject(target, "libsqlite3.0.dylib", false);
pbxProject.AddFrameworkToProject(target, "OpenGLES.framework", false);
pbxProject.AddFrameworkToProject(target, "QuartzCore.framework", false);
pbxProject.AddFrameworkToProject(target, "MediaPlayer.framework", false);
pbxProject.AddFrameworkToProject(target, "MessageUI.framework", false);
pbxProject.AddFrameworkToProject(target, "CoreData.framework", false);
pbxProject.AddFrameworkToProject(target, "CoreMedia.framework", false);
pbxProject.AddFrameworkToProject(target, "Security.framework", false);
pbxProject.AddFrameworkToProject(target, "CoreImage.framework", true);
pbxProject.AddFrameworkToProject(target, "StoreKit.framework", true);
pbxProject.AddFrameworkToProject(target, "AVFoundation.framework", true);
pbxProject.AddFrameworkToProject(target, "Foundation.framework", true);
pbxProject.AddFrameworkToProject(target, "AudioToolbox.framework", true);
pbxProject.AddFrameworkToProject(target, "AssetsLibrary.framework", true);
pbxProject.AddFrameworkToProject(target, "UIKit.framework", true);

pbxProject.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");
↑追加
その他XCodeでのエラー対応

「Enable Bitcode」を「No」にする

PostProccessで設定する例

	string projectPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(path);
	UnityEditor.iOS.Xcode.PBXProject pbxProject = new UnityEditor.iOS.Xcode.PBXProject();
	string target = pbxProject.TargetGuidByName("Unity-iPhone");
	pbxProject.AddBuildProperty(target, "ENABLE_BITCODE", "NO");


以上の対応でXCode上でもビルドが通るようになった。

が、しかしiPhoneでアプリを実行してみると起動時に落ちる・・・・。

落ちている個所的にUnityAppController関係の問題で以下の対応を行った。

・Objective CのソースでUnityAppControllerを継承しているものが二つにあったので
LobiUnityAppController側に処理を移植
・元のソースは削除

UnityAppControllerの仕様、Objective Cは全然知識がないので今イチ・・・
ネイティブの機能を使うことになる(そういうプラグイン、Assetを使うと)と
こういうケースも増えるだろうし理解度を深めて綺麗に整理できるようにならないとなあ。