背景:

  • 使用 Unity 2018.3.5f1 构建 iOS 项目
  • 使用 PostProcessBuild 属性更改 info.plist
  • 代码在 Unity 2018.2.1f1 中的不同项目中工作

  • 我相信我正在按照本文中的建议进行操作:From Unity to iOS, how to perfectly automate frameworks, settings and plist?

    我已经确认调用了 PostBuildProcess 函数并且更改了 info.plist。我记录了输出,它看起来是正确的。我还在我的代码 (info2.plist) 中保存了第二个文件,它包含我期望的所有更改。但是,原始文件 (info.plist) 被不同的值覆盖。

    在 PostProcessBuild 函数运行之后,Unity 似乎正在覆盖 info.plist 文件

    代码放置在 Unity 项目的/Assets/Editor 文件夹中。

    这是我的功能之一:
    [PostProcessBuild(1)]
    public static void ChangeXcodePlist(BuildTarget buildTarget, string pathToBuiltProject)
    {
        if (buildTarget == BuildTarget.iOS)
        {
            // Get plist file and read it.
            string plistPath = pathToBuiltProject + "/Info.plist";
            Debug.Log("In the ChangeXCodePlist, path is: " + plistPath);
            PlistDocument plist = new PlistDocument();
            plist.ReadFromString(File.ReadAllText(plistPath));
            Debug.Log("In the ChangeXCodePlist");
    
            // Get root
            PlistElementDict rootDict = plist.root;
    
            // Required when using camera for demos, e.g. AR demos.
            rootDict.SetString("NSCameraUsageDescription", "Uses the camera for Augmented Reality");
    
            // Required when using photo library in demo (i.e. reading library).
            rootDict.SetString("NSPhotoLibraryUsageDescription", "${PRODUCT_NAME} photo use");
    
            // Required when adding images to photo library in demos.
            rootDict.SetString("NSPhotoLibraryAddUsageDescription", "${PRODUCT_NAME} photo use");
    
            //ITSAppUsesNonExemptEncryption, this value is required for release in TestFlight.
            rootDict.SetBoolean("ITSAppUsesNonExemptEncryption", false);
    
            Debug.Log("PLIST: " + plist.WriteToString());
    
            // Write to file
            File.WriteAllText(plistPath, plist.WriteToString());
            File.WriteAllText(pathToBuiltProject + "/info2.plist", plist.WriteToString());
        }
    }
    

    最佳答案

    谢谢@dogiordano,这就是问题所在。一位同事向项目中添加了一个库,其中包含 PostProcessBuild 属性 ,没有像这样定义的调用顺序 :
    [PostProcessBuild]
    而我的 2 个回调指定了顺序:
    [PostProcessBuild(0)] [PostProcessBuild(1)]
    文档中没有任何内容描述在这种情况下会发生什么:
    https://docs.unity3d.com/ScriptReference/Callbacks.PostProcessBuildAttribute.html

    所以,我用 (1) 和 (2) 尝试了我的函数,看看未指定的顺序是否会占用 (0) 插槽,但它不会。像这样:
    [PostProcessBuild] - 其他库
    [PostProcessBuild(1)] - 我的
    [PostProcessBuild(2)] - 我的

    因此,如果您不指定回调顺序,那么在
    指定了顺序的函数之后,这些函数将被称为

    我为所有 3 个指定了回调顺序,它按预期工作。
    [PostProcessBuild(0)] - 其他库
    [PostProcessBuild(1)] - 我的
    [PostProcessBuild(2)] - 我的

    关于ios - Unity 到 iOS,PostProcessBuild 后 info.plist 被覆盖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55029079/

    10-10 03:24