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

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

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

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

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

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

  • .xcconfig файлы
  • Созданные вручную файлы прав
  • Сборка script
  • Конфигурационные записи plist

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

Ответ 1

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

Пример xcconfig:

CODE_SIGN_ENTITLEMENTS = Debug.entitlements

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

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

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

enter image description here

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

enter image description here

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

Ответ 2

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

Шаги:

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

Ура!

Ответ 3

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

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

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

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

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

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

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

  • удаляет все профили подготовки
  • удаляет DerivedData​​li >

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

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

Шаблон script:

    #!/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