将 ObjC pod 集成到 Swift 框架中时出现问题

problem integrating ObjC pod into a Swift framework

设置

我有一个 iOS 应用程序 MY-App,它使用我自己的框架 MY-Framework。两者都写在swift中。该应用程序仅处理用户身份验证并将访问令牌传递给 MY-FrameworkMY-Framework 然后处理整个 ScreenFlow 和业务逻辑。目标是将 MY-Framework 分发给客户,以便在他们的应用程序中使用它。

此处提供了出现此问题的项目设置的最小示例:https://github.com/vprimachenko/lottie-pod-problem-sample

现在我要增强我的框架,提供带有一些动画的视图,并使用 for it. i am using 版本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
       ^

框架

谷歌搜索后,我将 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

模块化 header 可能吗?

发行说明提到 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 提供自己的 header 来解决问题,但这感觉更像是 duct-tape 而不是正确的解决方案。稍后我仍将 post 作为附加答案。

我的问题

我如何正确使用集成 lottie-ios cocoapod,使其完全包含在 MY-Framework 中,这样当我将它分享给客户时,他们可以将它放入他们的应用程序中,然后不用担心任何依赖关系?

遗憾的是,将其作为具有依赖项的私有 pod 发布不是一种选择。

您需要手动将 Lottie-ios Framework 复制到您的私有 CocoaPod 框架(即 My-Framework)

how do i use properly integrate lottie-ios cocoapod in such a way that it is completely contained in MY-Framework, so when i share it to a customer they can just drop it into their App and not worry about any dependencies?

我认为你不想这样做。如果您的客户的应用程序已经使用 Lottie 框​​架,可能与 MY-Framework 中使用的版本不同怎么办?

解决这个问题的典型方法是要求您的客户端使用 Lottie 作为依赖项。如果您使用的是 cocoapod,您的客户不会真正注意到,这是常见的做法。您在 https://guides.cocoapods.org/syntax/podspec.html)

处使用 spec.dependency 指定依赖项

实在不行的话,可以将Lottie的所有源码复制到MY-framework中,并确保在自己的模块中定义,避免冲突。

swift 中使用 objective-c 代码的常见方法是使用桥接 headers,看看这个:

Importing Objective-C into Swift

您需要创建一个桥接 header 并将其添加到您的项目中,然后在您创建的 .h 文件中添加:

#import <Lottie/Lottie.h>