将 ObjC pod 集成到 Swift 框架中时出现问题
problem integrating ObjC pod into a Swift framework
设置
我有一个 iOS 应用程序 MY-App
,它使用我自己的框架 MY-Framework
。两者都写在swift
中。该应用程序仅处理用户身份验证并将访问令牌传递给 MY-Framework
。 MY-Framework
然后处理整个 ScreenFlow 和业务逻辑。目标是将 MY-Framework
分发给客户,以便在他们的应用程序中使用它。
此处提供了出现此问题的项目设置的最小示例:https://github.com/vprimachenko/lottie-pod-problem-sample
现在我要增强我的框架,提供带有一些动画的视图,并使用 lottie for it. i am using cocoapods 版本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 可能吗?
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
提供自己的 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>
设置
我有一个 iOS 应用程序 MY-App
,它使用我自己的框架 MY-Framework
。两者都写在swift
中。该应用程序仅处理用户身份验证并将访问令牌传递给 MY-Framework
。 MY-Framework
然后处理整个 ScreenFlow 和业务逻辑。目标是将 MY-Framework
分发给客户,以便在他们的应用程序中使用它。
此处提供了出现此问题的项目设置的最小示例:https://github.com/vprimachenko/lottie-pod-problem-sample
现在我要增强我的框架,提供带有一些动画的视图,并使用 lottie for it. i am using cocoapods 版本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 可能吗?
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
提供自己的 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>