我正在尝试创建一个动态框架以在我的应用程序的各种扩展之间共享代码。
问题:
这是我的项目结构。
MyFrameworks 是我的应用程序的网络层,它本质上使用 Alamofire。因此,我的 pod 文件结构如下。
platform :ios, '9.0'
use_frameworks!
workspace 'CocoaPodsProjectworkspace'
def shared_pods
pod 'Alamofire'
pod 'SwiftyJSON'
end
target 'CocoaPodsProject' do
project 'CocoaPodsProject.xcodeproj'
# Pods for CocoaPodsProject
end
target 'MyFramework' do
project 'MyFramework/MyFramework.xcodeproj'
shared_pods
end
target 'CocoaPodsProjectTests' do
end
target 'CocoaPodsProjectUITests' do
end
在构建框架时,当我将它作为嵌入式二进制文件拖到我的主项目时出现错误。
dyld: Library not loaded: .framework/Alamofire Referenced from: /Users/sandeep/Library/Developer/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework Reason: image not found
我尝试过的解决方案:
- 在链接中将 pods_frameworks.framework 声明为可选 二进制文件。
- 尝试更改框架动态库的RunPath搜索路径
- 安装名称运行 pod deintegrate 并再次运行 pod install。
- 删除派生数据和重新链接框架都会导致相同的结果 问题。
有效的解决方案:
我意识到 MyFramework.framework 试图在错误的目录中找到 Alamofire.framework 并且它总是尝试使用框架搜索相对于项目/目标的内容。所以我能找到的最简单的解决方案是如下修改 pod 文件。
platform :ios, '9.0'
use_frameworks!
workspace 'CocoaPodsProjectworkspace'
def shared_pods
pod 'Alamofire'
pod 'SwiftyJSON'
end
target 'CocoaPodsProject' do
project 'CocoaPodsProject.xcodeproj'
shared_pods
# Pods for CocoaPodsProject
end
target 'MyFramework' do
project 'MyFramework/MyFramework.xcodeproj'
shared_pods
end
target 'CocoaPodsProjectTests' do
end
target 'CocoaPodsProjectUITests' do
end
如您所见,我将 shared_pods 添加到主应用程序和我的框架项目及其各自的目标中。现在一切顺利。我既不必将 pods_framework 设为可选,也不必修改 MyFramework 的build设置。
问题:
将共享存储库添加到所有想要使用我的框架的项目及其目标看起来有点多余。有没有更好的方法可以指定 Myframework.framework 来读取它的所有依赖项,而不是从使用它的项目中读取?
我在 CocoaPods Git 存储库上提出了同样的问题。但因为这不是天生的问题,他们可能不会退缩。因此将其作为问题发布在这里。问题链接:https://github.com/CocoaPods/CocoaPods/issues/6901如果有帮助。
最佳答案
通过为我的自定义框架创建一个 cocoa pod 并使用 cocoa pods 依赖项解决了这个问题。
第 1 步:清理主/父项目
- 从项目中删除了 MyFramework(添加为子 项目)并删除在嵌入式项目库中添加的 MyFramework.framework 常规设置。
- 运行
pod deintegrate
(去集成已经添加到
的pod 项目) - 现在项目是干净的并且没有添加任何 pod
通过运行
pod init
初始化 pod
第 2 步:为我的框架创建一个 Pod
- 使用 cd 命令导航到 MyFramework 项目,进入后
MyFramework 的根文件夹运行
pod spec create MyFramework
这将创建一个名为 MyFramework.podspec 的文件 MyFramework 的根文件夹。使用任何一个打开 MyFramework.podspec 编辑器工具并按照教程 https://www.raywenderlich.com/126365/ios-frameworks-tutorial 中所示更新它
本教程中没有的最重要的步骤是如何添加 我们的框架需要构建的 cocoa pod 依赖项。原来 那是最简单的部分。在我的例子中,我需要
SwiftyJSON
和Alamofire
所以在我添加的 .podspec 文件中,
s.dependency 'Alamofire'
s.dependency 'SwiftyJSON'
第 3 步:
- 现在打开 Main/Parent 项目
Podfile
并如图所示更新它 下面。
target 'CocoaPodsProject' do use_frameworks! pod 'TestFramework', :path => 'TestFramework/' end
它所做的是,它告诉主项目添加 TestFramework 作为依赖项并将 TestFramework 安装在主项目的 Framework 文件夹中。因为 TestFramework 本身依赖于 Alamofire
& SwiftyJSON
当你运行 pod install
它不仅会安装 Alamofire
而且还会安装 SwiftyJSON
并将其添加到 TestFramework 的
Framework 文件夹中。
就是这样。现在您的 TestFramework 可以访问 Alamofire
和 SwiftyJSON
并且 Main/Patent 项目可以访问 TestFramework
如果你现在想更新 TestFramework 代码,直到你完成开发,将它作为子项目添加到主项目(这是必要的,因为如果你打开 TestFramework.xcproj,你将看不到 Alamofire/Swifty JSON。你必须打开 Parent项目的工作区本身因此这个解决方案)。完成开发后,如果您决定删除 TestFramework 作为子项目,您可以这样做:)
最后,如果您决定向应用添加额外的扩展,假设您添加了 Today 扩展,您所要做的就是如下修改您的 Podfile。
target 'CocoaPodsProject' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
target 'CocoapodsToday' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
Woo hooo :) 现在将您的框架添加到您想要的任意多个扩展中 :) 希望对您有所帮助。
关于ios - 这是使用嵌入式 cocoa pod 创建动态/嵌入式框架的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319504/