проблема с интеграцией модуля ObjC в структуру Swift

установка

У меня есть приложение для iOS MY-App, в котором используется моя собственная структура MY-Framework. Оба написаны на swift. Приложение обрабатывает только аутентификацию пользователя и передает токен доступа MY-Framework. Затем MY-Framework обрабатывает весь ScreenFlow и бизнес-логику. Цель состоит в том, чтобы распространить MY-Framework среди клиентов для использования в своих приложениях.

минимальный образец настройки проекта, демонстрирующий эту проблему, доступен здесь: https://github.com/vprimachenko/lottie-pod-problem-sample

теперь я должен был улучшить представление, предоставленное моей структурой, с некоторыми анимациями, и должен был использовать Лотти за это. я использую cocoapods version1.6.0-pre

Наивная попытка

я создал Podfile со следующим содержанием

target 'fw' do
  pod 'lottie-ios'
end

что привело к ошибке компиляции в фреймворке

./fw/fw/File.swift:4:8: error: no such module 'Lottie'
import Lottie
       ^

рамки

после некоторого поиска в Google я изменил свой Podfile на:

target 'fw' do
  use_frameworks!
  pod 'lottie-ios'
end

результат: сбой во время выполнения

dyld: Library not loaded: @rpath/Lottie.framework/Lottie
  Referenced from: .../Build/Products/Debug-iphonesimulator/fw.framework/fw
  Reason: image not found

может модульные заголовки?

cocoapods примечания к выпуску упоминают use_modular_headers!, давайте попробуем это:

target 'fw' do
 use_modular_headers!
 pod 'lottie-ios'
end

результат: ошибка компилятора в содержащем приложении

./app/app/ViewController.swift:3:8: error: missing required module 'Lottie'
import fw
      ^

Возможно оба?

target 'fw' do
 use_modular_headers!
 use_frameworks!
 pod 'lottie-ios'
end

результат: сбой во время выполнения

dyld: Library not loaded: @rpath/Lottie.framework/Lottie
 Referenced from: .../Build/Products/Debug-iphonesimulator/fw.framework/fw
 Reason: image not found

взлом

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

Мой вопрос

как мне правильно интегрировать lottie-ioscocopod таким образом, чтобы он полностью содержался в MY-Framework, поэтому, когда я делюсь им с клиентом, они могут просто добавить его в свое приложение и не беспокоиться о каких-либо зависимостях?

К сожалению, выпуск его как частного модуля с зависимостями невозможен.


person Valerij    schedule 08.02.2019    source источник
comment
Это возможно, если вы можете сделать свою MY-Framework частной капсулой. Таким образом, Cocoapods будет управлять всем, и все должно работать правильно (на самом деле я пытался установить Lottie в своем фреймворке, и у меня сработало Cocoapods).   -  person qtngo    schedule 12.02.2019
comment
Валерий, пробовали ли вы добавить фреймворк Lottie на шаг Embed Frameworks на этапах сборки? И еще: какую версию Cocoapods вы сейчас используете?   -  person edopelawi    schedule 12.02.2019
comment
@qtngo думал об этом, но это не вариант в моей текущей схеме распространения. @edopelawi пробовал и с 1.5.0, и с 1.6.0-pre пробовал, приложение все равно вылетало   -  person Valerij    schedule 13.02.2019
comment
Что произойдет, если вы сделаете pod 'lottie-ios' в подфайле вашего фреймворка? Вы сказали, что у вас проблема с ошибкой компоновщика, что это за ошибка?   -  person qtngo    schedule 13.02.2019
comment
Простая структура @qtngo не найдена, исчезла после обновления Cocopods до 1.6.0. на самом деле я воспроизвел настройку в крошечном проекте, возможно, я перефразирую вопрос и свяжу этот пример, дайте мне несколько часов :)   -  person Valerij    schedule 13.02.2019
comment
вы установили pod? открыть проект из xcworkspace?   -  person antonio yaphiar    schedule 15.02.2019


Ответы (3)


Обычный способ использования кода objective-c в swift — это использование связующих заголовков, взгляните на это:

Импорт Objective-C в Swift

вам нужно создать соединительный заголовок и добавить его в свой проект, а затем внутри созданного вами файла .h просто добавьте:

#import <Lottie/Lottie.h>

person MohyG    schedule 16.02.2019

как мне правильно интегрировать lottie-ioscocopod таким образом, чтобы он полностью содержался в MY-Framework, поэтому, когда я делюсь им с клиентом, они могут просто поместить его в свое приложение и не беспокоиться о каких-либо зависимостях?

Я не думаю, что ты хочешь этого делать. Что делать, если приложение вашего клиента уже использует платформу Lottie, возможно, версию, отличную от используемой в MY-Framework?

Типичный способ решить эту проблему — потребовать, чтобы ваш клиент использовал Lottie в качестве зависимости. Если вы используете кокоапод, ваши клиенты этого не заметят, и это обычная практика. Вы указываете свою зависимость, используя spec.dependency на странице https://guides.cocoapods.org/syntax/podspec.html)

Если вы действительно в отчаянии, вы можете скопировать весь исходный код Lottie в MY-framework и убедиться, что они определены в своем собственном модуле, чтобы избежать конфликтов.

person Sébastien A    schedule 13.02.2019

Вам необходимо вручную скопировать Lottie-ios Framework в вашу частную структуру CocoaPod (которая называется My-Framework).

person swift2geek    schedule 12.02.2019
comment
ручной шаг кажется неправильным, так как я думаю, что что-то не так с самим модулем lottie-ios, или я пропустил некоторые настройки при добавлении его в свой Podfile - person Valerij; 13.02.2019