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をインポート
解凍してLobi-master/Unity/Lobi.unitypackageをUnityのプロジェクトにインポートする
ここまではAndroidと同じ手順
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」以下にドラッグアンドドロップ
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」を設定する
Lobiの設定
Lobiの設定(クライアントID、ベース名)を行います
「Assets/Plugins/Lobi/Resources/LobiSetting」を選択
・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を使うと)と
こういうケースも増えるだろうし理解度を深めて綺麗に整理できるようにならないとなあ。