проблема интеграции модуля ObjC в среду Swift - PullRequest
0 голосов
/ 08 февраля 2019

настройка

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

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

теперь я былчтобы улучшить мой фреймворк, мы предоставили представления с некоторыми анимациями и должны были использовать .я использую версия 1.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

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

в заметках о выпуске упоминается use_modular_headers!, давайте попробуем:

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

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

./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-ios cocoapod таким образом, чтобы он полностью содержался в MY-Framework, поэтомукогда я делюсь им с клиентом, они могут просто вставить его в свое приложение и не беспокоиться о каких-либо зависимостях?

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

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

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

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

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

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

0 голосов
/ 16 февраля 2019

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

Импорт Objective-C в Swift

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

#import <Lottie/Lottie.h>

0 голосов
/ 12 февраля 2019

Вам нужно вручную скопировать Lottie-ios Framework в свою частную платформу CocoaPod (которая является My-Framework)

...