Встраивайте внешний фреймворк в самодельный приватный фреймворк на Swift

Я создал фреймворк с использованием Xcode 6 и Swift, и моя фреймворк использует SwiftyJSON в качестве зависимости, добавленную через Карфаген. Я заархивировал свой фреймворк и создал сборку как для симулятора, так и для устройств iOS, используя lipo, и при попытке использовать мой фреймворк в пустом приложении я получаю сбой во время выполнения:

dyld: Library not loaded: @rpath/SwiftyJSON.framework/SwiftyJSON
Referenced from: /Users/hd/Library/Developer/CoreSimulator/Devices/324FD1CD-4A06-459B-AE6D-318197B5697E/data/Containers/Bundle/Application/555871BB-7AA1-4AED-90CE-EE0A628A794F/CollaborativeTodo.app/Frameworks/XXXXX.framework/XXXXX
Reason: no suitable image found.  Did find:
/Users/hd/Library/Developer/CoreSimulator/Devices/324FD1CD-4A06-459B-AE6D-318197B5697E/data/Containers/Bundle/Application/555871BB-7AA1-4AED-90CE-EE0A628A794F/CollaborativeTodo.app/Frameworks/SwiftyJSON.framework/SwiftyJSON: no matching architecture in universal wrapper

Вот как выглядит мое древообразование - имя моего фреймворка намеренно размыто:

Project arborescence

Вкладка Общие:

Общие

Этапы сборки: Этапы сборки

Это сработает, если я включу SwiftyJSON с использованием Carthage в свой проект, но я не хочу, чтобы пользователя заставляли включать сторонние библиотеки. Как встроить SwiftyJSON в мою структуру и указать Xcode использовать встроенную версию во время выполнения вместо того, чтобы пытаться найти структуру в проекте?


person sweepy_    schedule 29.06.2015    source источник


Ответы (1)


Вы не можете избежать прямого включения SwiftlyJSON в приложение. Проще говоря, вам не следует не избегать включения в приложение SwiftlyJSON. Если в приложении уже есть SwiftlyJSON по какой-либо другой причине, вы причините им огромную боль из-за дублирования символов. В зависимости от того, как именно они что-то делают, они могут не получать ошибок, а только неопределенное поведение, что еще хуже. Автоматическое включение - это функция, которая очень хороша до тех пор, пока она полностью не взорвется, и никто не может понять, как ее исправить. Если вы выполните поиск «повторяющиеся символы iOS» здесь, в StackOverflow, я считаю, что примерно половина из них связана с попыткой фреймворка автоматически включить вспомогательный фреймворк (часто SBJSON).

Задокументируйте, на что вы полагаетесь, и включите это в свой Cartfile как вложенную зависимость. Карфаген построит его для них (им все равно нужно будет перетащить его в свой проект).

person Rob Napier    schedule 29.06.2015
comment
Я уже планировал использовать Carthage для его распространения и сделать SwiftyJSON зависимостью, но мне было интересно, есть ли самое умное решение. Большое спасибо! - person sweepy_; 29.06.2015
comment
Любые обновления по этой проблеме .. Моя настраиваемая динамическая структура зависит от внешних библиотек. Хост-приложение, использующее мою структуру, не обнаруживает этих зависимостей. Получение ошибки компоновщика для внешних фреймворков - person Anil Varghese; 08.12.2015
comment
@AnilVarghese Я не совсем понимаю, что вы имеете в виду под обновлением. Требование не изменилось, как и причины требования. Приложение-потребитель должно связать все зависимости вместе. Настроено ли хост-приложение для связывания всех фреймворков (включая ваши зависимости)? - person Rob Napier; 08.12.2015
comment
@RobNapier У нас есть проект динамической структуры для совместного использования общего кода между нашими многочисленными приложениями (потребителями), назовем его SDK. Проект SDK был настроен для связи с несколькими внешними фреймворками, такими как Facebook, OpenTok ... и этот проект добавлен в рабочую область, которая разделяет потребительский проект. SDK успешно строится. Теперь мне нужен доступ к внешней структуре, которая связана через мой SDK из потребительского приложения. то пользовательское приложение выдает ошибку компоновщика. Как я могу сказать компоновщику, что фреймворк, на который он ссылается, находится в SDK. Я не хочу хранить две копии одной и той же работы. Спасибо - person Anil Varghese; 08.12.2015
comment
@AnilVarghese сторонние фреймворки не должны быть связаны через мой SDK. Они должны быть напрямую связаны приложением. Приложение должно явно указывать Facebook, например, на этапе ссылки. Это так настроено? - person Rob Napier; 08.12.2015
comment
Если я так и поступлю, когда появится новая версия фреймворка facebook, мне придется пойти и обновить все свои проекты. Искал способ избавиться от этого, если можно? - person Anil Varghese; 08.12.2015
comment
Нет. Конечное приложение должно делать активный выбор связанных фреймворков. Если это сработало, в противном случае вы получите коллизии версий фреймворка. Подумайте, есть ли Facebook и в вашем фреймворке, и в другом фреймворке. Какой из них нужно связать? Только приложение может выбирать. Вы не можете выбирать за них. Это то, что менеджеры зависимостей (Carthage, CocoaPods, новый Swift от Apple) пытаются упростить, но в конечном итоге выбор должен быть сделан компоновщиком верхнего уровня. - person Rob Napier; 08.12.2015