Включить iCloud в проекте Xcode с помощью script

Я пытаюсь настроить сервер сборки для непрерывного построения проекта iOS. С тех пор мне нужно очень часто воссоздавать проект Xcode (это сборка из единицы), iCloud будет reset отключен.

Я могу скопировать файл права доступа (с ключом iCloud) через script, но мне все равно нужно щелкнуть по фактическому флажку, чтобы включить iCloud.

Мне удалось вручную изменить проект XC, но он не очень безопасен из-за возможных изменений в структуре проекта XC.

Вы знаете лучший способ сделать это? Ура!

Ответ 1

По-видимому, ТО решила проблему, но поскольку в этом, похоже, больше людей, заинтересованных в этом, это возможное решение.

Вы можете сделать script для редактирования project.pbxproj, который находится внутри вашего файла xcodeproj (можно просмотреть, например, с опциями "показать содержимое пакета" в finder).

В этом файле есть раздел настроек проекта, называемый секцией PBXProject. Там вы можете добавить возможности для целей. Вам, вероятно, нужно написать собственную логику синтаксического анализа, так как этот файл написан в конфигурационный формат XCode, ничего такого популярного, как XML или JSON.

Часть, которую вы хотите обновить, выглядит следующим образом:

/* Begin PBXProject section */
        EB1DDE9C1A3334EC00D778DE /* Project object */ = {
            isa = PBXProject;
            attributes = {
                LastSwiftUpdateCheck = 0700;
                LastUpgradeCheck = 0610;
                /* ...more settings */                        
                TargetAttributes = {
                    EB1DDEA31A3334EC00D778DE = {/* this is one target */
                        CreatedOnToolsVersion = 6.1.1;
                        DevelopmentTeam = 37QAPDY2PR;
                        /* ...more settings */                        
                    };
                    EB9F6CE11A8812550038355B = {/* another possible target */
                        CreatedOnToolsVersion = 6.2;
                        DevelopmentTeam = 37QAPDY2PR;
                        /* ...more settings */                        
                     };

                };
            };
            /* ...more settings */                        

        };
/* End PBXProject section */

Вы хотите добавить возможности iCloud в целевые объекты. Это выглядит так:

SystemCapabilities = {
    com.apple.iCloud = {
    enabled = 1;
    };
};

Итак, скажем, вы хотите добавить возможности iCloud к целевому EB1DDEA31A3334EC00D778DE, тогда записи TargetAttributes будут выглядеть следующим образом:

TargetAttributes = {
    EB1DDEA31A3334EC00D778DE = {/* this is one target */
        CreatedOnToolsVersion = 6.1.1;
        DevelopmentTeam = 37QAPDY2PR;
        SystemCapabilities = {
            com.apple.iCloud = {
                enabled = 1;
            };
        };
    };
    EB9F6CE11A8812550038355B = {/* another possible target */
        CreatedOnToolsVersion = 6.2;
        DevelopmentTeam = 37QAPDY2PR;
        /* ...more settings */
    };
};

Теперь вам нужно определить некоторые вещи, чтобы сделать это:

1. Определите раздел

Я сделаю script искать строку "Начать раздел PBXProject", а затем "TargetAttributes", оба из которых уникальны в файле. Теоретически "TargetAttributes" должно быть достаточно, но лучше быть в безопасности... и не забудьте добавить правильное ведение журнала в script и проверить результаты, потому что эти строки могут легко измениться в будущих версиях XCode (я видел их неизменными, в то время уже).

2. Определите цель

В этом файле есть несколько частей, где вы можете увидеть идентификатор объекта, связанного с именем. Я бы просто посмотрел на это сам и скопировал его в script, так как этот идентификатор не изменится, если вы не воссоздаете цель. Если вам это действительно нужно, вы также можете автоматизировать это... путем поиска вашего целевого имени и формата, в котором он отображается, связанного с идентификатором. Должны быть также другие файлы конфигурации, где эта ассоциация появляется (в этом файле имя просто отображается как комментарий).

3. Обратите внимание на то, что для цели уже есть запись SystemCapabilities, а также что уже есть запись iCloud.

Если у вашей цели есть другие возможности, эта запись может уже существовать. Кроме того, если у вас уже включен iCloud или если вы включили iCloud и отключили его, запись также будет существовать (с значением 0). Это должно быть обработано в script (последнее не должно быть проблемой, если файл проекта является новым, хотя).

Кроме того, вам также, вероятно, придется добавить ссылку на файл с правами. Вы должны добавить это в конфигурацию сборки соответствующих целей. Для этого:

4. Найти идентификатор конфигурации сборки

У вашей цели, вероятно, есть несколько конфигураций сборки, например. отладки и выпуска. Вы должны найти идентификатор конфигурации (ов) сборки, для которой вы хотите добавить ссылку на файл прав. Для этого вам понадобится раздел XCConfigurationList (найдите/* Начало раздела XCConfigurationList */). Посмотрите на идентификатор цели, который мы получили в 1. Затем найдите идентификаторы конфигурации для необходимых конфигураций.

5. Найдите идентификатор конфигурации сборки в разделе XCBuildConfiguration

Перейдите в /* Начните раздел XCBuildConfiguration */и ищите идентификаторы, найденные в 5., затем добавьте путь к правам на buildSettings. Например:

например. у вас есть что-то вроде

EB9F6CF33A861055BB38355B /* Debug */ = {
    isa = XCBuildConfiguration;
    baseConfigurationReference = B82B36921BDRI3622B0EC99 /* Pods-mytargetname.debug.xcconfig */;
    buildSettings = {
        /* build settings... */
        CODE_SIGN_ENTITLEMENTS = mytargetname/myentitlements.entitlements; /* <-- add this */
    };
    name = Debug;
};

Обратите внимание, что XCode должен "знать" файл прав (как и остальные файлы вашего проекта).