Unity to iOS, info.plist перезаписывается после PostProcessBuild - PullRequest
2 голосов
/ 06 марта 2019

Фон:

  1. Использование Unity 2018.3.5f1 для сборки проекта iOS
  2. Использование атрибута PostProcessBuild для изменения info.plist
  3. Код работал в другом проекте вUnity 2018.2.1f1

Мне кажется, я делаю то, что предлагается в этой статье: От Unity до iOS, как идеально автоматизировать фреймворки, настройки и списки?

Я подтвердил, что вызвана функция PostBuildProcess и изменен список info.plist.Я регистрирую вывод, и он кажется правильным.Я также сохранил 2-й файл в своем коде (info2.plist), и он содержит все ожидаемые изменения.Однако исходный файл (info.plist) перезаписывается другими значениями.

Кажется, что Unity перезаписывает файл info.plist после запуска функций PostProcessBuild.

Код находится в папке / Assets / Editor в проекте Unity.

Вот одна из моих функций:

[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());
    }
}

1 Ответ

4 голосов
/ 07 марта 2019

Спасибо @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)] - мой

...