[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 でビルドする度に戻ってしまうので、都度設定しなおす必要があります。
面倒すぎるので、ポストビルドで自動的に設定されるようにしましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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());
}
}
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()); } }
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