Совместное использование кода между исходным приложением iOS и расширением приложения

Совместное использование класса между приложением iOS и приложением-расширением

Я хочу использовать пользовательский класс как в своем приложении, так и в приложении-расширении. Если у меня просто есть класс в основной папке приложения, расширение его не обнаружит. Я попытался сделать его копию и поместить в папку расширения, но я, конечно, получаю ошибку invalid redeclaration of [my class]. Какое лучшее решение для этого? Это всего лишь один класс, а не несколько ресурсов.


person Ruben Martinez Jr.    schedule 01.03.2015    source источник


Ответы (4)


Ничего не должно копироваться. Просто добавьте необходимые файлы для компиляции исходников для вашего расширения:

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

person Avt    schedule 01.03.2015
comment
Благодарю вас! Это выглядит великолепно! Как это соотносится с созданием Framework? - person Ruben Martinez Jr.; 01.03.2015
comment
@РубенМартинесДжр. Создание фреймворка не приведет к созданию вашего класса для каждой цели отдельно. но сделает это один раз и свяжется с каждой целью. - person Filip Radelic; 01.03.2015
comment
@РубенМартинесДжр. Никоим образом не. Вы просто поделитесь кодом между приложением и расширением. Они будут составлены отдельно. Так, например, вы можете использовать #ifdef SOME_EXTENSION_FLAG ... #endif, чтобы отключить некоторые части кода во время компиляции для приложения или расширения. - person Avt; 01.03.2015
comment
Недостатком этого решения и фреймворка является то, что фактически скомпилированный класс будет иметь расширение как app, так и appex, что увеличивает общий размер файла IPA из-за дублирования. С динамической платформой вы не сможете поддерживать iOS7, но если вы создаете продукт только для iOS8, это лучший подход, поскольку и приложение, и расширение будут взаимодействовать с одной и той же платформой. - person Edgar; 10.04.2015
comment
Кажется, что если я включаю ClassA.m в исходники компиляции, а ClassA имеет зависимости от ClassB и ClassC, мне также нужно включить ClassB.m и ClassC.m. Это может сойти с ума, если ClassB и ClassC, в свою очередь, имеют зависимости и так далее. Кто-нибудь, у кого есть решение этой проблемы или кто может сказать мне, если я что-то упустил? Спасибо! - person Viktor Nilsson; 21.07.2015
comment
Не забудьте создать отдельный файл заголовка предварительной компиляции для расширения, если вы используете его в своем приложении. - person carloshwa; 25.10.2015
comment
Спасибо за разъяснения. Действительно полезно :) - person Suresh; 04.12.2015

Просто убедитесь, что файлы, которыми вы хотите поделиться, отмечены галочкой в ​​разделе Target Membership.

Выберите свой файл, откройте панель инструментов справа и отметьте соответствующую цель в разделе Целевое членство.

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

person Duc    schedule 10.04.2015
comment
Просто для того, чтобы дать немного больше информации, делая это таким образом, вы также автоматически добавляете класс в Compile Sources под Build Phases. - person Burak; 28.07.2016
comment
это то, чего мне не хватало, это действительно просто. - person Pandey_Laxman; 01.11.2016
comment
Да, но это более прямолинейно по сравнению с добавлением в CompileSources. - person Michał Ziobro; 20.03.2018

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

См. раздел Использование Embedded Framework для совместного использования кода https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

person Praveen Matanam    schedule 24.10.2016

Расширение приложения (виджет, сегодня)

App Extension — из iOS v8 — это packaged bundle, который использует другой процесс, чем Containing App, и может взаимодействовать с Host App. Он имеет расширение файла .appex и находится в папке PlugIns. Что-то похожее на CXTests[О программе]

Пакет приложений

SpeedWidgetExtension.appex — упакованный пакет расширения приложения

  • Делитесь данными — используйте App Group[О программе]
  • Share code
    • Target Membership - самый простой способ или для версии до iOS v8, которая позволяет добавлять файлы в каждую цель. Это увеличивает размер пакета, потому что этот файл будет дублироваться для каждой цели.

    • Framework - модуль группировки/повторного использования кода

      • Embedded framework aka Dynamic framework - the most appropriate way to share common code base. Please note that for using Embedded framework you should embed it only in Containing App (and don't add this framework in App Extension. If you include framework and for App Extension it will have the same framework in App Extension bundle - framework will be duplicated). It is possible because of @prath[About]
      //App Extension
      LD_RUNPATH_SEARCH_PATHS = @executable_path/../../Frameworks
      //It means that App Extension can uses Dynamic framework from Containing app
      
      • Static Framework - связать код с исполняемым бинарником. Вы можете связать библиотеку только для Containing App

[расширения iOS]
[Словарь]

person yoAlex5    schedule 07.03.2021