San*_*ari 2 ios cocoapods swift3 embedded-framework
我正在尝试创建一个动态框架来在我的应用程序的各种扩展之间共享代码。
问题 :
这是我的项目结构。
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
Run Code Online (Sandbox Code Playgroud)
在构建框架时,当我将其作为嵌入式二进制文件拖到我的主项目中时,我收到错误。
dyld:未加载库:.framework/Alamofire 引用自:/Users/sandeep/Library/Developer/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework 原因:未找到图像
我尝试过的解决方案:
有效的解决方案:
我意识到 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
Run Code Online (Sandbox Code Playgroud)
如您所见,我将shared_pods添加到主应用程序和我的框架项目及其各自的目标中。现在一切都很顺利。我既不必将 pods_framework 设置为可选,也不必修改 MyFramework 的构建设置。
问题:
将共享存储库添加到所有想要使用我的框架的项目及其目标看起来没什么多余的。有没有更好的方法可以指定 Myframework.framework 来读取其所有依赖项,而不是使用它从项目中读取?
我在 CocoaPods Git 存储库上提出了同样的问题。但因为这本质上不是一个问题,所以他们可能不会恢复原样。因此,将其作为问题发布在这里。问题链接: https: //github.com/CocoaPods/CocoaPods/issues/6901(如果有帮助)。
通过为我的自定义框架创建一个可可豆荚并使用可可豆荚依赖性解决了这个问题。
第 1 步:清理主/父项目
pod deintegrate(取消集成已添加到pod init第 2 步:为我的框架创建一个 Pod
pod spec create MyFramework这将在 MyFramework 的根文件夹中创建一个名为 MyFramework.podspec 的文件。使用任何编辑器工具打开 MyFramework.podspec 并按照教程https://www.raywenderlich.com/126365/ios-frameworks-tutorial中所示进行更新
本教程中没有的最重要的步骤是如何添加我们的框架需要构建的 cocoa pod 依赖项。事实证明这是最简单的部分。就我而言,我需要SwiftyJSON,
Alamofire所以在 .podspec 文件中我添加了,
s.dependency 'Alamofire'
s.dependency 'SwiftyJSON'
步骤3:
Podfile 并更新它,如下所示。Run Code Online (Sandbox Code Playgroud)target 'CocoaPodsProject' do use_frameworks! pod 'TestFramework', :path => 'TestFramework/' end
它所做的是,它告诉主项目添加 TestFramework 作为依赖项,并将 TestFramework 安装在主项目的 Framework 文件夹中。因为 TestFramework 本身依赖于Alamofire&,SwiftyJSON所以当您运行时,pod install它不仅会安装Alamofire,还会安装SwiftyJSON并将其添加到TestFramework'sFramework 文件夹。
就这样。现在您的 TestFramework 可以访问Alamofire并且SwiftyJSONMain/Patent 项目可以访问TestFramework
如果您现在想更新 TestFramework 代码,直到完成开发为止,将其作为子项目添加到主项目中(这是必要的,因为如果您打开 TestFramework.xcproj,您将看不到 Alamofire/Swifty JSON。您必须打开父项目的工作区本身因此这个解决方案)。一旦您完成开发,如果您决定删除 TestFramework 作为子项目,您就可以这样做:)
最后,如果您决定向应用程序添加其他扩展,假设您添加 Today 扩展,您所要做的就是修改您的 Podfile,如下所示。
target 'CocoaPodsProject' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
target 'CocoapodsToday' do
use_frameworks!
pod 'TestFramework', :path => 'TestFramework/'
end
Run Code Online (Sandbox Code Playgroud)
呜呼:) 现在将您的框架添加到您想要的任意数量的扩展中:) 希望它有所帮助。