Строки прав группы приложений для каждой конфигурации в Xcode?

Есть ли простой способ иметь строки прав группы приложений для каждой конфигурации в проектах Xcode?

Мы пытаемся поделиться настройками между приложением iOS и сегодняшним расширением, используя право «группа приложений» в обеих целях.

Проблема, с которой мы сталкиваемся, заключается в том, что мы создаем приложение с разными идентификаторами пакета и команды в зависимости от того, является ли это сборкой предприятия или выпуском.

Когда я использую экран возможностей Xcode 6, группы приложений отображаются красными буквами, и я не вижу способа изменить строки для каждой конфигурации по отдельности.

Я предполагаю, что одно из следующих будет работать, но я не знаю, что мне следует попробовать в первую очередь:

  1. файлы .xcconfig
  2. Созданные вручную файлы прав доступа
  3. Скрипт сборки
  4. Зависимые от конфигурации записи plist

Предложения?


person EricS    schedule 30.08.2014    source источник
comment
Переопределение CODE_SIGN_ENTITLEMENTS из файла .xcconfig теперь работает с Xcode 8.2.1. Это определенно не работало с 8.0 и, возможно, с 8.1 (не проверял), поэтому может быть так, что ошибка, упомянутая в некоторых ответах/комментариях, теперь исправлена.   -  person Nicholas H.    schedule 17.01.2017


Ответы (3)


Вы можете использовать разные файлы прав для каждой конфигурации. Это можно указать в пользовательском интерфейсе Xcode «Настройки сборки» или сделать с помощью файлов конфигурации сборки (.xcconfig).

Пример xcconfig:

CODE_SIGN_ENTITLEMENTS = Debug.entitlements

Где значение CODE_SIGN_ENTITLEMENTS указывает на правильный файл прав для этой конфигурации. Вы можете создать столько конфигураций, сколько хотите в Xcode. По умолчанию Xcode создает Debug и Release, вы можете добавить Enterprise и использовать файл конфигурации сборки, который указывает CODE_SIGN_ENTITLEMENTS на правильный файл прав для сборок Enterprise.

Пользовательский интерфейс Xcode «Возможности» создаст и будет управлять файлом прав, который назван в честь вашего продукта сборки. Вы можете редактировать этот файл напрямую, если хотите.

  1. Создайте файл конфигурации сборки XCConfig для каждой из ваших конфигураций сборки. В этом примере мы будем использовать только Debug и Release, легко добавить свои собственные конфигурации сборки, такие как Enterprise.
  2. Как описано выше, заполните файлы xcconfig соответствующими настройками CODE_SIGN_ENTITLEMENTS.
  3. В пользовательском интерфейсе проекта «Информация» установите конфигурацию сборки для использования соответствующего файла XCConfig:

введите здесь описание изображения

  1. Вы можете убедиться в этом, просмотрев настройку сборки Code Signing Entitlements для вашего продукта сборки. Вы должны увидеть что-то вроде этого:

введите здесь описание изображения

Если вы видите там полужирный текст, выделите этот параметр сборки и нажмите удалить. Это удалит параметр сборки Xcode, который переопределяет ваш параметр xcconfig.

