コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Firebase と Xcode 15 を使用して iOS ビルドした時に iOS 12 でアプリが強制終了する不具合を対策するエディタ拡張

ソースコード

using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

namespace Kogane.Internal
{
    /// <summary>
    /// Xcode 15 でビルドできるようにするエディタ拡張
    /// Xcode の Build Settings の「Other Linker Flags」に「-ld_classic」を設定することでビルドできるようにする
    /// Xcode の Build Settings の「Other Linker Flags」に「-Wl」を設定することで iOS 12 で強制終了しないようにする
    ///
    /// 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
    /// > Known Issues
    /// > Binaries using symbols with a weak definition crash at runtime on iOS 14/macOS 12 or older.
    /// > This impacts primarily C++ projects due to their extensive use of weak symbols. (114813650) (FB13097713)
    /// >
    /// > Workaround: Bump the minimum deployment target to iOS 15, macOS 12, watchOS 8 or tvOS 15, or add -Wl,
    /// > -ld_classic to the OTHER_LDFLAGS build setting.
    /// </summary>
    internal static class FixXcode15BuildOnPostProcessBuild
    {
        //================================================================================
        // 関数(static)
        //================================================================================
        /// <summary>
        /// ビルド完了時に呼び出されます
        /// </summary>
        [PostProcessBuild( 1000 )] // この値を変えると動かなくなる可能性があるので注意
        private static void OnPostProcessBuild
        (
            BuildTarget buildTarget,
            string      pathToBuiltProject
        )
        {
            if ( buildTarget != BuildTarget.iOS ) return;

            var projectPaths = new[]
            {
                PBXProject.GetPBXProjectPath( pathToBuiltProject ),
                $"{pathToBuiltProject}/Pods/Pods.xcodeproj/project.pbxproj",
            };

            foreach ( var projectPath in projectPaths )
            {
                var project = new PBXProject();

                project.ReadFromFile( projectPath );

                var targetGuid = project.ProjectGuid();

                project.AddBuildProperty( targetGuid, "OTHER_LDFLAGS", "-Wl" );
                project.AddBuildProperty( targetGuid, "OTHER_LDFLAGS", "-ld_classic" );
                project.WriteToFile( projectPath );
            }
        }
    }
}

補足

Firebase を使用している Unity プロジェクトを Xcode 15 でビルドして
iOS 12 の iPhone や iPad で起動する時にアプリが強制終了してしまう場合、

「Unity-iPhone.xcodeproj」の PROJECT の「Unity-iPhone」の
「Build Settings」の「Other Linker Flags」に -Wl -ld_classic を設定して

「Pods.xcodeproj」の PROJECT の「Pods」の
「Build Settings」の「Other Linker Flags」に -Wl -ld_classic を設定することで
アプリが強制終了せずに正常に起動できるようになる

前述のエディタ拡張はこの設定を iOS ビルド時に自動で行う

開発環境

  • Unity 2022.1.23f1
  • Firebase 9.6.0
  • Xcode 15.0

関連記事