Подтвердить что ты не робот

Расширения iOS с несколькими целями

В iOS 8, когда мы создаем новое расширение, мы должны решить, к какой цели он привязан. Расширение будет иметь тот же самый префикс идентификатора пакета в качестве цели.

  • Есть ли способ изменить цель после?
  • Если мой проект содержит 2 (или более) цели (например, один для отладки/симулятора, один для производства/устройства), какой лучший способ работы с расширениями? Нужно ли мне создавать другое расширение и дублировать код (очень надоедливо хранить один и тот же код для обеих целей)?
4b9b3361

Ответ 1

Чтобы разделить один виджет между множеством целей, нужно добавить только приложение widget.appex до Embedded Binaries для каждой родительской цели в General вкладке конфигурации

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

Затем вы получите Embed App Extensions область в Build Phases автоматически

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

Ответ 2

Похоже, вы должны иметь возможность просто дублировать цель расширения с помощью своего собственного Info.plist, но не более того.

Однако, когда вы создаете расширение, Xcode добавляет "Embed App Extensions" к этапам сборки приложения, как показано ниже, и пока нет пользовательского интерфейса.

enter image description here

Тем не менее, вы можете создать расширение для второй цели, а затем удалить все файлы, кроме .plist, и исправить то, что нужно исправить. Здесь шаг за шагом:

  • Создайте "Расширение 1" для "Целевой 1"
  • Создайте "Расширение 2" для "Целевой 2"
  • Удалите все файлы, созданные для "Расширение 2" , за исключением его Info.plist
  • Сделайте "Фазы сборки" для "Расширение 2" та же, что и фазы сборки для "Расширение 1". Обычно это добавление необходимых файлов .m в фазу "Компиляция источников" и ресурсы на фазу "Копирование запаса"

Ответ 3

Я создал Run Script для поддержки этого требования

#!/bin/sh
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${SRCROOT}/ImagePush/Info.plist"

buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion" "${SRCROOT}/ImagePush/Info.plist"

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.ImagePush" "${SRCROOT}/ImagePush/Info.plist"

ImagePush - это мое расширение

добавьте целевой объект, который вам нужен, и добавьте, убедитесь, что этот Script запускается до вашего расширения в Build Phases, тогда вам просто нужно выполнить действие сборки дважды (PS: в первый раз, когда он не удастся, попытается улучшить), и он будет поддерживать несколько целей

Ответ 4

Вам нужно создать несколько расширений для каждого ID, но вы можете создать динамическую структуру и просто связать ее с каждым расширением. Тогда вам не нужно будет дублировать код.