person quellish    schedule 08.09.2014
comment
Кажется, это полностью нарушено в Xcode 8. Я пытался установить пользовательские файлы прав для каждой конфигурации сборки напрямую в настройках сборки и использовать отдельные файлы xcconfig. Xcode запоминает последнюю ожидаемую группу приложений и завершается сбоем последующих сборок, поскольку группа приложений профиля подготовки не совпадает. Я в тупике. - person Adam Swinden; 05.10.2016
comment
@AdamSwinden У меня такая же проблема! Это невероятно. Вы нашли обходной путь для этого? - person damirstuhec; 10.10.2016
comment
@damirstuhec Не совсем, к сожалению. Хотя я обнаружил, что после сбоя сборки, если вы удалите и сбросите настройки сборки пользовательских прав, Xcode перезагрузит ожидаемую группу приложений. Я обнаружил, что вы должны делать это каждый раз, когда вы меняете конфигурацию сборки. - person Adam Swinden; 12.10.2016
comment
@AdamSwinden здесь то же самое. :( - person Joseph Lin; 19.10.2016
comment
Как мы можем добавить несколько групп приложений в разные права? поскольку нет возможности выбрать AppGroup отдельно для схем/прав отладки и выпуска? - person W.S; 08.02.2017

Вы можете настроить это через «Настройки сборки». Так же, как и при настройке разных идентификаторов пакетов.

Шаги:

  1. Добавьте новую "Пользовательскую настройку" введите здесь описание изображения
  2. Укажите "APP_GROUP_ID" для каждой схемы/конфигурации введите здесь описание изображения
  3. Протестируйте его, создайте IPA для своего приложения и разархивируйте его.
  4. Проверьте .app, щелкните правой кнопкой мыши и выберите "Показать содержимое пакета".
  5. Найдите файл прав. (если вы не можете найти файл прав, найдите файл .xcent и измените расширение на .entitlements
  6. Убедитесь, что значение группы приложений в файле прав соответствует правильному идентификатору группы приложений, который вы указали на шаге 2.

Ваше здоровье!

person Mark Dominick Flores    schedule 01.06.2017
comment
Нет документально подтвержденной причины, почему это сработает. Это не то же самое, что Bundle ID, поскольку Bundle ID — это поле info.plist, которое по умолчанию заполняется из настроек сборки. Поля прав не являются. От Apple вообще нет документации о настройке сборки APP_GROUP_ID. Если это была недокументированная настройка сборки, то недокументированные настройки удаляются без уведомления. - person Mike Sand; 29.10.2019
comment
APP_GROUP_ID — это пользовательская настройка. Я просто называю свои определенные настройки с помощью _. Я очень уверен, что не будет документации по APP_GROUP_ID, так как он определен пользователем. Ваше здоровье! - person Mark Dominick Flores; 18.03.2020

Xcode 8, похоже, имеет ошибку, как указывают комментарии в этом вопросе.

Думаю, у меня есть очень грубый и опасный, но работающий обходной путь.

Идея состоит в том, чтобы иметь только 1 файл прав, который видит Xcode 8, и сценарий заменяет его правильным файлом для конфигурации, которую вы пытаетесь создать.

Этот обходной путь состоит из множества шагов, и не все из них могут быть необходимы. Я постараюсь обновить этот пост по мере получения дополнительной информации. Если вы осмелитесь протестировать что-то подобное, пожалуйста, добавьте комментарии.

Кроме того, старые профили подготовки, вероятно, необходимо удалить перед повторным открытием Xcode 8.

Удаление производных данных перед открытием Xcode 8 также помогает.

ПРЕДУПРЕЖДЕНИЕ! ПРОВЕРЬТЕ ЭТО НА СВОЙ РИСК. ЭТО МОЖЕТ НАНЕСТИ НЕПОВТОРИМЫЙ УЩЕРБ

  • удаляет все профили обеспечения
  • удаляет производные данные

НАСТРОЙКА ЭТОГО ХАКА

  • Сохраните этот скрипт ниже в папку вашего проекта.
  • Внесите исправления в название вашего проекта и целевые имена там, где оно читается как MyProject*.
  • патч в именах ваших конфигураций
  • Проверьте имена файлов прав конфигурации, которые этот сценарий пытается скопировать поверх MyProject.entitlements.
  • Настройте MyProject.entitlements как файл прав во всех конфигурациях.
  • Сделайте то же самое для всех целей (например, если у вас есть приложение watchkit)
  • Before running the script:
    • Choose the correct Scheme in Xcode
    • Закрыть Xcode

Шаблон скрипта:

    #!/bin/bash                                                                                                                                                                                                                       

    echo

    if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi

    if [ $# -ne 1 ];  then
        echo
        echo "ERROR: one of the following expected as parameter: release alpha debug"
        echo
        exit -2
    fi

    chosen=$1

    echo "You have chosen build configuration $chosen"
    echo
    echo "This script is a workaround for Xcode 8 bug in handling different build configs and app groups."
    echo "(This scenario is most likely not on Apples list of things that developers are expected to do.)"
    echo
    echo "See comments in this SO answer"
    echo "http://stackoverflow.com/a/25734318/1148030"
    echo
    echo "1) This script must be run with Xcode 8 shut down."
    echo "2) All old provisioning profiles will be deteled. Xcode 8 will recreate them with hopefully correct build config."
    echo
    echo
    echo "WARNING: This will delete ALL provisioning profiles for all apps!"
    echo "WARNING: This will delete ALL MyProject named DerivedData."
    echo

    read -n 1 -s -p "Press any key to continue or Ctrl-C to cancel"

    echo

    # NOTE ABOUT DELETING DERIVED DATA                                                                                                                                                                                                
    # Deleting derived data fixes 2 bugs:                                                                                                                                                                                             
    # 1) Xcode 8 stubbornly generating some distribution profiles for old entitlements files                                                                                                                                          
    # 2) Install from HockeyApp fails due to signing verification error                                                                                                                                                               

    echo "Deleting derived datas"
    rm -vrf /Users/pelam/Library/Developer/Xcode/DerivedData/MyProject-*
    echo

    echo "Deleting provisioning profiles"
    rm -v ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision

    echo

    echo "Replacing target entitlements files"
    echo
    cp -v "./MyProjectTarget/MyProjectTarget.$chosen.entitlements" "./MyProjectTarget/MyProjectTarget.entitlements" || exit -1
    cp -v "./MyProjectAnotherTarget/MyProjectAnotherTarget.$chosen.entitlements" "./MyProjectAnotherTarget/MyProjectAnotherTarget.entitlements" || exit -1
    echo ADD COPY COMMANDS FOR OTHER TARGETS HERE

    echo
    echo "SUCCESS! Now run Xcode and verify that correct profiles are created."
    echo
    echo "NOTE:"
    echo "Running following command after starting Xcode 8 and waiting a bit can show you what appgroup is selected in each profile."
    echo "There should only the one correct app group or the release group. No duplicates in one file or mixed."
    echo "If you are not using multiple app groups, you can view the provisioning profile files in text editor to see that they contain correct settings for the configuration you are trying to build"
    echo "grep -a appgroup ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision"
    echo
    echo
person Peter Lamberg    schedule 02.11.2016