🐛

Xcode 15でUnityが動かない

2023/10/03に公開

ついiOS17の新機能を試してみたくて、アップデートしたところ、正式リリースのXcode 15.0 (15A240d)環境でのUnity iOSのビルドにがっつり嵌ったのでメモ。

ハマりどころは2箇所。

そもそもXcodeのビルドが通らない

UnityのLTSを使っている場合は最新版へアップグレードして治りました。

https://issuetracker.unity3d.com/issues/building-projects-with-il2cpp-scripting-backend-for-apple-platforms-fails-with-xcode-15-dot-0b6-or-newer

起動時にEXC_BAD_ACCESS

アプリ起動時にEXC_BAD_ACCESSで落ちます。

EXC_BAD_ACCESS

これは空のプロジェクトでは再現しないので、なにかライブラリの依存があるときに起こるようです。私の場合は、ARCore Extensions パッケージを入れると発生しました。

原因が全然分からず、Xcode14なら問題ないものの、最新のiOSでも動かしたので困っていたら、Other Linker Flagに-ld_classicを入れると動くとの情報を確認。

-ld_classic

https://forum.unity.com/threads/project-wont-build-using-xode15-release-candidate.1491761/#post-9311468

Unityのビルド時に自動化するならこんな感じでしょうか↓

using UnityEditor.Build;
using UnityEditor.Build.Reporting;
#if UNITY_IOS
using UnityEditor.iOS.Xcode;
#endif // UNITY_IOS

public class CustomPostBuildProcessor : IPostprocessBuildWithReport
{
    public int callbackOrder { get { return 0; } }
    public void OnPostprocessBuild(BuildReport report)
    {
#if UNITY_IOS
        // Add -ld_classic to OTHER_LDFLAGS to avoid Xcode 15 build error
        // https://forum.unity.com/threads/project-wont-build-using-xode15-release-candidate.1491761/
        // https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Linking

        string projectPath = PBXProject.GetPBXProjectPath(report.summary.outputPath);

        PBXProject pbxProject = new();
        pbxProject.ReadFromFile(projectPath);

        string target = pbxProject.GetUnityFrameworkTargetGuid();

        pbxProject.AddBuildProperty(target, "OTHER_LDFLAGS", "-ld_classic");
        pbxProject.WriteToFile(projectPath);
#endif // UNITY_IOS
    }
}

Xcode15のリリースノートを見るとKnown Issuesのところに、

Weak symbolがnon-weakでリンクされるからワークアラウンドとして、-ld_classicつけてね。(意訳)

みたいなことが書いてありました…。
Xcode15側の問題なので早めに修正されることを願います。

Discussion