Xcode
Unity

Unity4系→Unity5系へのバージョンアップ時にハマったことと解決策

■PlayerSettings.applicationIdentifierが反映されない

Jenkinsを使ってバッチモードでビルドする際にデバッグモードのみアプリIDを書き換えしていたが
Unityバージョンアップ後からIDの上書きがうまく行かなくなった

PlayerSettings.applicationIdentifier = "hogehoge";

だとアクティブなプラットフォームのIDしか書き換わらなかったため

PlayerSettings.SetApplicationIdentifier(BuildTarget.iOS, "hogehoge");

とすることで任意のプラットフォームのIDの書き換えが可能

■iOSでコードの重複エラー

プロジェクトではUnityが出力するClasses配下のコードを
Assets/Plugins/iOS/UI/Keyboard.mmのように配置して上書きを行っていたが
Unity5へバージョンアップ後から上書きされずビルド時にコード重複のエラーが発生していた

PostProcessBuildとPBXProject.RemoveFileFromBuild/RemoveFileを使って
Unityのビルド後にXcodeプロジェクトを編集することでコードの重複を回避

iOSPostBuildProcess.cs
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string buidlProjectPath) {
    if (buildTarget != BuildTarget.iOS) {
        return;
    }

    // Plugins配下のファイルをコピー
    var src = Path.Combine("Libraries/Plugin/iOS/UI/Keyboard.mm");
    var dest = Path.Combine("Classes/UI/Keyboard.mm");
    File.Copy(Path.Combind(buidlProjectPath, src), Path.Combine(buidlProjectPath, dest), true);

    // Xcodeのプロジェクトからコピーしたファイルを削除
    var projectPath = Path.Combine(buidlProjectPath, "Unity-iPhone.xcodeproj/project.pbxproj");
    var project = new PBXProject();
    project.ReadFromFile(projectPath);

    var targetGuid = project.TargetGuidByName("Unity-iPhone");
    var guid = project.FindFileGuidByProjectPath(src);
    project.RemoveFileFromBuild(targetGuid, guid);
    project.RemoveFile(guid);

    project.WriteToFile(projectPath);
}

■突然Unityがクラッシュする

C:\Users\ユーザ名\AppData\Local\Unity\Editor\Editor.log
Unityがクラッシュする直前のログを見て直前に何の処理をしていたかを確認する
今回の場合
・原因 AssetBundleが古い
・対策 Unity5.6.4f1でAssetBundleの再ビルド

========== OUTPUTING STACK TRACE ==================

0x00000001414D9351 (Unity) SerializedFile::ReadMetadata<0>
0x00000001414DC7CC (Unity) SerializedFile::ReadHeader
0x00000001414DEADF (Unity) SerializedFile::FinalizeInit
0x00000001414DEF49 (Unity) SerializedFile::InitializeRead
0x0000000141098280 (Unity) PersistentManager::LoadFileStream
0x00000001408C1012 (Unity) AssetBundleLoadFromAsyncOperation::TryToLoadAndInitializeAssetBundle
0x00000001408C1D0E (Unity) AssetBundleLoadFromAsyncOperation::IntegrateMainThread
0x0000000141036868 (Unity) PreloadManager::UpdatePreloadingSingleStep
0x0000000141036BAD (Unity) PreloadManager::UpdatePreloading
0x00000001414A3DCC (Unity) PlayerCleanupCachedData
0x0000000140D89530 (Unity) PlayerLoop
0x00000001417482BE (Unity) Application::UpdateScene
0x0000000141749A8F (Unity) Application::UpdateSceneIfNeeded
0x000000014175231A (Unity) Application::TickTimer
0x000000014181D96C (Unity) CrashCallback
0x000000014181F4F4 (Unity) WinMain
0x0000000141B05BCC (Unity) strnlen
0x00000000771959CD (kernel32) BaseThreadInitThunk
0x00000000773CA561 (ntdll) RtlUserThreadStart

========== END OF STACKTRACE ===========