アプリ起動時

    public void Start()
    {
#if UNITY_IOS
        // iOS ATT 対応
        var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
        switch (status)
        {
            case ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED:
                // ATT 許可依頼ダイアログを表示
                ATTrackingStatusBinding.RequestAuthorizationTracking();
                break;

            case ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED:
                //TODO: トラッキングが許可された場合の処理
                break;

            case ATTrackingStatusBinding.AuthorizationTrackingStatus.DENIED:
            case ATTrackingStatusBinding.AuthorizationTrackingStatus.RESTRICTED:
                //TODO: トラッキングが不許可・制限された場合の処理
                break;
        }
#endif

    }

そんでもっとビルド時

#if UNITY_IOS
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor.iOS.Xcode.Extensions;

public class ATTLocalizationPostProcess
{
    [PostProcessBuild(999)]
    public static void OnPostProcessBuild(BuildTarget target, string pathToBuildProject)
    {
        if (target != BuildTarget.iOS)
            return;

        string projPath = PBXProject.GetPBXProjectPath(pathToBuildProject);
        var proj = new PBXProject();
        proj.ReadFromFile(projPath);

        string targetGUID = proj.GetUnityMainTargetGuid();

        var translations = new Dictionary<string, string>
        {
            { "en", "This identifier will be used to deliver personalized ads to you." },
            { "ja", "この識別子は、パーソナライズされた広告を配信するために使用されます。" },
            { "id", "Pengenal ini akan digunakan untuk menayangkan iklan yang dipersonalisasi kepada Anda." },
            { "fr", "Cet identifiant sera utilisé pour vous fournir des publicités personnalisées." },
            { "es", "Este identificador se utilizará para ofrecerte anuncios personalizados." },
            { "it", "Questo identificatore verrà utilizzato per fornirti annunci personalizzati." },
            { "de", "Diese Kennung wird verwendet, um dir personalisierte Werbung zu liefern." },
            { "ko", "이 식별자는 맞춤형 광고를 제공하는 데 사용됩니다." },
            { "ar", "سيتم استخدام هذا المعرّف لتقديم إعلانات مخصصة لك." },
            { "af", "Hierdie identifiseerder sal gebruik word om persoonlike advertensies aan jou te lewer." },
            { "uk", "Цей ідентифікатор буде використовуватися для показу персоналізованої реклами." },
            { "eu", "Identifikatzaile hau iragarki pertsonalizatuak eskaintzeko erabiliko da." },
            { "bg", "Този идентификатор ще се използва за предоставяне на персонализирани реклами." },
            { "ca", "Aquest identificador s'utilitzarà per oferir anuncis personalitzats." },
            { "cs", "Tento identifikátor bude použit k doručení personalizovaných reklam." },
            { "pt", "Este identificador será usado para entregar anúncios personalizados para você." },
            { "da", "Denne identifikator vil blive brugt til at levere personlige annoncer til dig." },
            { "nl", "Deze id wordt gebruikt om gepersonaliseerde advertenties aan je te leveren." },
            { "et", "See identifikaatorit kasutatakse isikupärastatud reklaamide edastamiseks teile." },
        };

        foreach (var kv in translations)
        {
            string lang = kv.Key;
            string text = kv.Value;

            // パス生成
            string relFolderPath = $"{lang}.lproj";
            string relFilePath = Path.Combine(relFolderPath, "InfoPlist.strings");
            string absFolderPath = Path.Combine(pathToBuildProject, relFolderPath);
            string absFilePath = Path.Combine(absFolderPath, "InfoPlist.strings");

            // 書き込み
            Directory.CreateDirectory(absFolderPath);
            File.WriteAllText(absFilePath, $"\"NSUserTrackingUsageDescription\" = \"{text}\";\n");

            // Xcodeに登録
            string fileGuid = proj.AddFile(relFilePath, relFilePath, PBXSourceTree.Source);
            proj.AddFileToBuild(targetGUID, fileGuid); // ← これだけでOKな場合が多い

            Debug.Log($"✅ Added localization: {relFilePath}");
        }

        proj.WriteToFile(projPath);
        Debug.Log("✅ ATTローカライズ書き出し完了!");
    }
}
#endif

info.plist 追加

#if UNITY_IOS
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

public class PlistModifier
{
    [PostProcessBuild(888)]
    public static void OnPostProcessBuild(BuildTarget target, string pathToBuildProject)
    {
        if (target != BuildTarget.iOS) return;

        string plistPath = Path.Combine(pathToBuildProject, "Info.plist");
        var plist = new PlistDocument();
        plist.ReadFromFile(plistPath);

        PlistElementDict rootDict = plist.root;

        rootDict.SetString("NSUserTrackingUsageDescription", "This identifier will be used to deliver personalized ads to you.");

        plist.WriteToFile(plistPath);
    }
}
#endif

スクリプトでは追加できなかった、xx.lproj をドラッグアンドドロップでXcodeのプロジェクトに追加

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

© 2025 Falco Tech Blog Suffusion theme by Sayontan Sinha