将ObjC pod集成到Swift框架中的问题

时间:2019-02-08 13:24:04

标签: ios swift xcode cocoapods lottie

设置

我有一个iOS应用MY-App,它使用我自己的框架MY-Framework。两者均以swift编写。该应用仅处理用户身份验证,并将访问令牌传递给MY-FrameworkMY-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
       ^

框架

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

结果:包含的应用中的编译器错误

./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中的方式,因此当我与客户共享时,他们可以将其放到他们的App中,不必担心关于任何依赖项?

不幸的是,将其作为具有依赖项的私有pod释放是不可能的。

3 个答案:

答案 0 :(得分:2)

objective-c中使用swift代码的常见方法是使用桥接标头,请看一下:

Importing Objective-C into Swift

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

#import <Lottie/Lottie.h>

答案 1 :(得分:1)

  

我该如何正确地整合lottie-ios cocoapod,   它完全包含在“我的框架”中,因此当我将其共享给   客户,他们可以将其放到他们的应用中,而不必担心   依赖吗?

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

解决此问题的一种典型方法是要求您的客户使用Lottie作为依赖项。如果您使用的是椰壳足,您的客户不会真正注意到它,这是常见的做法。您可以在this answer使用spec.dependency来指定您的依赖项

如果真是绝望,您可以将Lottie的所有源复制到MY框架中,并确保它们在自己的模块中定义以避免冲突。

答案 2 :(得分:0)

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