Расширения iOS с несколькими целями
В iOS 8, когда мы создаем новое расширение, мы должны решить, к какой цели он привязан. Расширение будет иметь тот же самый префикс идентификатора пакета в качестве цели.
- Есть ли способ изменить цель после?
- Если мой проект содержит 2 (или более) цели (например, один для отладки/симулятора, один для производства/устройства), какой лучший способ работы с расширениями? Нужно ли мне создавать другое расширение и дублировать код (очень надоедливо хранить один и тот же код для обеих целей)?
Ответы
Ответ 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, но вы можете создать динамическую структуру и просто связать ее с каждым расширением. Тогда вам не нужно будет дублировать код.