[xcode]ENABLE_BITCODE(エラー)を解消する

Xcode13.3 ではなかったのに、14 から急に…という記事を結構見かけましたので対処法を残しておきます。
エラーとしてはこんな感じのメッセージです。

'/Users/XXXXXX/Library/Developer/Xcode/DerivedData/Unity-iPhone-XXXXXX/Build/Products/ReleaseForRunning-iphoneos/AppAuth/AppAuth.framework/AppAuth(OIDAuthorizationService.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. file '/Users/XXXXXX/Library/Developer/Xcode/DerivedData/Unity-iPhone-XXXXXX/Build/Products/ReleaseForRunning-iphoneos/AppAuth/AppAuth.framework/AppAuth' for architecture arm64

ターゲット環境設定を行う

エラーログに書かれている通り、ENABLE_BITCODE の設定で対処します。

プロジェクトを選択し、TARGETS の全てについて Build Settings の Enable Bitcode を No にします。

画面の例だと Unity-iPhone, UnityFramework が Yes だったので No にします。
また、Pods の方も行う必要があります。
PROJECT を変更しても動作しません。必ず TARGETS を変更するようにしてください。

ビルドする度に設定するのが面倒な場合

この設定は unity でビルドする度に戻ってしまうので、都度設定しなおす必要があります。
面倒すぎるので、ポストビルドで自動的に設定されるようにしましょう。

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

public class OnPostBuildProcess : MonoBehaviour
{
    [PostProcessBuild]
    public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
    {
        if (buildTarget == BuildTarget.iOS)
        {
            processForiOS(path);
        }
    }

    static void processForiOS(string path)
    {
        string     pbxPath = PBXProject.GetPBXProjectPath(path);
        PBXProject pbx     = new PBXProject();

        pbx.ReadFromString(File.ReadAllText(pbxPath));

        string target = pbx.GetUnityMainTargetGuid();
        pbx.SetBuildProperty(target, "ENABLE_BITCODE", "NO");

        target = pbx.GetUnityFrameworkTargetGuid();
        pbx.SetBuildProperty(target, "ENABLE_BITCODE", "NO");

        File.WriteAllText (pbxPath, pbx.WriteToString());
    }
}

unity2019 以降ならこれで動作するはず。
GetUnityMainTargetGuid() が存在しないような古い unity の場合、pbx.TargetGuidByName("Unity-iPhone"); とかに置き換えればいけるかも。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA